社区讨论
萌新求助,有没有好心人能帮我卡卡常
P2617Dynamic Rankings参与者 7已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi6y0px4
- 此快照首次捕获于
- 2025/11/20 12:40 4 个月前
- 此快照最后确认于
- 2025/11/20 12:40 4 个月前
RT
菜鸡的代码总是自带蜜汁大常数
CPP菜鸡的代码总是自带蜜汁大常数
#include<bits/stdc++.h>
#define lson1 root<<1
#define rson1 root<<1|1
#define lson2 tr2[now].l
#define rson2 tr2[now].r
using namespace std;
int n,m,b[800020],a[800020],tot,rt[800020],tmp,cnt;
struct op
{
int kd,l,r,val;
}p[800010];
struct tree1
{
int l,r;
}tr1[800040];
struct tree2
{
int l,r,sum;
}tr2[30000050];
int init()
{
map<int,int> mm;
sort(b+1,b+cnt+1);
tot=unique(b+1,b+cnt+1)-b-1;
for(int i=1;i<=tot;i++)
{
mm[b[i]]=i;
}
for(int i=1;i<=n;i++)
{
a[i]=mm[a[i]];
}
for(int i=1;i<=m;i++)
{
if(p[i].kd==2)
{
p[i].val=mm[p[i].val];
}
}
}
//segment_tree2
int push_up2(int now)
{
tr2[now].sum=tr2[lson2].sum+tr2[rson2].sum;
}
int update2(int &now,int l,int r,int pos,int val)
{
if(!now) now=++tmp;
if(l==r)
{
tr2[now].sum+=val;
return 0;
}
register int mid=(l+r)>>1;
if(pos<=mid)
{
update2(lson2,l,mid,pos,val);
}
else
{
update2(rson2,mid+1,r,pos,val);
}
push_up2(now);
}
int query2(int now,int l,int r,int ll,int rr)
{
if(ll>rr) return 0;
if(ll<=l&&r<=rr) return tr2[now].sum;
register int mid=(l+r)>>1;
if(rr<=mid)
{
return query2(lson2,l,mid,ll,rr);
}
else
{
if(ll>mid)
{
return query2(rson2,mid+1,r,ll,rr);
}
else
{
return query2(lson2,l,mid,ll,mid)+query2(rson2,mid+1,r,mid+1,rr);
}
}
}
//end
//segment_tree1
int build(int root,int l,int r)
{
if(l==r)
{
tr1[root].l=l;
tr1[root].r=r;
return 0;
}
rt[root]=++tmp;
tr1[root].l=l;
tr1[root].r=r;
int mid=(l+r)>>1;
build(lson1,l,mid);
build(rson1,mid+1,r);
}
int insert(int root,int pos,int val)
{
if(tr1[root].l==tr1[root].r)
{
update2(rt[root],1,200000,val,1);
return 0;
}
update2(rt[root],1,200000,val,1);
int mid=(tr1[root].l+tr1[root].r)>>1;
if(pos<=mid)
{
insert(lson1,pos,val);
}
else
{
insert(rson1,pos,val);
}
}
int update(int root,int pos,int val)
{
if(tr1[root].l==tr1[root].r)
{
update2(rt[root],1,200000,a[pos],-1);
update2(rt[root],1,200000,val,1);
return 0;
}
update2(rt[root],1,200000,a[pos],-1);
update2(rt[root],1,200000,val,1);
register int mid=(tr1[root].l+tr1[root].r)>>1;
if(pos<=mid)
{
update(lson1,pos,val);
}
else
{
update(rson1,pos,val);
}
}
int query(int root,int l,int r,int gg)
{
if(l<=tr1[root].l&&tr1[root].r<=r)
{
return query2(rt[root],1,200000,1,gg);
}
register int mid=(tr1[root].l+tr1[root].r)>>1;
if(r<=mid)
{
return query(lson1,l,r,gg);
}
else
{
if(l>mid)
{
return query(rson1,l,r,gg);
}
else
{
return query(lson1,l,mid,gg)+query(rson1,mid+1,r,gg);
}
}
}
//end
int get(int ll,int rr,int val)
{
register int l=1,r=tot,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(query(1,ll,rr,mid)>=val)
{
r=mid;
}
else
{
l=mid+1;
}
if(r-l<=1)
{
mid=(query(1,ll,rr,l)>=val)?l:r;
break;
}
}
return b[mid];
}
int main()
{
scanf("%d%d",&n,&m);
cnt=n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
char kd[10];
for(int i=1;i<=m;i++)
{
scanf("%s",kd);
if(kd[0]=='Q')
{
p[i].kd=1;
scanf("%d%d%d",&p[i].l,&p[i].r,&p[i].val);
}
else
{
p[i].kd=2;
scanf("%d%d",&p[i].l,&p[i].val);
b[++cnt]=p[i].val;
}
}
init();
build(1,1,n);
for(int i=1;i<=n;i++)
{
insert(1,i,a[i]);
}
int mag=0;
for(int i=1;i<=m;i++)
{
if(p[i].kd==1)
{
printf("%d\n",get(p[i].l,p[i].r,p[i].val));
}
else
{
update(1,p[i].l,p[i].val);
a[p[i].l]=p[i].val;
}
}
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...