社区讨论
树桃树,后十个点全WA。。。
P2617Dynamic Rankings参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7y7wcp
- 此快照首次捕获于
- 2025/11/21 05:33 4 个月前
- 此快照最后确认于
- 2025/11/21 05:33 4 个月前
RT,求助大佬啊。。。。
CPP#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=5e5+5;
int n,m,maxa;
int a[N];//维护当前的序列值,不是初始化
namespace CMT{
const int SZ=1<<24;
int tot;
int lc[SZ], rc[SZ], val[SZ];
int ver[SZ];
int build(int L,int R){//[L,R]
int u=++tot;
if(L==R)return u;
int mid=(L+R)>>1;
lc[u]=build(L,mid), rc[u]=build(mid+1,R);
return u;
}
void init(int L,int R){ver[0]=build(L,R);}
int modify(int pos,int v,int u,int L=0,int R=maxa){
int u2=++tot;
val[u2]=val[u]+v;
if(L==R)return u2;
int mid=(L+R)>>1;
if(pos<=mid)
lc[u2]=modify(pos,v,lc[u],L,mid), rc[u2]=rc[u];
else
lc[u2]=lc[u], rc[u2]=modify(pos,v,rc[u],mid+1,R);
return u2;
}
}
namespace DC{//Discretization
const int LEN=2e6+6;
int a[LEN],la,tot=0;
void add(int v){a[++la]=v;}
void dc(){sort(a+1,a+la+1), tot=unique(a+1,a+la+1)-a-1;}
int find(int x){return lower_bound(a+1,a+tot+1,x)-a;}
}
namespace BIT_CMT{//BIT套CMT
void add(int i,int t){//初始化
t=DC::find(t);
for(int j=i;j<=n;j+=j&-j){
CMT::ver[j]=CMT::modify(t,1,CMT::ver[j]);
//BUG#1:j写成i
}
}
void C(int i,int t){//更新
int old=DC::find(a[i]);
a[i]=t;
t=DC::find(t);
for(int j=i;j<=n;j+=j&-j){
CMT::ver[j]=CMT::modify(old,-1,CMT::ver[j]);
CMT::ver[j]=CMT::modify(t,1,CMT::ver[j]);
}
}
int lu[DC::LEN],ru[DC::LEN];//当前的log个结点
int cntl,cntr;
int query(int k,int L=0,int R=maxa){//值域区间[L,R]
int lval=0,mid=(L+R)>>1;
if(L==R)return L;
for(int i=1;i<=cntr;i++){
lval+=CMT::val[CMT::lc[ru[i]]];
}
for(int i=1;i<=cntl;i++){
lval-=CMT::val[CMT::lc[lu[i]]];
}
if(k<=lval){
for(int i=1;i<=cntl;i++)lu[i]=CMT::lc[lu[i]];
for(int i=1;i<=cntr;i++)ru[i]=CMT::lc[ru[i]];
return query(k,L,mid);
}
else {
for(int i=1;i<=cntl;i++)lu[i]=CMT::rc[lu[i]];
for(int i=1;i<=cntr;i++)ru[i]=CMT::rc[ru[i]];
return query(k-lval,mid+1,R);
}
}
int Q(int l,int r,int k){
//下标区间[l,r]
cntl=cntr=0;
for(int i=l-1;i>0;i-=i&-i)lu[++cntl]=CMT::ver[i];
for(int i=r;i>0;i-=i&-i)ru[++cntr]=CMT::ver[i];
return query(k);
}
}
struct data{//询问的数据
int type,i,j,k,t;
void read(){//读入函数
char op[3];
scanf("%s",op);
if(op[0]=='Q')type=0,scanf("%d%d%d",&i,&j,&k);
else type=1,scanf("%d%d",&i,&t), DC::add(t);
}
};
data d[M];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),DC::add(a[i]);
for(int i=1;i<=m;i++)d[i].read();
DC::dc();//离散化
maxa=DC::tot;
CMT::init(0,maxa);//初始化0版本
for(int i=1;i<=n;i++)BIT_CMT::add(i,a[i]);
for(int i=1;i<=m;i++){
if(d[i].type==0){
int res=BIT_CMT::Q(d[i].i,d[i].j,d[i].k);
printf("%d\n",DC::a[res]);
}
else {
BIT_CMT::C(d[i].i,d[i].t);
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...