zoukankan      html  css  js  c++  java
  • BZOJ-2120: 数颜色 (带修改莫队)

    2120: 数颜色

    Time Limit: 6 Sec  Memory Limit: 259 MB
    Submit: 6102  Solved: 2420
    [Submit][Status][Discuss]

    Description

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

    Input

    第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

    Output

    对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

    Sample Input

    6 5
    1 2 3 4 5 5
    Q 1 4
    Q 2 6
    R 1 2
    Q 1 4
    Q 2 6

    Sample Output

    4
    4
    3
    4

    HINT

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


    2016.3.2新加数据两组by Nano_Ape

    Source

     一道快要把laj做哭的题目=_= (突然发现laj现在脾气越来越不稳定了 _(:зゝ∠)_)
    带修改的莫队……一开始还以为就是啥跟一般的莫队一样一样的呢… _(:зゝ∠)_
    其实带修改的莫队也很简单,对于每一个询问维护一个time记录在这次询问前总共做了几次修改,再开一个结构体记录修改的操作即可……思路都是对的哇……为啥一开始调程序调到怀疑人生……
     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long LL;
     4 const int MAX=1e5+5;
     5 int n,m,ans,ttt,tot,N,L,R,bas;
     6 int a[MAX],d[MAX],b[1000005],pos[MAX],an[MAX];
     7 struct Node{
     8     int id,l,r,tim;
     9     bool operator < (const Node &tt) const{
    10         if (pos[l]!=pos[tt.l])
    11             return pos[l]<pos[tt.l];
    12         if (pos[r]!=pos[tt.r])
    13             return r<tt.r;
    14         return tim<tt.tim;
    15     }
    16 }que[MAX];
    17 struct Upd{int x,y,last;}upd[MAX];
    18 inline int read(){
    19     int an=0,x=1;char c=getchar();
    20     while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
    21     while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();}
    22     return an*x;
    23 }
    24 void update(int x,int y){
    25     b[a[x]]+=y;
    26     if (b[a[x]]==0) ans--;
    27     if (b[a[x]]==1 && y==1) ans++;
    28 }
    29 void change(int now,int i){
    30     if (que[i].l<=upd[now].x && upd[now].x<=que[i].r){
    31         b[a[upd[now].x]]--;
    32         if (b[a[upd[now].x]]==0) ans--;
    33         if (b[upd[now].y]==0) ans++;
    34         b[upd[now].y]++;
    35     }
    36     swap(a[upd[now].x],upd[now].y);
    37 }
    38 int main(){
    39     freopen ("count.in","r",stdin);freopen ("count.out","w",stdout);
    40     int i,j;char c;L=1;
    41     n=read(),m=read();bas=(int)sqrt(n*1.0);
    42     for (i=1;i<=n;i++) a[i]=read(),pos[i]=i/bas;
    43     for (i=1;i<=m;i++){
    44         while (c=getchar(),c<'A' || c>'Z');
    45         if (c=='R'){
    46             upd[++tot].x=read();
    47             upd[tot].y=read();
    48         }
    49         else{
    50             que[++ttt].id=ttt;
    51             que[ttt].l=read(),que[ttt].r=read();
    52             que[ttt].tim=tot;
    53         }
    54     }
    55     sort(que+1,que+ttt+1);
    56     for (i=1;i<=ttt;i++){
    57         while (R<que[i].r) ++R,update(R,1);
    58         while (L>que[i].l) --L,update(L,1);
    59         while (R>que[i].r) update(R,-1),--R;
    60         while (L<que[i].l) update(L,-1),++L;
    61         while (N<que[i].tim) ++N,change(N,i);
    62         while (N>que[i].tim) change(N,i),--N;
    63         an[que[i].id]=ans;
    64     }
    65     for (i=1;i<ttt;i++)
    66         printf("%d
    ",an[i]);
    67     printf("%d",an[ttt]);
    68     return 0;
    69 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    Oracle EBS 配置文件取值
    “嗯...无法访问此页面 尝试此操作.....”的解决方法
    为什么在开发的微信小程序项目里写不上汉字?
    VM1238:2 pages/logs/logs.json 文件解析错误 SyntaxError: Unexpected token / in JSON at position 41....
    allparis工具的使用
    can't open 1.txt at releaseallpairs.pl line 368.
    element.style的样式问题解决方法
    常见的http状态码有哪些,代表什么意思?
    怎样快速修改文件名的后缀
    “该文件没有与之关联的应用来执行操作请安装应用若已安装应用程序请在默认应用设置...”
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7718991.html
Copyright © 2011-2022 走看看