• 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 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    学习MSMQ笔记
    swfobject 2.0 使用(转)
    发现博客园的一个小问题
    4月10日
    NHibernate的一点思考
    最新手机号码正则表达式
    如何在页面完美显示版权符号(转)
    OpenGL由已知控制点绘制模拟曲面地形
    android自定义view[控件重用]时出现“No resource identifier found for attribute *** in package *** ”
    基于ARM的模拟器
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7718991.html
Copyright © 2020-2023  润新知