[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 ...
随机推荐
- ora-01190和ora-01110的解决方法
SQLPLUS>ALTER DATABASE DATAFILE 2 ONLINE; ALTER DATABASE DATAFILE 2 ONLINE * ERROR 位于第 1 行: ORA-0 ...
- java基础学习总结——java读取properties文件总结
摘录自:http://www.cnblogs.com/xdp-gacl/p/3640211.html 一.java读取properties文件总结 在java项目中,操作properties文件是经常 ...
- Django之Model组件
Model组件在django基础篇就已经提到过了,本章介绍更多高级部分. 一.回顾 1.定义表(类) ##单表 from django.db import models class user(mode ...
- uwsgi wsgi nginx centos7.2部署flask
请原谅我比较懒,直接粘贴onenote笔记了 方法一测试完成后,建议用方法三:uwsgi,ginx部署
- JavaScript ES6 let、const
在ES6中,增加了2个声明变量的关键字:let 和 const.在这里将详细介绍let与var的区别.Babel对let的处理以及const的简单使用. 1. let 在ES6规范中增加了 let 关 ...
- 译-BMC Remedy Action Request System权限控制概述
原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于IT ...
- 转-Linux硬件装置和磁盘分区MBR
1 各硬件装置在Linux中的文件名 『在Linux系统中,每个装置都被当成一个文件来对待』 举例来说,SATA接口的硬盘的文件名即为/dev/sd[a-d],其中, 括号内的字母为a-d当中的任意一 ...
- U盘安装CentOS 7问题解决
1 使用U盘安装最新版Centos时报错(CentOS-7-x86_64-DVD-1503-01): 错误提示:"Warning:could not boot;Warning: /dev/r ...
- Python selenium 一个节点两个关联input
HTML代码: 一个节点两个关联input 多出现于密码框 先需要模拟点击进入第一个input,才能激活第二个input. 代码: driver.find_element_by_name('Text ...
- 常用的几个PHP加密函数
1.前言 PHP加密方式分为单项散列加密,对称加密,非对称加密这几类. 像常用的MD5.hash.crypt.sha1这种就是单项散列加密,单项散列加密是不可逆的. 像URL编码.base64编码这种 ...