• bzoj 2120 数颜色


    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
    带修改的莫队
    因为修改次数不多,所以在移动左右指针时还要移动一个修改操作指针
    确保查询时正好在某次修改的状态
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 struct Node
     8 {
     9   int x,y,pre,id,ans;
    10 }q[10005],p[10005];
    11 int n,m,lim,cntq,cntp,curl,curr,ans,cnt[1000005],a[10005],path[10005],curp,kp[10005];
    12 char opt;
    13 bool cmp(Node a,Node b)
    14 {
    15   if (a.x/lim==b.x/lim) return a.y<b.y;
    16   return a.x<b.x;
    17 }
    18 void update(int x,int y,int l,int r)
    19 {
    20   if (l<=x&&x<=r)
    21     {
    22       ans-=(--cnt[a[x]]==0);
    23       ans+=(++cnt[y]==1);
    24       a[x]=y;
    25     }
    26   else a[x]=y;
    27 }
    28 char get()
    29 {
    30   char c=getchar();
    31   while (c!='Q'&&c!='R') c=getchar();
    32   return c;
    33 }
    34 int main()
    35 {int i,j,x,y;
    36   cin>>n>>m;
    37   lim=sqrt(n);
    38   for (i=1;i<=n;i++)
    39     scanf("%d",&a[i]),path[i]=a[i];
    40   for (i=1;i<=m;i++)
    41     {
    42       opt=get();
    43       scanf("%d%d",&x,&y);
    44       if (opt=='Q')
    45     {
    46       q[++cntq].x=x;q[cntq].y=y;
    47       q[cntq].pre=cntp;q[cntq].id=cntq;
    48     }
    49       else if (opt=='R')
    50     {
    51       p[++cntp].x=x;p[cntp].y=y;p[cntp].pre=path[x];
    52       path[x]=y;
    53     }
    54     }
    55   sort(q+1,q+cntq+1,cmp);
    56   curl=1;curr=0;curp=0;
    57   for (i=1;i<=cntq;i++)
    58     {
    59       int P=q[i].pre,L=q[i].x,R=q[i].y;
    60       while (curp>P) update(p[curp].x,p[curp].pre,curl,curr),curp--;
    61       while (curp<P) curp++,update(p[curp].x,p[curp].y,curl,curr);
    62       while (curl<L) ans-=(--cnt[a[curl++]] ==0);
    63       while (curl>L) ans+=(++cnt[a[--curl]] ==1);
    64       while (curr<R) ans+=(++cnt[a[++curr]] ==1);
    65       while (curr>R) ans-=(--cnt[a[curr--]] ==0);
    66       kp[q[i].id]=ans;
    67     }
    68   for (i=1;i<=cntq;i++)
    69     printf("%d
    ",kp[i]);
    70 }
  • 相关阅读:
    vue
    vue
    vue 中使用style(样式)
    vue 中使用class(样式)
    第17课
    第16课
    第15课
    第14课
    第13课
    第12课
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8125406.html
Copyright © 2020-2023  润新知