【BZOJ 1483】[HNOI2009]梦幻布丁
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
链表,启发式合并。
把x变成y,和y全都变成x.
不论是前者还是后者。连续段的个数都是相同的,不影响结果。
那么我们把x,y中出现次数少的变成出现次数多的就好了。
每次只要O(小的数字的个数)就能完成合并。
(扫描一遍所有的'x'所在的位置,看看有没有和y相邻的,有的话,联通数递减)
如果我们每次都遵循这样的规则,那么每次都可以把少的数字的个数最少乘2.
那么最多log2N次就能把全部数字变成一样的了(这时,无论什么操作都能O(1)做完了
那么复杂度就是nlogn的了。
因为有时候是x变成y
但是y比较少
就等价变成y变成x了
但是这个时候,不能认为y没有了
而是应该认为x没有了。
为了避免之后认为y没有了。
我们需要标记一下现在想去找y,就变成找x了。
(因为我们把y变成了x,但实际操作是x变成了y
一开始f[a[i]] = a[i]
那么swap(f[x],f[y])就好
【代码】
#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int N = 1e6;
int n,m,a[N+10],fz[N+10],_size[N+10],ans = 1;
int fir[N+10],nex[N+10];
void _merge(int x,int y){
if (_size[fz[x]]>_size[fz[y]]) swap(fz[x],fz[y]);
x = fz[x],y = fz[y];
if (x==y) return;
if (fir[x]==0) return;
for (int i = fir[x];i;i = nex[i]){
if (i>1 && a[i-1]==y){
ans--;
}
if (i<n && a[i+1]==y){
ans--;
}
}
for (int i = fir[x];i;i = nex[i]){
a[i] = y;
}
int j;
for (j = fir[x];nex[j];j = nex[j]);
nex[j] = fir[y];
fir[y] = fir[x];
fir[x] = 0;
_size[y]+=_size[x];
_size[x] = 0;
}
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
scanf("%d%d",&n,&m);
rep1(i,1,n) {
scanf("%d",&a[i]);
nex[i] = fir[a[i]];
fir[a[i]] = i;
fz[a[i]] = a[i];
_size[a[i]]++;
}
rep1(i,2,n) if (a[i]!=a[i-1]) ans++;
rep1(i,1,m){
int ope;
scanf("%d",&ope);
if (ope==1){
int x,y;
scanf("%d%d",&x,&y);
_merge(x,y);
}else{
printf("%d\n",ans);
}
}
return 0;
}
【BZOJ 1483】[HNOI2009]梦幻布丁的更多相关文章
- [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)
[BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...
- bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1818 Solved: 761[Submit][Status ...
- BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )
把相同颜色的串成一个链表, 然后每次A操作就启发式合并, 然后计算对答案的影响. ----------------------------------------------------------- ...
- BZOJ 1483: [HNOI2009]梦幻布丁 [链表启发式合并]
1483: [HNOI2009]梦幻布丁 题意:一个带颜色序列,一种颜色合并到另一种,询问有多少颜色段 一种颜色开一个链表,每次遍历小的合并到大的里,顺带维护答案 等等,合并方向有规定? 令col[x ...
- bzoj 1483: [HNOI2009]梦幻布丁 启发式合并vector
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description N个 ...
- bzoj 1483: [HNOI2009]梦幻布丁
1483: [HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1 ...
- bzoj 1483: [HNOI2009]梦幻布丁 (链表启发式合并)
Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input ...
- BZOJ 1483 HNOI2009 梦幻布丁 名单+启示录式的合并
标题效果:特定n布丁.每个人都有一个颜色布丁,所有的布丁反复有一定的颜色变化的颜色,颜色反复询问的段数 数据范围:n<=10W 色彩数<=100W 启发式合并名单0.0 从来不写清楚 实际 ...
- 1483: [HNOI2009]梦幻布丁
1483: [HNOI2009]梦幻布丁 链接 分析: 启发式合并+链表. 代码: #include<cstdio> #include<algorithm> #include& ...
- 1483. [HNOI2009]梦幻布丁【平衡树-splay】
Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input ...
随机推荐
- java中的string trim具体有什么用处。。。
去掉字符串首尾空格 防止不必要的空格导致错误public class test{ public static void main(String[] args) { String str = " ...
- vue 动态拼接地址,使用本地的图片不显示
<el-col :span="4" v-for="(item, index) in listData" :key="index"> ...
- [宏]_IO, _IOR, _IOW, _IOWR 宏的用法与解析
在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...
- [luogu] P2569 [SCOI2010]股票交易 (单调队列优化)
P2569 [SCOI2010]股票交易 题目描述 最近 \(\text{lxhgww}\) 又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,\(\te ...
- ASP.NET-入门
MVC5特点 1.One ASP.NET统一平台 2.Bootstrap 免费CSS,响应式页面 3.路由标记属性:简单.控制器.操作.前缀.参数.URL 4.ASP.NET web API 2 : ...
- HDU 4329 Contest 3
果然换个编译器就过了.总的来说,不难,不过就是处理一些空格.学习了一个新的类 istringstream可以按空格划分.然后,那条式子要理解. 式子的意义是: 找到一个串,该串在query中是第几个找 ...
- 暑假NOIP期末考试【1】—— Phantom
Phantom •题目名称: phantom •时间限制:1 秒 •空间限制:256 MiB 题目描写叙述 在一个无限大的棋盘上.排列着 n * n 枚棋子,形成一个 n 行 n 列的方阵.棋子能够横 ...
- [Javascirpt] Developer-friendly Flow Charts with flowchart.js
Flowchart.js is a great tool for creating quick, simple flowcharts in a way that keeps you out of a ...
- POJ 1765 November Rain
题目大意: 有一些屋顶,相当于一些线段(不想交). 问每一条线段能够接到多少水,相对较低的屋顶能够接到高屋顶留下的水(如题图所看到的).因为y1!=y2,所以保证屋顶是斜的. 解题思路: 扫描线,由于 ...
- WPF silverlight获取子控件(获取DataTemplate里的子控件)
public static class VisualTreeExtensions { /// <summary> /// 获取父节点控件 /// </summary> /// ...