hdu 5997 rausen loves cakes(线段数合并+启发式修改)
题目链接: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(线段数合并+启发式修改)的更多相关文章
- HDU 5997 rausen loves cakes(启发式合并 + 树状数组统计答案)
题目链接 rausen loves cakes 题意 给出一个序列和若干次修改和查询.修改为把序列中所有颜色为$x$的修改为$y$, 查询为询问当前$[x, y]$对应的区间中有多少连续颜色段. ...
- BZOJ.4919.[Lydsy1706月赛]大根堆(线段树合并/启发式合并)
题目链接 考虑树退化为链的情况,就是求一个最长(严格)上升子序列. 对于树,不同子树间是互不影响的.仿照序列上的LIS,对每个点x维护一个状态集合,即合并其子节点后的集合,然后用val[x]替换掉第一 ...
- 线段树合并&&启发式合并笔记
这俩东西听起来很高端,实际上很好写,应用也很多~ 线段树合并 线段树合并,顾名思义,就是建立一棵新的线段树保存原有的两颗线段树的信息. 考虑如何合并,对于一个结点,如果两颗线段树都有此位置的结点,则直 ...
- luogu P5161 WD与数列 SAM 线段树合并 启发式合并
LINK:WD与数列 这道题可谓妙绝 我明白了一个增量统计的原理. 原本的想法是:差分之后 显然长度为1的单独统计 长度为2的以及更多就是字符串之间的匹配问题了. 对差分序列建立SAM 由于第一个是一 ...
- HDU - 1166 - 敌兵布阵 线段树的单点修改,区间求和
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- [Vani有约会]雨天的尾巴(树上差分+线段树合并)
首先村落里的一共有n座房屋,并形成一个树状结构.然后救济粮分m次发放,每次选择两个房屋(x,y),然后对于x到y的路径上(含x和y)每座房子里发放一袋z类型的救济粮. 然后深绘里想知道,当所有的救济粮 ...
- 【bzoj2333 & luoguP3273】棘手的操作(线段树合并)
题目传送门:bzoj2333 luoguP3273 这操作还真“棘手”..听说这题是可并堆题?然而我不会可并堆.于是我就写了线段数合并,然后调了一晚上,数据结构毁一生!!!QAQ…… 其实这题也可以把 ...
- HDU 5649 DZY Loves Sorting(二分答案+线段树/线段树合并+线段树分割)
题意 一个 \(1\) 到 \(n\) 的全排列,\(m\) 种操作,每次将一段区间 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作后的第 \(k\) 位. \(1 \leq n \le ...
- hdu 5274 Dylans loves tree(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
随机推荐
- Liunx readlink命令
readlink命令 分类: Shell 2013-07-13 16:41 417人阅读 评论(0) 收藏 举报 readlink是linux系统中一个常用工具,主要用来找出符号链接所指向的位置. 在 ...
- Android Wear和二维码
这是一篇发布在Android官方开发者社区博客,15年年初的时候就看到了这篇文章,直到现在才有时间把它翻译下来. 这是一篇如何在Android Wear上面如何正确地展示二维码的文章,里面有许多的经验 ...
- C++中的静态多态和动态多态
C++中的静态多态和动态多态 今天的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural).面向对象形式( ...
- Ubuntu中的.bashrc文件
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置./etc/bashrc:为每一个运 ...
- ASP.NET Web API的HttpController是如何被激活的?
ASP.NET Web API的HttpController是如何被激活的? HttpController与HttpControllerDescriptor 程序集的解析 HttpController ...
- 搞定KMP匹配算法
KMP算法介绍及实现——轻松搞定KMP匹配算法 本文介绍了字符串匹配算法中的BF算法和KMP算法.本文中KMP算法介绍部分是关于KMP算法相关文章中最简洁的一篇文章之一.下一篇将继续介绍Horspoo ...
- 寻找最大的k个数
这个题目是非常经典的一个题目,解法也有很多,现在就把我已经理解的解法记录下来. 题目描述 有n个无序的数,它们各不相等,怎样选出其中的最大的k个数呢? 题目分析: 解法1: 最容易想到的就是把n个数进 ...
- OSGI原形(.NET)
OSGI原形(.NET) 目前只做了基础的功能,比如: 各个模块单独的AppDomain容器 Activator激活 导出的服务检查 不过,虽说这样,但目前的这个版本已经能实现模块分离.互相依赖调用等 ...
- 解决jqplot与jquery-ui导入必要包时的冲突
解决jqplot与jquery-ui导入必要包时的冲突 对于一个网页中,即要有jqplot的画图,又要有jquery-ui的风格显示! 但在导入必要的包时,出现了问题! 先导入jqplot的必要包: ...
- 竞价广告系统-逻辑回归优化方法-L-BFGS
逻辑回归优化方法-L-BFGS 逻辑回归的优化方法是一个经典的问题,如果我们把它视为一个最大熵模型,那么我们知道最早的优化方法是IIS,这个方法就不细讲了,因为它速度很慢.后来发现在最优化领域中非常常 ...