Argestes and Sequence HDU

来源:互联网 发布:1大学生网络党校 编辑:程序博客网 时间:2024/05/22 17:51

这个树状数组还是挺好的一道提。我都不知道可以这样写。、
参看http://blog.csdn.net/stiyet/article/details/51942701

//2017年08月1014:47:24  15minint n,m; int vis[mxn]; int a[mxn];struct Node{    int x,y,l,r,d,p,flag,ans;}node[mxn];int c[15][mxn];int sum(int x,int num){    int ans=0;    while(x){        ans+=c[num][x];        x-=(x&(-x));    }    return ans;}void update(int num,int x,int val){    while(x<=n){        c[num][x]+=val;        x+=(x&(-x));    }}int main(){    int T;sf("%d",&T);    while(T--){        sf("%d%d",&n,&m);        rep(i,1,n)sf("%d",&a[i]);        rep(i,1,m){            char op[3];sf("%s",op);            if(op[0]=='Q'){                node[i].flag=1;                sf("%d%d%d%d",&node[i].l,&node[i].r,&node[i].d,&node[i].p);            }            else{                node[i].flag=0;                sf("%d%d",&node[i].x,&node[i].y);            }        }        int base=1;        for(int i=1;i<=10;++i){            mem(c,0);            for(int j=1;j<=n;++j){                update(a[j]/base%10,j,1);                vis[j]=a[j]/base%10;            }            for(int j=1;j<=m;++j){                if(node[j].flag){                    if(node[j].d==i)                    node[j].ans=sum(node[j].r,node[j].p)-sum(node[j].l-1,node[j].p);                }                else{                    update(vis[node[j].x],node[j].x,-1);                    update(node[j].y/base%10,node[j].x,1);                    vis[node[j].x]=node[j].y/base%10;                }            }            base*=10;        }        rep(i,1,m){            if(node[i].flag){                pf("%d\n",node[i].ans);            }        }    }}
阅读全文
0 0