社区讨论

谁能给我看一下哪里写挂了。。

P2617Dynamic Rankings参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6n7bcu
此快照首次捕获于
2025/11/20 07:37
4 个月前
此快照最后确认于
2025/11/20 07:37
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=5e5+10;
inline ll read()
{
    char c=getchar();
    ll x=0;
    int flag=1;
    while(c<'0'||c>'9')
    {
        if(c=='-')flag=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=x*10+c-48;
        c=getchar();
    }
    x*=flag;
    return x;
}
int a[maxn],b[maxn];
int xiu1[maxn],xiu2[maxn];
int dd1=0,dd2=0; 
int n,m;
int lx[maxn],rx[maxn];
int idx=0;
struct node
{
    int i,j,k;char q;
}querys[maxn];
int lowbit(int x)
{
    return x&-x;
}
int sum[maxn];
int c[maxn];
int tot=0;
int arr[maxn];
int rt[maxn];
int xp; 
int build(int l,int r)
{
    int rt=++tot;int mid=(l+r)>>1;if(l==r)return rt;
    lx[rt]=build(l,mid);rx[rt]=build(mid+1,r);
    return rt; 
} 
int update(int pre,int l,int r,int x)
{
    int rt=++tot;sum[rt]=sum[pre]+1;lx[rt]=lx[pre];rx[rt]=rx[pre];
    if(l==r)return rt;int mid=(l+r)>>1;
    if(x<=mid)lx[rt]=update(lx[pre],l,mid,x);else rx[rt]=update(rx[pre],mid+1,r,x);
    return rt;
}
int query(int pre,int now,int l,int r,int k)
{
    if(l==r)return l;int x=sum[lx[now]]-sum[lx[pre]];
    for(int i=1;i<=dd1;i++)
    {
        x-=sum[xiu1[i]];
    }
    for(int i=1;i<=dd2;i++)
    {
        x+=sum[xiu2[i]];
    }
    int mid=(l+r)>>1;
    if(k<=x)
    {
        for(int i=1;i<=dd1;i++)
        {
            xiu1[i]=lx[xiu1[i]];
        }
        for(int i=1;i<=dd2;i++)
        {
            xiu2[i]=lx[xiu2[i]];
        }
        return query(lx[pre],lx[now],l,mid,k);
    }
    else 
    {
        for(int i=1;i<=dd1;i++)
        {
            xiu1[i]=rx[xiu1[i]];
        }
        for(int i=1;i<=dd2;i++)
        {
            xiu2[i]=rx[xiu2[i]];
        }
        return query(rx[pre],rx[now],mid+1,r,k-x);
    }
}
int cha(int l,int r,int k)
{
    dd1=dd2=0;
    for(int i=l-1;i>0;i-=lowbit(i))
    {
        xiu1[++dd1]=c[i];
    }
    for(int i=r;i>0;i-=lowbit(i))
    {
        xiu2[++dd2]=c[i];
    }
    return query(rt[l-1],rt[r],1,xp,k);
}
void change(int &rt,int l,int r,int x,int v)
{
    if(rt==0)rt=++tot;sum[rt]+=v;if(l==r)return ;int mid=(l+r)>>1;
    if(x<=mid)change(lx[rt],l,mid,x,v);else change(rx[rt],mid+1,r,x,v);
}
void upd(int pos,int x)
{
    for(int i=pos;i<=n;i+=lowbit(i))
    {
        change(i,1,xp,arr[i],-1);
        change(i,1,xp,x,1);
    }
    arr[pos]=x;
}
int main() 
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        a[i]=b[i]=read();
        arr[i]=a[i];
    }
    idx=n;
    for(int i=1;i<=n;i++)
    {
        c[i]=++tot;
    }
    for(int i=1;i<=m;i++)
    {
        scanf(" %c",&querys[i].q);
        if(querys[i].q=='Q')
        {
            querys[i].i=read();
            querys[i].j=read();
            querys[i].k=read();
        }
        else
        {
            querys[i].i=read();
            querys[i].k=read();
            a[++idx]=querys[i].k;
        } 
    }
    sort(a+1,a+idx+1);
    xp=unique(a+1,a+idx+1)-a-1;
    rt[0]=build(1,xp);
    for(int i=1;i<=n;i++)
    {
        b[i]=lower_bound(a+1,a+xp+1,b[i])-a;
        rt[i]=update(rt[i-1],1,xp,b[i]);
    }
    for(int i=1;i<=m;i++)
    {
        if(querys[i].q=='Q')
        {
            printf("%d\n",a[query(rt[querys[i].i-1],rt[querys[i].j],1,xp,querys[i].k)]);
        }
        else upd(querys[i].i,querys[i].k);
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...