社区讨论
3721求调
学术版参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjd880s
- 此快照首次捕获于
- 2025/11/04 00:39 4 个月前
- 此快照最后确认于
- 2025/11/04 00:39 4 个月前
实在是搞不出来了。写完10min,调了一下午一晚上一直是40pts,都是在几万行错的。肯定会悬一个关。马蜂可能不优良,因为我一直在改一些无关紧要的东西。
CPP#include<bits/stdc++.h>
#define sdn cout
#define ll long long
#define vi vector<int>
#define ld double
#define vl vector<ll>
#define mpair make_pair
#define pb push_back
using namespace std;
mt19937_64 rnd(time(nullptr));
int read(){
int x = 0,f = 1;
char ch = getchar();
while(ch < 48 && ch > 57){
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= 48 && ch <= 57){
x = x<<3 + x<<1 + ch-48;
ch = getchar();
}
return x*f;
}
void write(int x){
if(x < 0) putchar('-'),x = -x;
if(x > 9) write(x/10);
putchar(x%10+48);
}
const int N = 1e6 + 10,M = 1e6 + 10,INF = INT_MAX;
int n,m,T,a[N],b[N],k,cnt,rt,stk[N];
ll ans;
int q[N][2],fa[N],c[N][2],cnt1,cnt2;
set <int> S;
#define ls(x) tr[x].s[0]
#define rs(x) tr[x].s[1]
#define isrt(x) (ls(tr[x].f) != x && rs(tr[x].f) != x)
struct node{
int f,s[2],tg,siz;
}tr[N];
void pu(int p){
tr[p].siz = tr[ls(p)].siz + tr[rs(p)].siz + 1;
}
void pd(int p){
if(tr[p].tg){
swap(ls(p),rs(p));
tr[ls(p)].tg ^= 1;
tr[rs(p)].tg ^= 1;
tr[p].tg = 0;
}
}
void rotate(int x){
int y = tr[x].f,z = tr[y].f;
int k = ls(y)==x;
if(!isrt(y)) tr[z].s[rs(z)==y] = x;
tr[x].f = z;
tr[tr[x].s[k]].f = y;
tr[y].s[k^1] = tr[x].s[k];
tr[x].s[k] = y;
tr[y].f = x;
pu(y),pu(x);
}
void splay(int x){
int u = x,tp = 0;
stk[++tp] = u;
while(!isrt(u)) u = tr[u].f,stk[++tp] = u;
while(tp) pd(stk[tp--]);
while(!isrt(x)){
int y = tr[x].f,z = tr[y].f;
if(!isrt(y)) (ls(y)==x^ls(z)==y)?rotate(x):rotate(y);
rotate(x);
}
}
void acc(int x){
int y = 0;
while(x){
splay(x);
rs(x) = y;pu(x);
y = x;x = tr[x].f;
}
}
void mkrt(int x){
acc(x);splay(x);tr[x].tg ^= 1;
}
void split(int x,int y){
mkrt(x);acc(y);splay(y);
}
void link(int x,int y){
if(!x||!y) return ;
mkrt(x);
tr[x].f = y;
}
void cut(int x,int y){
if(!x||!y) return ;
split(x,y);
tr[x].f = ls(y) = 0;pu(x),pu(y);
}
int dep(int x){
mkrt(rt);
acc(x);splay(x);
return tr[x].siz;
}
int main(){
cin>>n;
for(int i = 1;i <= n;i ++){
cin>>q[i][0];
if(q[i][0] == 1) cin>>q[i][1],a[++cnt] = q[i][1];
}
sort(a+1,a+cnt+1);
cnt1 = unique(a+1,a+cnt+1) - a - 1;
for(int i = 1;i <= n;i ++){
if(q[i][0] == 1){
q[i][1] = lower_bound(a+1,a+cnt1+1,q[i][1]) - a; }
}
S.insert(INF);S.insert(-INF);
for(int i = 1;i <= n;i ++){
if(q[i][0] == 1){
if(!cnt2){
cnt2 ++;tr[cnt2].siz = 1;rt = q[i][1];S.insert(q[i][1]);
printf("1\n");
continue;
}
cnt2 ++;tr[cnt2].siz = 1;
auto it = S.upper_bound(q[i][1]);
int pr,su,mx=0,op;
su=*it,--it,pr=*it;
if(pr != -INF) if(dep(pr) > mx) mx = dep(pr),op = pr;
if(su != INF) if(dep(su) > mx) mx = dep(su),op = su;
printf("%d\n",mx+1);
c[op][q[i][1] > op] = q[i][1],fa[q[i][1]] = op;
link(op,q[i][1]);
S.insert(q[i][1]);
}
if(q[i][0] == 2){
if(cnt2 == 1){
printf("1\n");continue;
}
auto it = S.begin();it++;
int p = *it,y = c[p][1],z = fa[p],res = dep(p);
if(p != rt){
cut(p,z);cut(p,y);link(p,rt);link(z,y);
fa[p] = 0,c[p][1] = rt,fa[rt] = p,rt = p,c[z][0] = y;fa[y] = z;
}
sdn<<res<<endl;
}
if(q[i][0] == 3){
if(cnt2 == 1){
printf("1\n");continue;
}
auto it = S.end();it--;it--;
int p = *it,y = c[p][0],z = fa[p],res = dep(p);
if(p != rt){
cut(p,z),cut(p,y),link(p,rt),link(z,y);
fa[p] = 0,c[p][0] = rt,fa[rt] = p,rt = p,c[z][1] = y;fa[y] = z;
}
sdn<<res<<endl;
}
if(q[i][0] == 4){
if(cnt2 == 1){
cnt2 = 0;S.erase(S.find(rt));rt = 0;
printf("1\n");continue;
}
auto it = S.begin();it++;
int p = *it,y = c[p][1],z = fa[p],res = dep(p);
cut(p,z);cut(p,y);link(y,z);
if(p == rt) rt = y;
c[p][0] = c[p][1] = fa[p] = 0,c[z][0] = y,fa[y] = z;
cnt2 --;S.erase(S.find(p));
sdn<<res<<endl;
}
if(q[i][0] == 5){
if(cnt2 == 1){
cnt2 = 0;S.erase(S.find(rt));rt = 0;
printf("1\n");continue;
}
auto it = S.end();it--;it--;
int p = *it,y = c[p][0],z = fa[p],res = dep(p);
cut(p,z);cut(p,y);link(y,z);
if(p == rt) rt = y;
c[p][0] = c[p][1] = fa[p] = 0,c[z][1] = y,fa[y] = z;
cnt2 --;S.erase(S.find(p));
sdn<<res<<endl;
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...