【bzoj1483】 HNOI2009—梦幻布丁
http://www.lydsy.com/JudgeOnline/problem.php?id=1483 (题目链接)
题意
$n$个布丁摆成一行,进行$m$次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.
Solution
链表启发式合并。由于size大小而要交换两个链表的时候有点蛋疼,需要开一个数组来存当前颜色的实际颜色是什么。
细节
数据范围$10^6$
代码
// bzoj1483
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=1000010;
int size[maxn],head[maxn],next[maxn],c[maxn],fa[maxn];
int n,m,ans; void merge(int x,int y) {
for (int i=head[x];i;i=next[i]) {
if (c[i-1]==y) ans--;
if (c[i+1]==y) ans--;
}
for (int i=head[x];i;i=next[i]) {
c[i]=y;
if (!next[i]) {next[i]=head[y],head[y]=head[x];break;}
}
size[y]+=size[x];head[x]=size[x]=0;
}
int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) {
scanf("%d",&c[i]);
if (c[i]!=c[i-1]) ans++;
fa[c[i]]=c[i];
next[i]=head[c[i]],head[c[i]]=i;
size[c[i]]++;
}
for (int op,x,y,i=1;i<=m;i++) {
scanf("%d",&op);
if (op==2) printf("%d\n",ans);
if (op==1) {
scanf("%d%d",&x,&y);
if (size[fa[x]]>size[fa[y]]) swap(fa[x],fa[y]);
x=fa[x],y=fa[y];
if (x==y || size[x]==0) continue;
merge(x,y);
}
}
return 0;
}
【bzoj1483】 HNOI2009—梦幻布丁的更多相关文章
- bzoj1483: [HNOI2009]梦幻布丁(vector+启发式合并)
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 4022 Solved: 1640[Submit][Statu ...
- 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁
Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第 ...
- BZOJ1483 [HNOI2009]梦幻布丁 【链表 + 启发式合并】
题目 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色. 例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入格式 第一行给出N,M表示 ...
- BZOJ1483: [HNOI2009]梦幻布丁
传送门 名字起得很高端实际上很简单的算法hhh 启发式合并 简单讲就是一些合并一堆队列的题可以用启发式合并,或者说这是一个思想.每次把小的合并到大的部分,均摊复杂度$O(MlogN)$. //BZOJ ...
- BZOJ1483——[HNOI2009]梦幻布丁
1.题目大意:这题就是给你一个序列,有两个操作,一个是询问序列中的连续段数,比如序列 1 2 2 1就是三段.. 1是一段,2 2 又是一段,1又是一段,就是相同的在一起,第二个操作就是将其中的一种数 ...
- bzoj1483: [HNOI2009]梦幻布丁(链表+启发式合并)
题目大意:一个序列,两种操作. ①把其中的一种数修改成另一种数 ②询问有多少段不同的数如1 2 2 1为3段(1 / 2 2 / 1). 昨晚的BC的C题和这题很类似,于是现学现写居然过了十分开心. ...
- 【BZOJ1483】[HNOI2009]梦幻布丁 链表+启发式合并
[BZOJ1483][HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2 ...
- 【bzoj1483】[HNOI2009]梦幻布丁 set
[bzoj1483][HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2 ...
- bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1818 Solved: 761[Submit][Status ...
- BZOJ 1483: [HNOI2009]梦幻布丁( 链表 + 启发式合并 )
把相同颜色的串成一个链表, 然后每次A操作就启发式合并, 然后计算对答案的影响. ----------------------------------------------------------- ...
随机推荐
- kubernetes高可用设计-CA,etcd
环境准备: master01:192.168.150.128 master02:192.168.150.130 master03:192.168.150.131 node01:192.168.150. ...
- 从零开始的Python学习Episode 21——socket基础
socket基础 网络通信要素: A:IP地址 (1) 用来标识网络上一台独立的主机 (2) IP地址 = 网络地址 + 主机地址(网络号:用于识别主机所在的网络/网段.主机号:用于识别该网络中的 ...
- js传输txt文档内容
要求:实现修改text文档内容,即可将text修改内容传到页面显示: HTML: <!doctype html> <html lang="en"> < ...
- 第十三次ScrumMeeting博客
第十三次ScrumMeeting博客 本次会议于12月3日(六)21时30分整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕. 1. 每个人的工作(有Issue的内容和链 ...
- js/jquery去掉空格,回车,换行示例代码
Jquery: $("#accuracy").val($("#accuracy").val().replace(/\ +/g,""));// ...
- Beta版发布 - 感谢有你们
在本次Beta版开发的过程中,很感谢组长王航对我的信任,让我统筹大家的工作任务和进度,使我对项目管理有了深刻的理解. 我也要感谢邹双黛,在beta版开发中因为邹双黛的帮助,我对于文字类工作已经越来越得 ...
- Notes of Daily Scrum Meeting(11.4)
Notes of Daily Scrum Meeting 2014年11月4日 星期二 20:30—21:00 团队成员 今日团队任务 当日工作分配额 完成情况 陈少杰 阅读理解代码中底层与数据库 ...
- DPDK flow_filtering 源码阅读
代码部分 main.c /*- * BSD LICENSE * * Copyright 2017 Mellanox. * * Redistribution and use in source and ...
- 利用CNN进行多分类的文档分类
# coding: utf-8 import tensorflow as tf class TCNNConfig(object): """CNN配置参数"&qu ...
- Mac 下搭建 Apache 服务器
Apache作为最流行的Web服务器端软件之一,它的优点与地位不言而喻.下面介绍下在Mac下搭建Apache服务器的步骤: (1)“前往” –>”个人” (2)在你的个人目录下新建一个文件夹,改 ...