[POI2014]Beads
题目大意:
有$n(n\leq10^6)$种颜色,第$i$种颜色有$c_i(\sum c_i\leq10^6)$个,指定第一个颜色为$a$,最后一个颜色为$b$,问对于一个长度为$m=\sum c_i$的序列,是否能构造出一个染色方案满足相邻的颜色不相同。如果能,试构造出一种方案。
思路:
贪心。如果序列中有多个元素,开头结尾颜色相同而这种颜色只有一个,则显然不存在合法方案。每次选取当前数量最多的不同于前一个颜色的颜色,如果有一样多的,就尽量取和最后一个位置的颜色相同的颜色。如果没有可以取的元素或者倒数第二个元素颜色只能选和最后一个元素相同的颜色就说明不存在合法方案。洛谷和BZOJ随便AC,然而SZKOpuł上怎么卡常都是T。
正常代码:
#include<queue>
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=1e6+;
int a[N],c[N];
std::priority_queue<std::pair<int,int> > q;
int main() {
const int n=getint();
a[]=getint(),a[]=getint();
int m=;
for(register int i=;i<=n;i++) {
m+=c[i]=getint();
}
std::swap(a[],a[m]);
c[a[]]--;
if(m!=) c[a[m]]--;
if(c[a[]]<) {
putchar('');
return ;
}
for(register int i=;i<=n;i++) {
if(c[i]) q.push(std::make_pair(c[i],i==a[m]?i+n:i));
}
for(register int i=;i<m;i++) {
int x=q.top().second%n;q.pop();
if(!x) x+=n;
if(x==a[i-]) {
if(q.empty()) {
putchar('');
return ;
}
int y=q.top().second%n;q.pop();
if(!y) y+=n;
q.push(std::make_pair(c[x],x==a[m]?x+n:x));
a[i]=y;
if(--c[y]) q.push(std::make_pair(c[y],y==a[m]?y+n:y));
} else {
a[i]=x;
if(--c[x]) q.push(std::make_pair(c[x],x==a[m]?x+n:x));
}
}
if(a[m-]==a[m]) {
putchar('');
return ;
}
for(register int i=;i<=m;i++) {
printf("%d%c",a[i]," \n"[i==m]);
}
return ;
}
卡常代码:
#pragma GCC optimize(3)
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<cstdio>
#include<climits>
#include<algorithm>
#include<sys/mman.h>
#include<sys/stat.h>
typedef long long int64;
class BufferedInputStream {
private:
char *buf,*p;
int size;
public:
BufferedInputStream() {
register int fd=fileno(stdin);
struct stat sb;
fstat(fd,&sb);
size=sb.st_size;
p=buf=reinterpret_cast<char*>(mmap(,size,PROT_READ,MAP_PRIVATE,fileno(stdin),));
}
char getchar() {
return (p==buf+size||*p==EOF)?EOF:*p++;
}
};
BufferedInputStream in;
inline int getint() {
register char ch;
while(!__builtin_isdigit(ch=in.getchar()));
register int x=ch^'';
while(__builtin_isdigit(ch=in.getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=1e6+;
int a[N],c[N];
class priority_queue {
#define _left <<1
#define _right <<1|1
#define _par >>1
private:
int size;
int64 val[N];
public:
priority_queue() {
val[]=LLONG_MAX;
}
void push(const int64 &x) {
register int p=++size;
for(;val[p _par]<x;p=p _par) {
val[p]=val[p _par];
}
val[p]=x;
}
int64 top() const {
return val[];
}
void pop() {
register int p=;
const int64 x=val[size--];
for(;p _left<=size&&(x<val[p _left]||x<val[p _right]);p=val[p _left]>val[p _right]?p _left:p _right) {
val[p]=std::max(val[p _left],val[p _right]);
}
val[p]=x;
}
bool empty() const {
return !size;
}
#undef _left
#undef _right
#undef _par
};
inline int64 make_pair(const int &x,const int &y) {
return (int64)x<<|y;
}
inline int second(const int &x) {
return x&0x7fffffff;
}
priority_queue q;
int main() {
const int n=getint();
a[]=getint(),a[]=getint();
int m=;
for(register int i=;i<=n;i++) {
m+=c[i]=getint();
}
std::swap(a[],a[m]);
c[a[]]--;
if(__builtin_expect(m!=,)) c[a[m]]--;
if(__builtin_expect(c[a[]]<,)) {
__builtin_puts("");
__builtin_exit();
}
for(register int i=;i<=n;i++) {
if(__builtin_expect(c[i],)) q.push(make_pair(c[i],i==a[m]?i+n:i));
}
for(register int i=;i<m;i++) {
int x=second(q.top());q.pop();
if(__builtin_expect(x>n,)) x-=n;
if(__builtin_expect(x==a[i-],)) {
if(__builtin_expect(q.empty(),)) {
__builtin_puts("");
__builtin_exit();
}
int y=second(q.top());q.pop();
if(__builtin_expect(y>n,)) y-=n;
q.push(make_pair(c[x],x==a[m]?x+n:x));
if(__builtin_expect(--c[a[i]=y],)) q.push(make_pair(c[y],y==a[m]?y+n:y));
} else {
if(__builtin_expect(--c[a[i]=x],)) q.push(make_pair(c[x],x==a[m]?x+n:x));
}
}
if(__builtin_expect(a[m-]==a[m],)) {
__builtin_puts("");
__builtin_exit();
}
for(register int i=;i<=m;i++) {
__builtin_printf("%d%c",a[i]," \n"[i==m]);
}
__builtin_exit();
}
[POI2014]Beads的更多相关文章
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- HDU 1817Necklace of Beads(置换+Polya计数)
Necklace of Beads Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- 【USACO】beads
题目: You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, othe ...
- POJ 1286 Necklace of Beads(Polya原理)
Description Beads of red, blue or green colors are connected together into a circular necklace of n ...
- 【BZOJ】【3522】【POI2014】Hotel
暴力/树形DP 要求在树上找出等距三点,求方案数,那么用类似Free Tour2那样的合并方法,可以写出: f[i][j]表示以 i 为根的子树中,距离 i 为 j 的点有多少个: g[i][j]表示 ...
- 【BZOJ】【3831】【POI2014】Little Bird
DP/单调队列优化 水题水题水题水题 单调队列优化的线性dp…… WA了8次QAQ,就因为我写队列是[l,r),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...
- Bzoj 3831 [Poi2014]Little Bird
3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...
随机推荐
- 常用模块(time)
import time # data = time.time() # 获取时间戳# data = time.localtime() # 获取操作系统时间,也称本地时间,可传入时间戳# data = t ...
- 你的第一个自动化测试:Appium 自动化测试
前言: 这是让你掌握 App 自动化的文章 一.前期准备 本文版权归作者和博客园共有,原创作者:http://www.cnblogs.com/BenLam,未经作者同意必须在文章页面给出原文连接. 1 ...
- OpenStack-Ironic裸金属简介
一,Ironic简述 简而言之,OpenStack Ironic就是一个进行裸机部署安装的项目. 所谓裸机,就是指没有配置操作系统的计算机.从裸机到应用还需要进行以下操作: (1)硬盘RAID ...
- [部署开发环境][1 vagrant] vagrant部署开发环境--安装vagrant
# 安装教程 # 安装vagrant 教程 # 准备 - windows操作系统 - VirtualBox---Win, - vagrant_1.9.3.msi - 镜像文件https://atlas ...
- SQL小助手——SQL Prompt
背景: 当数据库设计的比较复杂.庞大时,我们如果对脚本不是很熟悉,就会很难完成看似简单的增.删.改.查的操作.我们需要一款软件来给出相应的提示或帮助,来提高代码的可读性,更快更好的完成任务. 简介: ...
- [Codeforces 1027 F] Session in BSU [并查集维护二分图匹配问题]
题面 传送门 思路 真是一道神奇的题目呢 题目本身可以转化为二分图匹配问题,要求右半部分选择的点的最大编号最小的一组完美匹配 注意到这里左边半部分有一个性质:每个点恰好连出两条边到右半部分 那么我们可 ...
- PL/SQL 查询结果集直接修改数据
使用t.rowid,查询可以直接在查询结果中修改提交 SELECT t.rowid,t.* from UC_ROLE t where ROLE_NAME like '% %'
- code forces 996D Suit and Tie
D. Suit and Tie time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- 7月15号day7总结
今天复习了springMVC的框架搭建. 思维导图:
- python模块导入
官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: 用于执行的可执行程序文件 ...