1、题目大意:这题就是给你一个序列,有两个操作,一个是询问序列中的连续段数,比如序列 1 2 2 1就是三段。。

1是一段,2 2 又是一段,1又是一段,就是相同的在一起,第二个操作就是将其中的一种数全都改成另一种数

2、分析:这道题看起来做需要o(n^2),这是过不了的,我们需要nlogn的算法,怎么实现修改是均摊logn的呢。。

我们把两个链表合并是O(1)这个是一定的,但是修改答案是o(n)的对吧,那怎么办呢,

我们算修改答案把len小的合并到大的,仔细算算,其实算不了几次,这样就o(n),

我们还要存一个编号,就是一个数在链表里的编号

这样,我们就可以ac了

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. int h[2000000];
  7. int num[2000000];
  8. int head[2000000], ne[2000000];
  9. int len[2000000];
  10. int main(){
  11. memset(head, -1, sizeof(head));
  12. int n, m;
  13. scanf("%d%d", &n, &m);
  14. int ans = 0;
  15. for(int i = 1; i <= n; i ++){
  16. scanf("%d", &h[i]);
  17. ne[i] = head[h[i]];
  18. head[h[i]] = i;
  19. num[h[i]] = h[i];
  20. if(h[i] != h[i - 1]) ans ++;
  21. len[h[i]] ++;
  22. }
  23. for(int i = 1; i <= m; i ++){
  24. int op;
  25. scanf("%d", &op);
  26. if(op == 2) printf("%d\n", ans);
  27. else {
  28. int a, b;
  29. scanf("%d%d", &a, &b);
  30. if(a == b) continue;
  31. if(len[num[a]] > len[num[b]]) swap(num[a], num[b]);
  32. a = num[a];
  33. b = num[b];
  34. if(len[a] == 0) continue;
  35. for(int j = head[a]; j != -1; j = ne[j]){
  36. if(h[j - 1] == b) ans --;
  37. if(h[j + 1] == b) ans --;
  38. }
  39. int p;
  40. for(int j = head[a]; j != -1; j = ne[j]){
  41. h[j] = b;
  42. p = j;
  43. }
  44. ne[p] = head[b];
  45. head[b] = head[a];
  46. len[b] += len[a];
  47. len[a] = 0;
  48. head[a] = -1;
  49. }
  50. }
  51. return 0;
  52. }

BZOJ1483——[HNOI2009]梦幻布丁的更多相关文章

  1. bzoj1483: [HNOI2009]梦幻布丁(vector+启发式合并)

    1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 4022  Solved: 1640[Submit][Statu ...

  2. 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁

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

  3. BZOJ1483 [HNOI2009]梦幻布丁 【链表 + 启发式合并】

    题目 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入格式 第一行给出N,M表示 ...

  4. BZOJ1483: [HNOI2009]梦幻布丁

    传送门 名字起得很高端实际上很简单的算法hhh 启发式合并 简单讲就是一些合并一堆队列的题可以用启发式合并,或者说这是一个思想.每次把小的合并到大的部分,均摊复杂度$O(MlogN)$. //BZOJ ...

  5. bzoj1483: [HNOI2009]梦幻布丁(链表+启发式合并)

    题目大意:一个序列,两种操作. ①把其中的一种数修改成另一种数 ②询问有多少段不同的数如1 2 2 1为3段(1 / 2 2 / 1). 昨晚的BC的C题和这题很类似,于是现学现写居然过了十分开心. ...

  6. 【BZOJ1483】[HNOI2009]梦幻布丁 链表+启发式合并

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

  7. 【bzoj1483】[HNOI2009]梦幻布丁 set

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

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

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

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

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

随机推荐

  1. 闭包->类的实例数组排序

    简单的字符串数组排序就一句话 Arr.sort(function(s1,s2){return s1.localeCompare(s2));//升序 Arr.sort(function(s1,s2){r ...

  2. ioctlsocket()

    ioctlsocket()是控制套接口的模式. 外文名 ioctlsocket() 含    义 控制套接口的模式 头文件 #include <winsock.h> 性    质 函数 目 ...

  3. jQuery validate 验证隐藏域

    $.validator.setDefaults({ ignore: '' }); 不要加载jQuery ready中,什么改写changelog ,那是扯蛋

  4. Java数据结构与排序算法——堆和堆排序

    //================================================= // File Name : Heap_demo //--------------------- ...

  5. cmake 编译 c++ dll 的一个例子(更新2:增加 python 调用方法)

    CMakeLists.txt project(xxx) add_library(xxx SHARED xxx.cpp) add_executable(yyy yyy.cpp) target_link_ ...

  6. C# Pointer types

    https://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

  7. Autofac.Integration.Owin

    public static IAppBuilder UseAutofacMiddleware(this IAppBuilder app, ILifetimeScope container) { if ...

  8. centos 7.0 修改ssh默认连接22端口 和 添加防火墙firewalld 通过端口

    首先 先做的就是 修改ssh的默认端口22 需要修改文件 /etc/ssh/sshd_config 使用命令 vi /etc/ssh/sshd_config [root@localhost ~]# v ...

  9. Python之路【第十一篇续】前端之CSS补充

    CSS续 1.标签选择器 为类型标签设置样式例如:<div>.<a>.等标签设置一个样式,代码如下: <style> /*标签选择器,如果启用标签选择器所有指定的标 ...

  10. jQuery,title、仿title功能整理

    如图:仿 title="查看" note="查看",note 可换成其他 样式: /*重写,标签title层*/#titleRewrite {position: ...