第一篇题解的一个问题
查看原帖
第一篇题解的一个问题
1057295
封禁用户楼主2023/8/22 17:11

我一开始自己写了一个版本,然后0pts,照着第一篇题解改了改,结果浮点异常,然后本地也测了一下第一篇题解代码,也浮点异常了,不知道是什么情况,求助大佬。

我的代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

template<typename T>
T read(T x)
{
    T opt = 1, sum = 0;
    char ch = getchar();
    while(!isdigit(ch))
        opt = (sum == '-') ? -1 : 1, ch = getchar();
    while( isdigit(ch))
        sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();
    return opt * sum;
}
#define read read(0)
const int N = 1e5 + 5;
short f[N][47];
int fa[N], a[N], b[N], tong[N], ans[N];
int x;
char type[N];

int cnt;
int n, m, block, t;
struct edge
{
    int to;
    int nxt;
}e[N];
int head[N];
struct node
{
    int x, y;
    bool operator < (const node &a) const{
        return x < a.x;
    }
}p[N];
void add(register int x, register int y)
{
    e[++ cnt] = (edge){y, head[x]}, head[x] = cnt;
}
int root(register int x)
{
    if(x == fa[x]) return x;
    return root(fa[x]);
}
void dfs(register int x)
{
    bool flag = false;
    if(type[x] == 1){
        a[x] = root(a[x]);
        b[x] = root(b[x]);
        if(a[x] ^ b[x]){
            flag = true;
            if(tong[a[x]] > tong[b[x]]) a[x] ^= b[x] ^= a[x] ^= b[x];
            fa[a[x]] = b[x], tong[b[x]] += tong[a[x]];
            for(register int i = 1;i <= t;i ++ ) f[b[x]][i] += f[a[x]][i];
        }
    }
    else if(type[x] == 3){
        register int s = b[x];
        register int X = root(a[x]);
        register int flag1 = 0;
        if(s > tong[X]){
            for(register int i = 1;i <= t && !flag1;i ++ ){
                if(s > f[X][i]) s -= f[X][i];
                else flag1 = i;
            }
            for(register int i = (flag1 - 1) * block + 1;i <= flag1 * block && s;i ++ ){
                if(root(p[i].y) == X) {
                    s -- ;
                    ans[x] = p[i].x;
                }
            }
        }
    }
    for(register int i = head[x];i;i = e[i].nxt) dfs(e[i].to);
    if(flag){
        for(register int i = 1;i <= t;i ++ ){
            f[b[x]][i] -= f[a[x]][i];
        }
        fa[a[x]] = a[x], tong[b[x]] -= tong[a[x]];
    }
}
int main()
{
    n = read, m = read;
    block = n / 46;
    t = (n - 1) / block;
    t ++ ;
    for(register int i = 1;i <= n;i ++ ){
       p[i] = (node){read, i};
       tong[fa[i] = i] = 1;

    }
    sort(p + 1,p + 1 + n);
    for(register int i = 1;i <= n;i ++ )  {register int x = (i - 1) / block + 1; f[p[i].y][x] ++;}

    for(register int i = 1;i <= m;i ++ ){
        type[i] = read;
        if(type[i]){
            add(i - 1, i);
            a[i] = read, b[i] = read;
        }
        else if(type[i] == 2){
            register int k = read;
            add(k, i);
        }
        else {
            add(i - 1, i);
            a[i] = read, b[i] = read;
        }
    }
    dfs(0);
    for(register int i = 1;i <= m;i ++ ){
        if(type[i] == 3) cout << ans[i] << endl;
    }
    return 0;
}

2023/8/22 17:11
加载中...