[HNOI2009] 梦幻布丁
[HNOI2009] 梦幻布丁
标签: 链表
题解
可以直接用链表启发式合并做。
合并的细节处理稍微有点麻烦。
假如需要变成另一种颜色的那个颜色的个数更多,那么就肯定不能直接合。
维护一个color数组代表,每个颜色在数组中存的位置。
这样交换color数组之后可以直接合并。
Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
#define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
inline int read()
{
int sum=0,p=1;char ch=getchar();
while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();
if(ch=='-')p=-1,ch=getchar();
while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();
return sum*p;
}
const int maxn=1e5+20;
int n,m,nxt[maxn],sz[maxn*10],col[maxn],start[maxn*10],color[maxn*10],fro[maxn*10];
int ans=0;
inline void init()
{
n=read();
m=read();
REP(i,1,n)
{
col[i]=read();
int x=col[i];
if(col[i-1]!=x)ans++;
if(!start[x])fro[x]=i;
nxt[i]=start[x];
start[x]=i;
sz[x]++;
color[x]=x;
}
}
inline void doing()
{
REP(i,1,m)
{
if(read()==2)printf("%d\n",ans);
else
{
register int y=read(),x=read();
if(x!=y)
{
if(sz[color[x]]<sz[color[y]])swap(color[x],color[y]);
x=color[x];y=color[y];
if(!sz[y])continue;
sz[x]+=sz[y];sz[y]=0;
for(int u=start[y];u;u=nxt[u])ans-=(col[u-1]==x)+(col[u+1]==x);
for(int u=start[y];u;u=nxt[u])col[u]=x;
nxt[fro[y]]=start[x];
start[x]=start[y];
start[y]=0;
sz[y]=0;
start[y]=0;
}
}
}
}
int main()
{
init();
doing();
return 0;
}
[HNOI2009] 梦幻布丁的更多相关文章
- 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个 ...
- 1483: [HNOI2009]梦幻布丁
1483: [HNOI2009]梦幻布丁 链接 分析: 启发式合并+链表. 代码: #include<cstdio> #include<algorithm> #include& ...
- 洛谷 3201 [HNOI2009]梦幻布丁 解题报告
3201 [HNOI2009]梦幻布丁 题目描述 \(N\)个布丁摆成一行,进行\(M\)次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为\(1,2,2 ...
- bzoj 1483: [HNOI2009]梦幻布丁
1483: [HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1 ...
- BZOJ 1483:[HNOI2009]梦幻布丁(链表+启发式合并)
[HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一 ...
- 【BZOJ1483】[HNOI2009]梦幻布丁 链表+启发式合并
[BZOJ1483][HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2 ...
随机推荐
- 使用 IDEA和Maven 整合SSH框架
1.创建web工程 一路next 下去就行.完成后,IDEA会自动构建maven工程. 2.创建如下项目结构 需要将 java文件夹设置为SourcesRoot目录,否则无法创建package 设置操 ...
- 修真院java后端工程师学习课程--任务1(day four)
今天学习的是spring框架,内容主要有: spring的概念,主要是做什么的: Spring是一个基于IOC和AOP的结构J2EE系统的框架 IOC 反转控制 是Spring的基础,Inversio ...
- HTML学习(二)
表格和列表 <!-- /* @dl→definition list(定义列表),ul→unordered list(无序列表),ol→ordered list * @一个完整的表格.table. ...
- 有史以来功能最全,使用最简单的excel导入/导出工具
Github地址:https://github.com/xuanbg/Utility. 还有其他一些福利,请各位园友自取. 构造方法 1.用于导出Excel文件 NpoiHelper(ExcelVer ...
- 在 Tomcat 上配置虚拟主机
.Tomcat 服务器的server.xml文件 (1)Tomcat 组件 Tomcat服务器是由一系列可配置的组件构成,其中核心组件是 Catalina Servlet 容器,它是所有其他 To ...
- 数据仓库搭建——Inmon与Kimball
一.简介 1.1 历史 搞数据仓库这么久,实践中发现首先搭建数据集市,还是清洗数据之后,直接进入数据立方体(形成维度表和实施表)形成核心数据仓库层,是个选择题... 随后发现这其实涉及到了数据仓库的历 ...
- grails项目数据源配置
grails项目数据源配置 mysql: driverClassName : com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/mysql ...
- vue调试神器vue-devtools安装
vue-devtools安装 vue-devtools是一款用来调试Vue应用的Chrome插件,可极大提高开发者调试项目效率,接着我们说一下如何下载安装这个插件; 一. 从chrome商店直接下载安 ...
- records.config文件参数解释
# Process Records Config File # # <RECORD-TYPE> <NAME> <TYPE> <VALUE (till end ...
- grep工具及正则表达式
正则表达式和通配符 正则表达式与通配符不一样,它们表示的含义并不相同!正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串.vim.grep.awk.sed都支持正 ...