Description

\(N\)个布丁摆成一行,进行\(M\)次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为\(1,2,2,1\)的四个布丁一共有\(3\)段颜色.

Input

第一行给出\(N,M\)表示布丁的个数和好友的操作次数. 第二行\(N\)个数\(A_{1},A_{2},...,A_{n}\)表示第\(i\)个布丁的颜色从第三行起有\(M\)行,对于每个操作,若第一个数字是\(1\)表示要对颜色进行改变,其后的两个整数\(X,Y\)表示将所有颜色为\(X\)的变为\(Y\),\(X\)可能等于\(Y\). 若第一个数字为\(2\)表示要进行询问当前有多少段颜色,这时你应该输出一个整数。

Output

针对第二类操作即询问,依次输出当前有多少段颜色.

Sample Input

4 3

1 2 2 1

2

1 2 1

2

Sample Output

3

1

直接用vector写。\(vec_{i}\)记录每个元素存在的区间,暴力合并区间即可。

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<vector>
  4. #include<algorithm>
  5. using namespace std;
  6. int n,m,len,pud[100010];
  7. struct node { int l,r; };
  8. vector <node> pos[1000010];
  9. bool cmp(node a,node b) { return a.l > b.l; }
  10. void deal()
  11. {
  12. node temp; int i,j;
  13. for (i = 1;i<=n;i++)
  14. {
  15. temp.l = i;
  16. j = i;
  17. while (pud[j+1] == pud[i]) j++;
  18. temp.r = j; pos[pud[i]].push_back(temp); i = j;
  19. }
  20. }
  21. void change()
  22. {
  23. int a,b,i; scanf("%d %d",&a,&b);
  24. if (a == b) return;
  25. int nn1 = pos[a].size(),nn2 = pos[b].size(),fact;
  26. if (nn1 == 0) return;
  27. vector <node> :: iterator p;
  28. for (i = 0;i<nn1;i++) pos[b].push_back(pos[a][i]);
  29. pos[a].clear();
  30. sort(pos[b].begin(),pos[b].end(),cmp);
  31. for (p = pos[b].begin();p<pos[b].end()-1;p++)
  32. while (p+1 < pos[b].end()&&(*p).r == (*(p+1)).l-1)
  33. (*p).r = (*(p+1)).r,pos[b].erase(p+1);
  34. fact = pos[b].size(); len = len+fact-nn1-nn2;
  35. }
  36. int main()
  37. {
  38. freopen("1483.in","r",stdin);
  39. freopen("1483.out","w",stdout);
  40. scanf("%d %d",&n,&m);
  41. int i;
  42. for (i = 1;i <= n;i++)
  43. {
  44. scanf("%d",pud+i);
  45. if (pud[i] != pud[i-1]) len++;
  46. }
  47. deal();
  48. while (m--)
  49. {
  50. scanf("%d",&i);
  51. switch (i)
  52. {
  53. case 1: change();break;
  54. default: printf("%d\n",len);break;
  55. }
  56. }
  57. return 0;
  58. }

BZOJ 1483 梦幻布丁的更多相关文章

  1. BZOJ 1483 梦幻布丁(链表+启发式合并)

    给出一个长度为n的序列.支持两种操作: 1.把全部值为x的修改成y.2.询问序列有多少连续段. 我们可以对于每个值建立一个链表.对于操作1,则可以将两个链表合并. 对于操作2,只需要在每次合并链表的时 ...

  2. [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)

    [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...

  3. bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1818  Solved: 761[Submit][Status ...

  4. BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )

    把相同颜色的串成一个链表, 然后每次A操作就启发式合并, 然后计算对答案的影响. ----------------------------------------------------------- ...

  5. BZOJ 1483: [HNOI2009]梦幻布丁 [链表启发式合并]

    1483: [HNOI2009]梦幻布丁 题意:一个带颜色序列,一种颜色合并到另一种,询问有多少颜色段 一种颜色开一个链表,每次遍历小的合并到大的里,顺带维护答案 等等,合并方向有规定? 令col[x ...

  6. bzoj 1483: [HNOI2009]梦幻布丁 启发式合并vector

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description N个 ...

  7. bzoj 1483: [HNOI2009]梦幻布丁

    1483: [HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1 ...

  8. BZOJ 1483:[HNOI2009]梦幻布丁(链表+启发式合并)

    [HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一 ...

  9. 1483: [HNOI2009]梦幻布丁

    1483: [HNOI2009]梦幻布丁 链接 分析: 启发式合并+链表. 代码: #include<cstdio> #include<algorithm> #include& ...

随机推荐

  1. AlphaDict 软件公布

    今天 Release 了 1.1. 主要是移植到了 window 平台, 无须安装,直接执行. 对 UI 又一次进行了设计,应该比之前好看多了. 加入了 生词本 功能,方便 学习外语. ------- ...

  2. [RxJS] Transformation operators: debounce and debounceTime

    Debounce and debounceTime operators are similar to delayWhen and delay, with the difference that the ...

  3. [Javascript] Creating an Immutable Object Graph with Immutable.js Map()

    Learn how to create an Immutable.Map() through plain Javascript object construction and also via arr ...

  4. LINUX 性能 测试 优化工具

    监控 测试 优化

  5. Qt 学习之路 :信号槽

    信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...

  6. linux 管道--转

    linux 管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别. ...

  7. [转] SSH 密钥认证机制

    使用 RSA 密钥对进行 SSH 登录验证 使用 RSA 密钥对验证 SSH 的优点是 1) 不用打密码 2) 比密码验证更安全:缺点是 1) 第一次配置的时候有点麻烦 2) 私钥需要小心保存.Any ...

  8. Apple-Watch开发1

    Communicating between the iOS app and the Watch Extension There are four scenarios where an app and ...

  9. Java——(六)Collection之Queue集合

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...

  10. 如何在windows/wamp环境下在本机配置站点

    1. 在D:\wamp\bin\apache\Apache2.5.4\conf文件夹下,找到httpd.conf,使用记事bej打开它,搜索#Include conf/extra/httpd-vhos ...