题目链接:hdu 5997 rausen loves cakes

题意:

给你n个点,每个点有一个颜色,现在有两个操作,第一个操作,将颜色x改为颜色y,第二个操作,询问[x,y]区间有多少颜色段(颜色段的定义为从左往右相同的颜色为一段,遇到不相同的为下一段,ie:144112为4段颜色)

题解:

对于第二个操作我们可以写一个线段树合并来搞定,对于第一个操作,就要用启发式修改来进行,如何启发式?

我们开一个数组来记录每个颜色对应的颜色,最开始都是对应自己,然后开一个vector来记录每个颜色的位置,然后遇到将a颜色改为b颜色,就暴力修改位置数最小的那个,然后记录一下对应的颜色就行了,这样就能将修改操作的总复杂度降到log级别。

 #include<bits/stdc++.h>
#define pb push_back
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std; const int N=1e5+;
int col[N*];
vector<int>cnt[N*];
int t,n,q;
struct node{int l,r,val;}tr[N*]; void up(int rt)
{
tr[rt].l=tr[rt<<].l;
tr[rt].r=tr[rt<<|].r;
tr[rt].val=tr[rt<<].val+tr[rt<<|].val;
if(tr[rt<<].r==tr[rt<<|].l)tr[rt].val--;
} void build(int l=,int r=n,int rt=)
{
if(l==r)
{
scanf("%d",&tr[rt].l);
tr[rt].r=tr[rt].l,tr[rt].val=;
cnt[tr[rt].l].pb(l);
return;
}
int m=l+r>>;
build(ls),build(rs);
up(rt);
} void update(int pos,int b,int l=,int r=n,int rt=)
{
if(l==r)
{
tr[rt].r=tr[rt].l=b,tr[rt].val=;
return;
}
int m=l+r>>;
if(pos<=m)update(pos,b,ls);
else update(pos,b,rs);
up(rt);
} node query(int x,int y,int l=,int r=n,int rt=)
{
if(l==r)return tr[rt];
if(x<=l&&r<=y)return tr[rt];
int m=l+r>>;
node ll,rr,ans;
if(y<=m)ans=query(x,y,ls);
else if(x>m)ans=query(x,y,rs);
else
{
ll=query(x,y,ls);
rr=query(x,y,rs);
ans.l=ll.l,ans.r=rr.r;
if(ll.r!=rr.l)ans.val=ll.val+rr.val;
else ans.val=ll.val+rr.val-;
}
return ans;
} int main(){
scanf("%d",&t);
while(t--)
{
F(i,,)cnt[i].clear(),col[i]=i;
scanf("%d%d",&n,&q);
build();
F(i,,q)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a==)
{
int x=col[b],y=col[c];
if(x==y)continue;
if(cnt[x].size()<cnt[y].size())
{
int en=cnt[x].size()-;
F(j,,en)
{
update(cnt[x][j],y);
cnt[y].pb(cnt[x][j]);
}
cnt[x].clear();
}else
{
col[b]=y,col[c]=x;
int en=cnt[y].size()-;
F(j,,en)
{
update(cnt[y][j],x);
cnt[x].pb(cnt[y][j]);
}
cnt[y].clear();
}
}else printf("%d\n",query(b,c).val);
}
}
return ;
}

hdu 5997 rausen loves cakes(线段数合并+启发式修改)的更多相关文章

  1. HDU 5997 rausen loves cakes(启发式合并 + 树状数组统计答案)

    题目链接  rausen loves cakes 题意  给出一个序列和若干次修改和查询.修改为把序列中所有颜色为$x$的修改为$y$, 查询为询问当前$[x, y]$对应的区间中有多少连续颜色段. ...

  2. BZOJ.4919.[Lydsy1706月赛]大根堆(线段树合并/启发式合并)

    题目链接 考虑树退化为链的情况,就是求一个最长(严格)上升子序列. 对于树,不同子树间是互不影响的.仿照序列上的LIS,对每个点x维护一个状态集合,即合并其子节点后的集合,然后用val[x]替换掉第一 ...

  3. 线段树合并&&启发式合并笔记

    这俩东西听起来很高端,实际上很好写,应用也很多~ 线段树合并 线段树合并,顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息. 考虑如何合并,对于一个结点,如果两颗线段树都有此位置的结点,则直 ...

  4. luogu P5161 WD与数列 SAM 线段树合并 启发式合并

    LINK:WD与数列 这道题可谓妙绝 我明白了一个增量统计的原理. 原本的想法是:差分之后 显然长度为1的单独统计 长度为2的以及更多就是字符串之间的匹配问题了. 对差分序列建立SAM 由于第一个是一 ...

  5. HDU - 1166 - 敌兵布阵 线段树的单点修改,区间求和

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  6. [Vani有约会]雨天的尾巴(树上差分+线段树合并)

    首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋z类型的救济粮. 然后深绘里想知道,当所有的救济粮 ...

  7. 【bzoj2333 & luoguP3273】棘手的操作(线段树合并)

    题目传送门:bzoj2333 luoguP3273 这操作还真“棘手”..听说这题是可并堆题?然而我不会可并堆.于是我就写了线段数合并,然后调了一晚上,数据结构毁一生!!!QAQ…… 其实这题也可以把 ...

  8. HDU 5649 DZY Loves Sorting(二分答案+线段树/线段树合并+线段树分割)

    题意 一个 \(1\) 到 \(n\) 的全排列,\(m\) 种操作,每次将一段区间 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作后的第 \(k\) 位. \(1 \leq n \le ...

  9. hdu 5274 Dylans loves tree(LCA + 线段树)

    Dylans loves tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

随机推荐

  1. 应用CSS的page-break-after属性 实现WEB页面强制分页打印

    虽然dedecms.com向大家介绍了很多CSS属性的相关知识,但有些非常冷门的属性还是有所欠缺.在B/S程序中,对打印页面的控制,CSS相对比较弱,例如: 自动分页, 就基本没啥实际用途.我们通常需 ...

  2. 关于pydev的语法的错误提示

    第三方包引入时,eclipse默认会把一些包定为错误的,错误是:“undefined variable from import...” 其实是对的,可是报错,很烦人 解决方法:window -- pr ...

  3. 重拾C

    重拾C,一天一点点_10 来博客园今天刚好两年了,两年前开始学编程. 忙碌近两个月,项目昨天上线了,真心不容易,也不敢懈怠,接下来的问题会更多.这两天调试服务器,遇到不少麻烦. 刚出去溜达了一下,晚上 ...

  4. poj2236无线网络

    这一题的大意:在救灾当中需要用网络,这堆人就用笔记本建了一个无线网,但是来,互相通信都是有距离限制的,一台电脑只能和距离他为d的电脑通信,然后一台电脑也可以通过几台电脑搭成线这样通信.然后就是输入每台 ...

  5. Weka开发[4]-特征选择

    特征选择,我对这一部分也不熟,大概讲一下,用AttributeSelection进行特征选择,它需要设置3个方面,第一:对属性评价的类(自己到Weka软件里看一下,英文Attribute Evalua ...

  6. jquery扩展方法

    jquery插件的开发包括两种:一种是类级别的插件开发,即给jquery添加新的全局函数,相当于给jquery类本身添加方法. jquery的全局函数就是属于jquery命名空间的函数,另一种是对象级 ...

  7. 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 四 档案的文件系统的压缩和打包

    1.压缩文件案的用途与技术     a.用途,简单来说,就是节约磁盘空间.如果从传输角度讲,占用宽带也会小很多(Apache就有自动压缩的功能,节省宽带资源,提升网站的输出能力)     b.压缩技术 ...

  8. Hadoop Streaming框架学习2

    Hadoop Streaming框架学习(二) 1.常用Streaming命令介绍 使用下面的命令运行Streaming MapReduce程序: 1: $HADOOP_HOME/bin/hadoop ...

  9. 2013 多校联合 2 A Balls Rearrangement (hdu 4611)

    Balls Rearrangement Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  10. EM算法详解

    EM算法详解 1 极大似然估计 假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成 ...