社区讨论
权值线段树 92 pts 求调
P6136【模板】普通平衡树(数据加强版)参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mkf0f1kg
- 此快照首次捕获于
- 2026/01/15 13:29 上个月
- 此快照最后确认于
- 2026/01/18 08:10 上个月
rt,#5 #6 MLE,想不到怎么卡了,悬 关
CPP#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6;
const int L=0;
const int R=1073741823;
int lc[30*N+1],rc[30*N+1];
ll num[30*N+1];
int rt,idx;
void pushup(int p)
{
num[p]=num[lc[p]]+num[rc[p]];
}
ll query_sum(int p,int x,int y,int l,int r)
{
if(x<=l&&r<=y)
{
return num[p];
}
int mid=l+r>>1;
int sum=0;
if(x<=mid) sum+=query_sum(lc[p],x,y,l,mid);
if(y>mid) sum+=query_sum(rc[p],x,y,mid+1,r);
return sum;
}
int query_id(int p,int l,int r,int k)
{
if(!p) return -1;
if(l==r) return l;
int mid=l+r>>1;
int ans=-1;
if(k<=num[lc[p]])
{
ans=query_id(lc[p],l,mid,k);
}
else
{
ans=query_id(rc[p],mid+1,r,k-num[lc[p]]);
}
return ans;
}
void update(int &p,int x,int y,int l,int r,int k)
{
if(!p) p=++idx;
if(x<=l&&r<=y)
{
num[p]+=(r-l+1)*k;
return;
}
int mid=l+r>>1;
if(x<=mid) update(lc[p],x,y,l,mid,k);
if(y>mid) update(rc[p],x,y,mid+1,r,k);
pushup(p);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,q;
cin>>n>>q;
int lst=0,ans=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
update(rt,x,x,L,R,1);
}
while(q--)
{
int t,x;
cin>>t>>x;
x^=lst;
if(t==1)
{
update(rt,x,x,L,R,1);
}
else if(t==2)
{
update(rt,x,x,L,R,-1);
}
else if(t==3)
{
int cur=query_sum(1,L,x-1,L,R)+1;
ans^=cur;
lst=cur;
}
else if(t==4)
{
int cur=query_id(1,L,R,x);
ans^=cur;
lst=cur;
}
else if(t==5)
{
int cur=query_id(1,L,R,query_sum(1,L,x-1,L,R));
ans^=cur;
lst=cur;
}
else if(t==6)
{
int cur=query_id(1,L,R,query_sum(1,L,x,L,R)+1);
ans^=cur;
lst=cur;
}
}
cout<<ans;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...