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

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

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

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

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

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

这样,我们就可以ac了

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int h[2000000];
int num[2000000];
int head[2000000], ne[2000000];
int len[2000000];
int main(){
    memset(head, -1, sizeof(head));
    int n, m;
    scanf("%d%d", &n, &m);
    int ans = 0;
    for(int i = 1; i <= n; i ++){
        scanf("%d", &h[i]);
        ne[i] = head[h[i]];
        head[h[i]] = i;
        num[h[i]] = h[i];
        if(h[i] != h[i - 1]) ans ++;
        len[h[i]] ++;
    }
    for(int i = 1; i <= m; i ++){
        int op;
        scanf("%d", &op);
        if(op == 2) printf("%d\n", ans);
        else {
            int a, b;
            scanf("%d%d", &a, &b);
            if(a == b) continue;
            if(len[num[a]] > len[num[b]]) swap(num[a], num[b]);
            a = num[a];
            b = num[b];
            if(len[a] == 0) continue;
            for(int j = head[a]; j != -1; j = ne[j]){
                if(h[j - 1] == b) ans --;
                if(h[j + 1] == b) ans --;
            }
            int p;
            for(int j = head[a]; j != -1; j = ne[j]){
                h[j] = b;
                p = j;
            }
            ne[p] = head[b];
            head[b] = head[a];
            len[b] += len[a];
            len[a] = 0;
            head[a] = -1;
        }
    }
    return 0;
} 

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. GitHub的三个按钮

    star 的作用是收藏,目的是方便以后查找. watch 的作用是关注,目的是等作者更新的时候,可以收到通知 fork 的作用是参与,目的是你可以增加新的内容,然后 Pull Request,把你的修 ...

  2. IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

    //代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtto ...

  3. WinForm------PopupMenu控件的使用

    转载: http://www.cnblogs.com/xlx0210/archive/2010/07/14/1777366.html

  4. Eclipse 安装svn插件及使用

    1 安装 参考:http://welcome66.iteye.com/blog/1845176 通过svn插件安装,地址: Links for 1.8.x Release: Eclipse updat ...

  5. C#中操作XML文件

    1.添加结点:XmlNode xmldoc.Load("..\\..\\App.config"); //根元素 XmlElement root = xmldoc.DocumentE ...

  6. Centos6.5安装和使用docker

    rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install docke ...

  7. 关于linux发行版i386/i686/x86-64/的区别

    http://blog.chinaunix.net/uid-20448327-id-172412.html

  8. Mini ORM——PetaPoco笔记(转)

    记录一下petapoco官网博客的一些要点.这些博客记录了PetaPoco是如何一步步改进的. 目录: Announcing PetaPoco PetaPoco-Improvements PetaPo ...

  9. java中的各个数据结构区别

    ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...

  10. Lua 之 userdata

    Lua 之 userdata 在Lua中可以通过自定义类型(user data)与C语言代码更高效.更灵活的交互,从而扩展Lua能够表达的类型. full userdata full userdata ...