社区讨论

树桃树,后十个点全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 条回复,欢迎继续交流。

正在加载回复...