luogu P2617 Dynamic Rankings 主席树套树状数组模板

题目链接

树套树模板

#include<bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define LL long long
#define pii pair<int,int>
#define SZ(x) (int)x.size()
#define all(x) x.begin(),x.end()

using namespace std;

LL gcd(LL a, LL b) {return b ? gcd(b, a % b) : a;}
LL lcm(LL a, LL b) {return a / gcd(a, b) * b;}
LL powmod(LL a, LL b, LL MOD) {LL ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
const int N = 1e5 + 3;
const LL mod = 1e9 + 7;
int n,m,a[N],b[N<<1],cnT,tot,now,T[N<<1],Q[N*170],cnt;
struct uzi{int sta;char x;int l,r,k;}p[N];
int newnode(){int p=tot?Q[tot--]:++cnT;return p;}
struct faker{int sum,l,r;}t[N*170];
void up(int &x,int y,int l,int r,int pos,int val){
    if(!x){x=newnode();t[x].sum=t[x].l=t[x].r=0;}
    t[x]=t[y];t[x].sum+=val;
    if(l==r)return ;int mid=l+r>>1;
    if(pos<=mid)up(t[x].l,t[y].l,l,mid,pos,val);
    else up(t[x].r,t[y].r,mid+1,r,pos,val);
    if(!t[x].sum)Q[++tot]=x,x=0;
}
int totx,toty;
int L[100],R[100];
int get(int l,int r,int x){
    if(l==r)return l;
    int Y=0;
    int mid=l+r>>1;
    for(int i=1;i<=toty;i++)Y+=t[t[R[i]].l].sum;
    for(int i=1;i<=totx;i++)Y-=t[t[L[i]].l].sum;
    if(Y>=x){
        for(int i=1;i<=toty;i++)R[i]=t[R[i]].l;
        for(int i=1;i<=totx;i++)L[i]=t[L[i]].l;
        return get(l,mid,x);
    }
    else{
        for(int i=1;i<=toty;i++)R[i]=t[R[i]].r;
        for(int i=1;i<=totx;i++)L[i]=t[L[i]].r;
        return get(mid+1,r,x-Y);
    }
}
int main() {
	ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i],b[++cnt]=a[i];
    for(int i=1;i<=m;i++){
        int l,r,k;
        char x;
        cin>>x;
        if(x=='Q'){
            cin>>l>>r>>k;
            p[i]={0,x,l,r,k};
        }else {
            cin>>l>>r;
            p[i]={1,x,l,r,0};
            b[++cnt]=r;
        }
    }
    sort(b+1,b+1+cnt);
    cnt=unique(b+1,b+1+cnt)-b-1;
    for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;
    for(int i=1;i<=m;i++)if(p[i].sta)p[i].r=lower_bound(b+1,b+1+cnt,p[i].r)-b;
    for(int i=1;i<=n;i++)for(int j=i;j<=n;j+=j&-j)up(T[j],T[j],1,cnt,a[i],1);
    for(int i=1;i<=m;i++){
        if(!p[i].sta){
            totx=toty=0;
            for(int j=p[i].l-1;j;j-=j&-j)L[++totx]=T[j];
            for(int j=p[i].r;  j;j-=j&-j)R[++toty]=T[j];
            //cout<<get(1,cnt,p[i].k)<<' ';
            cout<<b[get(1,cnt,p[i].k)]<<endl;
        }else{
            for(int j=p[i].l;j<=n;j+=j&-j)up(T[j],T[j],1,cnt,a[p[i].l],-1);
            a[p[i].l]=p[i].r;
            for(int j=p[i].l;j<=n;j+=j&-j)up(T[j],T[j],1,cnt,p[i].r,1);
        }
    }
	return 0;
}
全部评论

相关推荐

hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务