题目大意:
  有$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. Robot Framwork +Selenium2环境搭建

    Robot Framwork +Selenium2环境搭建 安装python 参考文章http://blog.csdn.net/sealion111/article/details/78690686 ...

  2. Vue_自定义指令

    关于Vue的自定义指令: - 在Vue中除了核心功能默认内置的指令(v-model & v-show) - Vue也允许注册自定义指令. 注意,在 Vue2.0 中,代码复用和抽象的主要形式是 ...

  3. 1004 Counting Leaves (30 分)(树的遍历)

    给出一棵树,问每一层各有多少叶子节点 dfs遍历树 #include<bits/stdc++.h> using namespace std; vector<]; int n,m; i ...

  4. android系统联系人分组特效实现(1)---分组导航和挤压动画

    1.打开activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr ...

  5. min_free_kbytes是内存最安全值的阈值,然后这个值是怎么影响到系统内存回收的呢?

    min_free_kbytes 内存域水印值:min_free_kbytes 当不设置的时候:sqrt(16M)=4k 4k*4 = 16k 设置内存水印值的函数是: 6792 /* 6793 * I ...

  6. 细说php2[正则表达式学习笔记]

    <细说php>这本书应该是每个php程序员入门的必读书籍,里面讲的很多知识都很系统和详细,看了正则这部分,并练习了里面的案例,发现自己已经会了很多.... header('Content- ...

  7. ConfigurationManager.ConnectionStrings 类库 取不到值 报错 初始化错误

    是因为我把 config 文件写在了 类库中,(擦,很久之前就处理过好多次,总是忘记 写个文章记录下来) 其实应该放在 主目录底下的 web.comfig 里 就是网站项目的 配置文件里,类库找的 是 ...

  8. InputStream 、 InputStreamReader 、 BufferedReader

    1.InputStream.OutputStream 处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputS ...

  9. DataBase -- Count & Group by

    SQL Count()函数: SQL COUNT(column_name)语法:COUNT(column_name)函数返回指定列的值得数目(NULL不计入) select count(column_ ...

  10. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...