[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][ ...
随机推荐
- 一个初学者的辛酸路程-jQuery
前言: 主要概要: 1.HTML+CSS补充 2.DOM事件 3.jQuery示例 内容概要: 1.布局 代码如下 <!DOCTYPE html> <html lang=" ...
- day02-python基础2
操作 列表是用来存储一组数据,可以实现对列表中元素的增删改查等操作. 转换: list(string):把字符串转为列表 声明: 列表使用方括号 查询: 根据元素下标获取列表中元素的值 切片: [0: ...
- VB.NET概述
简介 Visual Basic .NET属Basic系语言,VB.NET是一门高级的编程语言,当然在Basic系语言中VB.NET也确实是迄今为止最强大的一门编程语言.Visual Basic .NE ...
- 可以在函数中间打点了,以分析bpf_prog_load函数为例
可以在函数中间打点了, sudo stap -L 'process("./test").statement("func@test.c:10")' //12.10 ...
- LeetCode -- Product of Array Except Self My Submissions Question
Question: Given an array of n integers where n > 1, nums, return an array output such that output ...
- thr [树链剖分+dp]
题面 思路 首先,可以有一个$dp$的思路 不难发现本题中,三个点如果互相距离相同,那么一定有一个"中心点"到三个点的距离都相同 那么我们可以把本题转化计算以每个点为根的情况下,从 ...
- BZOJ4031 [HEOI2015]小Z的房间 【矩阵树定理 + 高斯消元】
题目链接 BZOJ4031 题解 第一眼:这不裸的矩阵树定理么 第二眼:这个模\(10^9\)是什么鬼嘛QAQ 想尝试递归求行列式,发现这是\(O(n!)\)的.. 想上高斯消元,却又处理不了逆元这个 ...
- 提取URL字符串的搜索字符串中的参数
function urlArgs() { var args = []; var query = location.search.substring(1); var paris = query.spli ...
- Python设置函数调用超时
http://blog.sina.com.cn/s/blog_63041bb80102uy5o.html 背景: 最近写的Python代码不知为何,总是执行到一半卡住不动,为了使程序能够 ...
- HDU5187 zhx's contest
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission ...