题目链接: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. CLR Profiler 性能分析工具

    CLR Profiler 性能分析工具 CLR Profiler 性能分析工具 CLR Profiler 有两个版本,分别用于CLR1.1 和 CLR2.0,至于CLR4试了一些也可以,但不知道是否完 ...

  2. WCF总结笔记

    ------------------------windowform承载服务步骤: (1)定义契约: using System; using System.Collections.Generic; u ...

  3. 数据结构队列的java实现,包括线性和链式两种方式

    实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...

  4. java UDP网路编程

    大家都知道java中的socket网络编程,而其采用的协议分别有tcp和udp协议两种. 通常的理解tcp协议类似于打电话,udp类似于发短信.前者是线程安全的,但是效率比较低.后者则刚好相反. 今天 ...

  5. java反射拼接方法名动态执行方法

    近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者s ...

  6. UML和绘图工具Visio介绍

    UML系列01之 UML和绘图工具Visio介绍 概要 UML,全称是Unified Modeling Language,中文是"统一建模语言".通俗点说,UML是一种创建模型的语 ...

  7. Internal Server Error

    Internal Server Error 说句实在的话,学习jQuery的路是很艰难的,解决某此问题的历程与浪费时间太多. 那些痛苦就不在此分享了. 在家里的电脑能够实现<使用jQuery的$ ...

  8. fancybox关闭弹出窗口parent.$.fancybox.close();

    fancybox弹出窗口右上角会自带一个关闭窗口,并且点击遮罩层也会关闭fancybox 有时我们不需要这样进行关闭,隐藏关闭窗口,并且遮罩层不可点击 在弹出窗口页面加一链接进行关闭使用parent. ...

  9. jQuery LigerUI V1.2.2

    jQuery LigerUI V1.2.2 (包括API和全部源码) 发布 前言 这次版本主要对树进行了加载性能上面的优化,并解决了部分兼容性的问题,添加了几个功能点. 欢迎使用反馈. 相关链接 AP ...

  10. HtmlAgilityPack实战代码

    C#采集代理服务器ip并设置IE代理--HtmlAgilityPack实战代码 今天在博客园看到一篇文章,说是C#采集某某的数据,其实做采集小软件很久了, 用的最好的还是HtmlAgilityPack ...