• 【BZOJ2120】数颜色


    看代码学习好,好学好懂好ac

    原题:

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

    N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。3

    带修改的莫队裸题

    额外增加一维表示时间,排序的时候优先级设为最底,然后莫队即可……

    贡献什么的很好想,就不说了

    注意想清楚时间轴和答案的关系

    看代码学习好,好学好懂好ac

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 using namespace std;
     7 int rd(){int z=0,mk=1;  char ch=getchar();
     8     while(ch<'0'||ch>'9'){if(ch=='-')mk=-1;  ch=getchar();}
     9     while(ch>='0'&&ch<='9'){z=(z<<3)+(z<<1)+ch-'0';  ch=getchar();}
    10     return z*mk;
    11 }
    12 struct dcd{int x,y,z,id;}b[110000],c[110000];  int tt=0;
    13 int n,m,a[110000];  int blck;
    14 int l,r,t=0;
    15 int cnt[1100000],nm=0;
    16 int ans[110000];
    17 bool cmp(dcd x,dcd y){
    18     return (x.x/blck==y.x/blck ? (x.y/blck==y.y/blck ? x.z<y.z : x.y<y.y) : x.x<y.x);
    19 }
    20 void chg(int x,int y){
    21     if(l<=x && x<=r){
    22         --cnt[a[x]];  nm-=(!cnt[a[x]]);
    23         a[x]=y;
    24         nm+=(!cnt[a[x]]);  ++cnt[a[x]];
    25     }
    26     else  a[x]=y;
    27 }
    28 void updt(int x,int y){
    29     nm+=(!cnt[a[x]]);  cnt[a[x]]+=y;  nm-=(!cnt[a[x]]);
    30     /*cout<<x<<" "<<y<<endl;
    31     for(int i=1;i<=6;++i)  cout<<cnt[i]<<" ";
    32     cout<<endl;*/
    33 }
    34 int main(){//freopen("ddd.in","r",stdin);
    35     cin>>n>>m;  blck=(int)sqrt(n*1.0);
    36     for(int i=1;i<=n;++i)  a[i]=rd();
    37     char s[10];
    38     for(int i=1;i<=m;++i){
    39         scanf("%s",s);  l=rd(),r=rd();
    40         if(s[0]=='Q')  b[++tt].z=t,b[tt].x=l,b[tt].y=r,b[tt].id=tt;
    41         else  c[++t].x=l,c[t].y=r,c[t].z=a[l],a[l]=r;
    42     }
    43     for(int i=t;i>=1;--i)  a[c[i].x]=c[i].z;
    44     sort(b+1,b+tt+1,cmp);
    45     l=1,r=0,t=0;
    46     for(int i=1;i<=tt;++i){
    47         while(t<b[i].z)  ++t,chg(c[t].x,c[t].y);
    48         while(t>b[i].z)  chg(c[t].x,c[t].z),--t;
    49         while(r<b[i].y)  ++r,updt(r,1);
    50         while(r>b[i].y)  updt(r,-1),--r;
    51         while(l<b[i].x)  updt(l,-1),++l;
    52         while(l>b[i].x)  --l,updt(l,1);
    53         //cout<<i<<endl;
    54     /*cout<<l<<" "<<r<<" "<<t<<" "<<nm<<endl;
    55     for(int j=1;j<=6;++j)  cout<<cnt[j]<<" ";
    56     cout<<endl;
    57     for(int j=1;j<=n;++j)  cout<<a[j]<<" ";
    58     cout<<endl;*/
    59         ans[b[i].id]=nm;
    60     }
    61     for(int i=1;i<=tt;++i)  printf("%d
    ",ans[i]);
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    WPF中textbox控件的一些样式的后台写法
    SQL中left join、right join、inner join的区别
    WPF引用多个样式
    【转载】C#使用Split函数根据特定分隔符分割字符串
    单例模式
    简单工厂模式
    设计模式简介
    JavaScript--String
    JavaScript--Array
    JavaScript--Object
  • 原文地址:https://www.cnblogs.com/JSL2018/p/6647557.html
Copyright © 2020-2023  润新知