【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

链表,启发式合并。

把x变成y,和y全都变成x.

不论是前者还是后者。连续段的个数都是相同的,不影响结果。

那么我们把x,y中出现次数少的变成出现次数多的就好了。

每次只要O(小的数字的个数)就能完成合并。

(扫描一遍所有的'x'所在的位置,看看有没有和y相邻的,有的话,联通数递减)

如果我们每次都遵循这样的规则,那么每次都可以把少的数字的个数最少乘2.

那么最多log2N次就能把全部数字变成一样的了(这时,无论什么操作都能O(1)做完了

那么复杂度就是nlogn的了。

因为有时候是x变成y

但是y比较少

就等价变成y变成x了

但是这个时候,不能认为y没有了

而是应该认为x没有了。

为了避免之后认为y没有了。

我们需要标记一下现在想去找y,就变成找x了。

(因为我们把y变成了x,但实际操作是x变成了y

一开始f[a[i]] = a[i]

那么swap(f[x],f[y])就好

【代码】

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  4. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  5. #define all(x) x.begin(),x.end()
  6. #define pb push_back
  7. #define lson l,mid,rt<<1
  8. #define rson mid+1,r,rt<<1|1
  9. using namespace std;
  10. const double pi = acos(-1);
  11. const int dx[4] = {0,0,1,-1};
  12. const int dy[4] = {1,-1,0,0};
  13. const int N = 1e6;
  14. int n,m,a[N+10],fz[N+10],_size[N+10],ans = 1;
  15. int fir[N+10],nex[N+10];
  16. void _merge(int x,int y){
  17. if (_size[fz[x]]>_size[fz[y]]) swap(fz[x],fz[y]);
  18. x = fz[x],y = fz[y];
  19. if (x==y) return;
  20. if (fir[x]==0) return;
  21. for (int i = fir[x];i;i = nex[i]){
  22. if (i>1 && a[i-1]==y){
  23. ans--;
  24. }
  25. if (i<n && a[i+1]==y){
  26. ans--;
  27. }
  28. }
  29. for (int i = fir[x];i;i = nex[i]){
  30. a[i] = y;
  31. }
  32. int j;
  33. for (j = fir[x];nex[j];j = nex[j]);
  34. nex[j] = fir[y];
  35. fir[y] = fir[x];
  36. fir[x] = 0;
  37. _size[y]+=_size[x];
  38. _size[x] = 0;
  39. }
  40. int main(){
  41. #ifdef LOCAL_DEFINE
  42. freopen("rush_in.txt", "r", stdin);
  43. #endif
  44. scanf("%d%d",&n,&m);
  45. rep1(i,1,n) {
  46. scanf("%d",&a[i]);
  47. nex[i] = fir[a[i]];
  48. fir[a[i]] = i;
  49. fz[a[i]] = a[i];
  50. _size[a[i]]++;
  51. }
  52. rep1(i,2,n) if (a[i]!=a[i-1]) ans++;
  53. rep1(i,1,m){
  54. int ope;
  55. scanf("%d",&ope);
  56. if (ope==1){
  57. int x,y;
  58. scanf("%d%d",&x,&y);
  59. _merge(x,y);
  60. }else{
  61. printf("%d\n",ans);
  62. }
  63. }
  64. return 0;
  65. }

【BZOJ 1483】[HNOI2009]梦幻布丁的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. BZOJ 1483 HNOI2009 梦幻布丁 名单+启示录式的合并

    标题效果:特定n布丁.每个人都有一个颜色布丁,所有的布丁反复有一定的颜色变化的颜色,颜色反复询问的段数 数据范围:n<=10W 色彩数<=100W 启发式合并名单0.0 从来不写清楚 实际 ...

  9. 1483: [HNOI2009]梦幻布丁

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

  10. 1483. [HNOI2009]梦幻布丁【平衡树-splay】

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

随机推荐

  1. Python学习笔记(一):基本数据类型

    在Python3种,有六种标准数据类型: 数字(Number) 字符串(String) 列表(List) 元组(Tuple) 集合(Set) 字典(Dictionary) 这六种数据类型中,数字类型和 ...

  2. WPF原生环形图表

    原文:WPF原生环形图表 版权声明:欢迎转载.转载请注明出处,谢谢 https://blog.csdn.net/wzcool273509239/article/details/56480963 主要利 ...

  3. css预编译器——Less的使用

      方法一:仅介绍在客户端环境下使用的方法 1 新建test.less并引入.less该文件(和css一样在head处引入),注意rel="stylesheet/less": &l ...

  4. java字符文件的读写

    1.java文件读写,首先我们需要导入相应的包:java.io.*; 2.代码如下: package Demo1; import java.io.*; public class FileWirteTe ...

  5. PatentTips - Safe general purpose virtual machine computing system

    BACKGROUND OF THE INVENTION The present invention relates to virtual machine implementations, and in ...

  6. ASP.NET-属性与过滤器

    目的:在调用操作之前或者之后执行特定的逻辑代码 系统定义: 1.日志记录 2.防图像盗链  3.爬虫 4.本地化,用于设定区域设置 5.动态操作,用于将操作注入到控制器当中 用来过滤HTTP请求 高级 ...

  7. POJ 2183

    模拟题 #include <iostream> #include <cstdio> #include <algorithm> using namespace std ...

  8. 开源TT框架上的日志类

    public class Logger { /** * log tag */ private String tagName = "MoGuLogger";// tag name / ...

  9. [LeetCOde][Java] Best Time to Buy and Sell Stock III

    题目: Say you have an array for which the ith element is the price of a given stock on day i. Design a ...

  10. sql系列(基础篇)-第一章 关于sysdate

    第一章 主要的SQL语句  1. 查询数据库系统时间,常以server默认的格式进行显示(依据数据库的字符集而定): 注意:dual 为数据库中的虚表,隶属于管理员 sys 用户,但全部的用户都能够訪 ...