社区讨论

萌新求助,有没有好心人能帮我卡卡常

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 条回复,欢迎继续交流。

正在加载回复...