[luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结

时间:2022-09-26 07:34:09

t1-快速多项式变换(FPT)

题解

看到这个\(f(x)=a_0+a_1x+a_2x^2+a_3x^3+ \cdots + a_nx^n\)式子,我们会想到我们学习进制转换中学到的,那么我们就只需要\(m\)转换成\(n\)进制就可以了。

ac代码

#include <bits/stdc++.h>
using namespace std;
long long n, m, a[1005];
int cnt;
int main() {
    cin >> n >> m;
    while (m > 0) {
        a[ ++ cnt] = m % n;
        m /= n;
    }
    printf("%d\n", cnt);
    for (int i = 1; i <= cnt; i ++) printf("%lld ", a[i]);
    return 0;
}

t2-加特林轮盘赌

题解

我们假设f[2][1]表示最后一个人最终幸存的概率,那么f[2][2]表示第二个最终幸存的概率。
\[f[2][1]=p0*0+(1-p0)*f[2][2]\]
作为一个二元一次方程,我们还需要一个等式接触他们不难想到两个概率的和一定是\(1\):
\[f[2][1]+f[2][2]=1\]
以此类推到k个人,其中两个式子就是和之前一样的。
\[f[n][1]=(1-p0)*f[n][n]\]
\[f[n][1]+f[n][2]+...f[n][n]=1\]
当前我们在崩第一个玩家时,那么排在k的玩家会怎么样?
概率\(1-p0\):如果第一个玩家没死,那么就相当于是换了一个起点
\[f[n][k]->f[n][k-1]\]
概率\(1-p0\):每次,那么每一个人还是往前走了一步,只不过是人数少了一个:
\[f[n][k]->f[n-1][k-1]\]
所以我们可以通过以下等式退出n个等式
\[f[n][k]=p0*f[n][k-1]+(1-p0)*f[n-1][k-1]\]
那么最后只有一个幸存者,那么所以\(\sum^n_{k=1} f[n][k]=1\),接触这个方程,手动消元满分,还要特判以下,当\(p0\)为0时,答案是\(0\)。

ac代码

#include <bits/stdc++.h>
#define db double
#define N 100005
using namespace std;
db f[2][N];
int n, k;
db p0;
int main() {
    cin>> p0>> n>> k;
    if (p0 == 0){
        printf("%.10lf\n",0.0);
        return 0;
    }
    f[1][1] = 1;
    for (int i = 2; i <= n; i ++) {
        db rate = 1, tmp = 0;
        for (int j = 0; j <= i - 2; j ++) {
            tmp += rate * f[(i - 1) % 2][i - j - 1];
            rate *= (1 - p0);
        }
        rate *= (1 - p0);
        tmp *= p0;
        tmp /= (1 - rate);
        f[i % 2][1] = (1 - p0) * tmp;
        for (int j = 2; j <= i; j ++)
            f[i % 2][j] = (1 - p0) * f[i % 2][j - 1] + p0 * f[(i - 1) % 2][j - 1];
        f[i % 2][i] = tmp;
    }
    printf("%.10lf\n",f[n % 2][k]);
    return 0;
}

t3-东京夏日相会

题解

我们将一个圆上的点拆成精度差在与题目中规定的0.01。在官方题解中说明:可以证明当d≤acos(1−0.005/r) 时所得的答案与标准答案差距不超过 0.01 .证明是初中基础数学请各位自己推一下。
那么完成拆点之后就是最小点覆盖的模板了。

ac代码

#include <bits/stdc++.h>
#define N 20000005
#define db double
#define PI acos(-1)
using namespace std;
struct Point {
    db x, y;
}a[N], o;
const db eps = 1e-4;
int tot, n;
db ri;
void create_point(db x, db y, db r) {
    if (r == 0) a[++ tot] = (Point){x, y};
    else {
        db delta = max(360 * acos(1 - 0.004 / r) / PI, 1.0);
        for (int i = 0; i < 360; i += delta) {
            db alpha = i * PI / 180;
            a[++ tot] = (Point){x + r * cos(alpha), y + r * sin(alpha)};
        }
    }
}
db calc(Point a, Point b) {
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
void three_point(Point p1, Point p2, Point p3) {
    db a = p2.y - p1.y, b = p3.y - p1.y, c = p2.x - p1.x, d = p3.x - p1.x, e = p2.x * p2.x + p2.y * p2.y - p1.x * p1.x - p1.y * p1.y, f = p3.x * p3.x + p3.y * p3.y - p1.x * p1.x - p1.y * p1.y ;
    o.x = (a * f - b * e) / (2 * a * d - 2 * b * c);
    o.y = (d * e - c * f) / (2 * a * d - 2 * b * c);
    ri = calc(o, p1);
}
int main() {
    scanf("%d", &n);
    tot = 0;
    for (int i = 1; i <= n; i ++) {
        db x, y, r;
        scanf("%lf%lf%lf", &x, &y, &r);
        create_point(x, y, r);
    }
    random_shuffle(a + 1, a + 1 + tot);
    o = a[1]; ri = 0;
    for (int i = 2; i <= tot; i ++) {
        if (calc(a[i], o) > ri + eps) {
            o = a[i]; ri = 0;
            for (int j = 1; j <= i - 1; j ++) {
                if (calc(o, a[j]) > ri + eps) {
                    o.x = (a[i].x + a[j].x) / 2;
                    o.y = (a[i].y + a[j].y) / 2;
                    ri = calc(o, a[j]);
                    for (int k = 1; k <= j - 1; k ++) {
                        if (calc(o, a[k])>ri + eps) three_point(a[i], a[j], a[k]);
                    }
                }
            }
        }
    }
    printf("%.2lf %.2lf %.2lf\n", o.x, o.y, ri);
    return 0;
}

t4-第二代图灵机

解法

我不会,咕咕掉了。

官方ac代码

//T4 std By Sinon
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <set>
#include <bitset>
#include <cstdlib>
#define IT set<node>::iterator
using namespace std;
const int MAXM = 150, MAXN = 100050;

void read(int &x){
    char ch;
    while(ch = getchar(), ch < '!'); x = ch - 48;
    while(ch = getchar(), ch > '!') x = (x << 3) + (x << 1) + ch - 48;
}

void write(int x) {if(x > 9) write(x / 10); putchar(x % 10 + 48);}

struct node {
    int l, r;
    mutable int v;
    node(int L, int R = -1, int V = 0) : l(L), r(R), v(V) {}
    bool operator < (const node &o) const {
        return l < o.l;
    }
};

set <node> s;
int n, m, q, ap[MAXM], t[MAXN], tree[MAXN << 2], w[MAXN];
bool apt[MAXM];

int lowbit(int x) {return x & (-x);}

void update(int x, int val) {
    for(; x <= n; t[x] += val, x += lowbit(x));
}
int query(int x) {
    int res = 0;
    for(; x > 0; res += t[x], x -= lowbit(x));
    return res;
}
int ask(int l, int r) {return query(r) - query(l-1);}

void pushup(int i){tree[i] = max(tree[i << 1], tree[i << 1 | 1]);}

void updatemax(int i, int l, int r, int x, int val) {
    if (l == r) {tree[i] = val; return;}
    int mid = (l + r) / 2;
    if (x <= mid) updatemax(i << 1, l, mid, x, val);
    else updatemax(i << 1 | 1, mid + 1, r, x, val);
    pushup(i);
}

int querymax(int i, int l, int r, int x, int y) {
    if (x <= l && r <= y) return tree[i];
    int mx = 0, mid = (l + r) / 2;
    if (x <= mid) mx = max(mx, querymax(i << 1, l, mid, x, y));
    if (y > mid) mx = max(mx, querymax(i << 1 | 1, mid + 1, r, x, y));
    return mx;
}

IT spilit (int pos) {
    IT it = s.lower_bound(node(pos));
    if(it != s.end() && it->l == pos) return it;
    it--;
    int L = it -> l, R = it -> r;
    int V = it->v;
    s.erase(it);
    s.insert(node(L, pos-1, V));
    return s.insert(node(pos, R, V)).first;
}

void assign(int l, int r, int val = 0) {
    IT ir = spilit(r+1), il = spilit(l);
    s.erase(il, ir);
    s.insert(node(l, r, val));
}

int query1(int l, int r) {
    int ans = 2147483647, lef; memset(ap, 0, sizeof ap);
    IT ir = spilit(r+1), il = spilit(l), L, R; --il;
    L = R = il; lef = m;
    while(R != ir) {
        if(L != il) {--ap[L->v]; if(!ap[L->v]) ++lef;} ++L;
        while(lef && R != ir) {++R; ++ap[R->v]; if(ap[R->v] == 1) --lef;}
        if(R == ir) break;
        while(!lef && L != R) {--ap[L->v]; if(!ap[L->v]) ++lef; ++L;}
        if(lef) {--L; ++ap[L->v]; --lef;}
        ans = min(ask(L->r, R->l), ans);
    }
    return ans;
}

int query2(int l, int r) {
    memset(apt, 0, sizeof apt);
    int ans = querymax(1, 1, n, l, r);
    IT ir = spilit(r+1), il = spilit(l), R, L;
    R = il; --il; L = il;
    while(R != ir) {
        if(L != il) apt[L->v] = 0; ++L;
        apt[L->v] = 1;
        while(R->l < L->r) ++R;
        if(L == R) ++R;
        if(R == ir) break;
        while(!apt[R->v] && R != ir && R->l == R->r) {apt[R->v] = 1; ++R;}
        if(R == ir) --R;
        else if(!apt[R->v]) apt[R->v] = 1; else --R;
        if(L == R) continue;
        //cout << L->r << " " << R->l << endl;
        ans = max(ans, ask(L->r, R->l));
    }
    return ans;
}

int main() {
    read(n); read(q); read(m);
    s.insert(node(0, 0, -1)); s.insert((n+1, n+1, -1));
    for(int x, i = 1; i <= n; ++i) read(x), update(i, x), updatemax(1, 1, n, i, x);
    for(int x, i = 1; i <= n; ++i) read(x), s.insert(node(i, i, x));
    int opt, l, r, x;
    while(q--) {
        read(opt);
        if(opt == 1) {
            read(l); read(r);
            update(l, r - ask(l, l));
            updatemax(1, 1, n, l, r);
        } else if(opt == 2) {
            read(l); read(r); read(x);
            assign(l, r, x);
        } else if(opt == 3) {
            read(l); read(r);
            int ans = query1(l, r);
            if(ans == 2147483647) puts("-1");
            else write(ans), putchar('\n');
        } else if(opt == 4) {
            read(l); read(r);
            write(query2(l, r)); putchar('\n');
        }
    }
}

[luogu#2019/03/10模拟赛][LnOI2019]长脖子鹿省选模拟赛赛后总结的更多相关文章

  1. 【洛谷比赛】&lbrack;LnOI2019&rsqb;长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  2. 洛谷&lbrack;LnOI2019&rsqb;长脖子鹿省选模拟赛 简要题解

    传送门 听说比赛的时候T4T4T4标程锅了??? WTF换我时间我要写T3啊 于是在T4T4T4调半天无果的情况下260pts260pts260pts收场真的是tcltcltcl. T1 快速多项式变 ...

  3. 洛谷&lbrack;LnOI2019&rsqb;长脖子鹿省选模拟赛t1 -&gt&semi; 快速多项式变换

    快速多项式 做法:刚拿到此题有点蒙,一开始真没想出来怎么做,于是试着去自己写几个例子. 自己枚举几种情况之后就基本看出来了,其实本题中 n 就是f(m)在m进制下的位数,每项的系数就是f(m)在m进制 ...

  4. &lbrack;LnOI2019&rsqb;长脖子鹿省选模拟赛 东京夏日相会

    这里来一发需要开毒瘤优化,并且几率很小一遍过的模拟退火题解... 友情提醒:如果你很久很久没有过某一个点,您可以加上特判 可以像 P1337 [JSOI2004]平衡点 / 吊打XXX 那道题目一样 ...

  5. 长脖子鹿省选模拟赛 &lbrack;LnOI2019SP&rsqb;快速多项式变换&lpar;FPT&rpar;

    本片题解设计两种解法 果然是签到题... 因为返回值问题T了好久... 第一眼:搜索大水题? 然后...竟然A了 #include<cstdio> #include<queue&gt ...

  6. P5030 长脖子鹿放置 最小割

    $ \color{#0066ff}{ 题目描述 }$ 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没有中国象棋"别马腿& ...

  7. 长脖子鹿放置【洛谷P5030】二分图最大独立集变形题

    题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的“长脖子鹿”,类似于中国象棋的马,但按照“目”字攻击,且没有中国象棋“别马腿”的规则.(因为长脖子 ...

  8. P5030 长脖子鹿放置

    题目背景 众周所知,在西洋棋中,我们有城堡.骑士.皇后.主教和长脖子鹿. 题目描述 如图所示,西洋棋的"长脖子鹿",类似于中国象棋的马,但按照"目"字攻击,且没 ...

  9. 洛谷 - P5030 - 长脖子鹿放置 - 二分图最大独立集

    https://www.luogu.org/problemnew/show/P5030 写的第一道黑色题,图建对了. 隐约觉得互相攻击要连边,规定从奇数行流向偶数行. 二分图最大独立集=二分图顶点总数 ...

随机推荐

  1. mysql basic operation,mysql总结

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  2. Bphero-UWB 基站0 和 电脑串口数据格式定义

    基站0 通过串口将系统中测得的距离信息发送到电脑,电脑定位软件通过三边定位算法计算出TAG的坐标,基站0 和 定位软件之间的数据格式定义如下(对官方数据结构进行了简化) 更多UWB定位信息请参阅论坛b ...

  3. 【Python全栈-JavaScript】jQuery效果

    jQuery效果 jQuery 效果函数: 方法 描述 animate() 对被选元素应用“自定义”的动画 clearQueue() 对被选元素移除所有排队的函数(仍未运行的) delay() 对被选 ...

  4. python with as的用法

    With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作.对于这种场景,Python的with语句提供了一种非常方便的处理方式.一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取 ...

  5. Java代码质量改进之:同步对象的选择

    在Java中,让线程同步的一种方式是使用synchronized关键字,它可以被用来修饰一段代码块,如下: synchronized(被锁的同步对象) { // 代码块:业务代码 } 当synchro ...

  6. MySql 8&period;0 版本使用navicat连不上解决

    先通过命令行进入mysql的root账户: 更改加密方式 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE ...

  7. SpringMVC-RESTRUL&lowbar;&lowbar;&lowbar;CRUD知识点总结

    RESTful风格 <!-- 携带surveyId去后台 --><!-- RESTFUL风格:/xxx/23 --><!-- 接收方式:@PathVariable注解 - ...

  8. 消除 transition 闪屏

    .css { -webkit-transform-style: preserve-3d; -webkit-backface-visibility: hidden; -webkit-perspectiv ...

  9. c&plus;&plus;友元函數---16

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例 ...

  10. 070——VUE中vuex之使用getters计算每一件购物车中商品的总价

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...