题目大意:
  有$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的更多相关文章

  1. BZOJ 3524: [Poi2014]Couriers [主席树]

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1892  Solved: 683[Submit][St ...

  2. HDU 1817Necklace of Beads(置换+Polya计数)

    Necklace of Beads Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  3. BZOJ 3524: [Poi2014]Couriers

    3524: [Poi2014]Couriers Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1905  Solved: 691[Submit][St ...

  4. [BZOJ3872][Poi2014]Ant colony

    [BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...

  5. 【USACO】beads

    题目: You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, othe ...

  6. POJ 1286 Necklace of Beads(Polya原理)

    Description Beads of red, blue or green colors are connected together into a circular necklace of n ...

  7. 【BZOJ】【3522】【POI2014】Hotel

    暴力/树形DP 要求在树上找出等距三点,求方案数,那么用类似Free Tour2那样的合并方法,可以写出: f[i][j]表示以 i 为根的子树中,距离 i 为 j 的点有多少个: g[i][j]表示 ...

  8. 【BZOJ】【3831】【POI2014】Little Bird

    DP/单调队列优化 水题水题水题水题 单调队列优化的线性dp…… WA了8次QAQ,就因为我写队列是[l,r),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...

  9. Bzoj 3831 [Poi2014]Little Bird

    3831: [Poi2014]Little Bird Time Limit: 20 Sec Memory Limit: 128 MB Submit: 310 Solved: 186 [Submit][ ...

随机推荐

  1. Python 自学 Day1

    作业二:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 #!/usr/bin/env python import getpass def log(): uname = input ...

  2. 关于python中的 if __name__ == 'main'

    name 是内置变量,它表示的是当前所在模块的名字,同时还能反应一个包的结构. a ├── b │   ├── c.py │   └── __init__.py └── __init__.py 目录中 ...

  3. matlab使用摄像头人脸识别

    #关于matlab如何读取图片.视频.摄像头设备数据# 参见:http://blog.csdn.net/u010177286/article/details/45646173 但是,关于摄像头读取,上 ...

  4. Struts2+DAO层实现实例03——添加监听器跟踪用户行为

    实例说明 根据上两次的成品进行二次加工. 加入Listener,监听用户的登陆注销情况. 所用知识说明 采用SessionBindingListener对Session进行监听. 同时,Action中 ...

  5. Qt编程的一些技巧

    1.Qt程序在运行过程中,调用函数(如lcdNumber->display(num))显示数据到界面上时,并不会马上刷新屏幕显示,而是要等主程序运行到函数a.exec()时,才刷新屏幕,如下 因 ...

  6. Spring 对数据库的支持

    DAO DAO是用于访问数据的对象,大多数时候,我们将数据保存在数据库中,但这不是唯一选择. 用户也可以将数据保存在数据文件或者LDAP中 DAO屏蔽了数据操作的具体细节 Spring本质上希望能够以 ...

  7. GeoIP2 数据库更新地址

    GeoIP2 数据库更新地址 数据库文件下载网页地址 http://dev.maxmind.com/geoip/geoip2/geolite2/ http://geolite.maxmind.com/ ...

  8. 《R语言实战》读书笔记 第七章--基本统计分析

    在导入数据并且将数据进行组织和初步可视化以后,需要对数据进行分布探索和两两关系分析等.主要内容有描述性统计分析.频数表和列联表.相关系数和协方差.t检验.非参数统计. 7.1描述性统计分析 7.1.1 ...

  9. poj 2187 Beauty Contest(二维凸包旋转卡壳)

    D - Beauty Contest Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  10. md5 加解密

    using JGDJWeb.Model; using System; using System.Collections.Generic; using System.IO; using System.L ...