社区讨论
谁能给我看一下哪里写挂了。。
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 条回复,欢迎继续交流。
正在加载回复...