bzoj1901: Zju2112 Dynamic Rankings

整体二分

复制代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

int n,s[11000];
int lowbit(int x){return x&-x;}
void change(int x,int k)
{
    while(x<=n)
    {
        s[x]+=k;
        x+=lowbit(x);
    }
}
int getsum(int x)
{
    int ret=0;
    while(x>0)
    {
        ret+=s[x];
        x-=lowbit(x);
    }
    return ret;
}

//------------bit----------------------

struct node
{
    int t,x,y,z;
}q[31000],lq[31000],rq[31000];int len;
int as[11000];
void solve(int l,int r,int st,int ed)
{
    if(st>ed)return ;
    if(l==r)
    {
        for(int i=st;i<=ed;i++)
            if(q[i].t>0)as[q[i].t]=l;
            return ;
    }
    
    int mid=(l+r)/2,lt=0,rt=0;
    for(int i=st;i<=ed;i++)
    {
        if(q[i].t==0)
        {
            if(q[i].y<=mid)
            {
                change(q[i].x,q[i].z);
                lq[++lt]=q[i];
            }
            else rq[++rt]=q[i];
        }
        else
        {
            int d=getsum(q[i].y)-getsum(q[i].x-1);
            if(d>=q[i].z)lq[++lt]=q[i];
            else 
            {
                q[i].z-=d;
                rq[++rt]=q[i];
            }
        }
    }
    
    for(int i=ed;i>=st;i--)
        if(q[i].t==0&&q[i].y<=mid)change(q[i].x,-q[i].z);
        
    for(int i=1;i<=lt;i++)q[st+i-1]=lq[i];
    for(int i=1;i<=rt;i++)q[st+lt+i-1]=rq[i];
    solve(l,mid,st,st+lt-1);
    solve(mid+1,r,st+lt,ed);
}

int a[11000];
char ss[10];
int main()
{
    int Q;
    scanf("%d%d",&n,&Q); len=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);len++;
        q[len].t=0,q[len].z=1;
        q[len].x=i,q[len].y=a[i];
    }
    int m=0,l,r,k;
    while(Q--)
    {
        scanf("%s",ss+1);
        if(ss[1]=='Q')
        {
            scanf("%d%d%d",&l,&r,&k);len++;
            q[len].t=++m,q[len].z=k;
            q[len].x=l,q[len].y=r;
        }
        else
        {
            scanf("%d%d",&l,&r);
            
            len++;
            q[len].t=0,q[len].z=-1;
            q[len].x=l,q[len].y=a[l];
            
            len++;
            q[len].t=0,q[len].z=1;
            q[len].x=l,q[len].y=r;
            a[l]=r;
        }
    }
    
    memset(s,0,sizeof(s));
    solve(0,1e9,1,len);
    for(int i=1;i<=m;i++)printf("%d\n",as[i]);
    return 0;
}
复制代码

 

posted @   AKCqhzdy  阅读(128)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示