我一开始自己写了一个版本,然后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;
}