博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[POI2014]Beads
阅读量:6308 次
发布时间:2019-06-22

本文共 4057 字,大约阅读时间需要 13 分钟。

题目大意:

  有$n(n\leq10^6)$种颜色,第$i$种颜色有$c_i(\sum c_i\leq10^6)$个,指定第一个颜色为$a$,最后一个颜色为$b$,问对于一个长度为$m=\sum c_i$的序列,是否能构造出一个染色方案满足相邻的颜色不相同。如果能,试构造出一种方案。

思路:

  贪心。如果序列中有多个元素,开头结尾颜色相同而这种颜色只有一个,则显然不存在合法方案。每次选取当前数量最多的不同于前一个颜色的颜色,如果有一样多的,就尽量取和最后一个位置的颜色相同的颜色。如果没有可以取的元素或者倒数第二个元素颜色只能选和最后一个元素相同的颜色就说明不存在合法方案。洛谷和BZOJ随便AC,然而SZKOpuł上怎么卡常都是T。

正常代码:

1 #include
2 #include
3 #include
4 #include
5 inline int getint() { 6 register char ch; 7 while(!isdigit(ch=getchar())); 8 register int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');10 return x;11 }12 const int N=1e6+1;13 int a[N],c[N];14 std::priority_queue
> q;15 int main() {16 const int n=getint();17 a[1]=getint(),a[2]=getint();18 int m=0;19 for(register int i=1;i<=n;i++) {20 m+=c[i]=getint();21 }22 std::swap(a[2],a[m]);23 c[a[1]]--;24 if(m!=1) c[a[m]]--;25 if(c[a[1]]<0) {26 putchar('0');27 return 0;28 }29 for(register int i=1;i<=n;i++) {30 if(c[i]) q.push(std::make_pair(c[i],i==a[m]?i+n:i));31 }32 for(register int i=2;i
View Code

卡常代码:

1 #pragma GCC optimize(3)  2 #pragma GCC optimize("unroll-loops")  3 #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")  4 #include
5 #include
6 #include
7 #include
8 #include
9 typedef long long int64; 10 class BufferedInputStream { 11 private: 12 char *buf,*p; 13 int size; 14 public: 15 BufferedInputStream() { 16 register int fd=fileno(stdin); 17 struct stat sb; 18 fstat(fd,&sb); 19 size=sb.st_size; 20 p=buf=reinterpret_cast
(mmap(0,size,PROT_READ,MAP_PRIVATE,fileno(stdin),0)); 21 } 22 char getchar() { 23 return (p==buf+size||*p==EOF)?EOF:*p++; 24 } 25 }; 26 BufferedInputStream in; 27 inline int getint() { 28 register char ch; 29 while(!__builtin_isdigit(ch=in.getchar())); 30 register int x=ch^'0'; 31 while(__builtin_isdigit(ch=in.getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 32 return x; 33 } 34 const int N=1e6+1; 35 int a[N],c[N]; 36 class priority_queue { 37 #define _left <<1 38 #define _right <<1|1 39 #define _par >>1 40 private: 41 int size; 42 int64 val[N]; 43 public: 44 priority_queue() { 45 val[0]=LLONG_MAX; 46 } 47 void push(const int64 &x) { 48 register int p=++size; 49 for(;val[p _par]
val[p _right]?p _left:p _right) { 61 val[p]=std::max(val[p _left],val[p _right]); 62 } 63 val[p]=x; 64 } 65 bool empty() const { 66 return !size; 67 } 68 #undef _left 69 #undef _right 70 #undef _par 71 }; 72 inline int64 make_pair(const int &x,const int &y) { 73 return (int64)x<<32|y; 74 } 75 inline int second(const int &x) { 76 return x&0x7fffffff; 77 } 78 priority_queue q; 79 int main() { 80 const int n=getint(); 81 a[1]=getint(),a[2]=getint(); 82 int m=0; 83 for(register int i=1;i<=n;i++) { 84 m+=c[i]=getint(); 85 } 86 std::swap(a[2],a[m]); 87 c[a[1]]--; 88 if(__builtin_expect(m!=1,1)) c[a[m]]--; 89 if(__builtin_expect(c[a[1]]<0,0)) { 90 __builtin_puts("0"); 91 __builtin_exit(0); 92 } 93 for(register int i=1;i<=n;i++) { 94 if(__builtin_expect(c[i],1)) q.push(make_pair(c[i],i==a[m]?i+n:i)); 95 } 96 for(register int i=2;i
n,0)) x-=n; 99 if(__builtin_expect(x==a[i-1],0)) {100 if(__builtin_expect(q.empty(),0)) {101 __builtin_puts("0");102 __builtin_exit(0);103 }104 int y=second(q.top());q.pop();105 if(__builtin_expect(y>n,0)) y-=n;106 q.push(make_pair(c[x],x==a[m]?x+n:x));107 if(__builtin_expect(--c[a[i]=y],1)) q.push(make_pair(c[y],y==a[m]?y+n:y));108 } else {109 if(__builtin_expect(--c[a[i]=x],1)) q.push(make_pair(c[x],x==a[m]?x+n:x));110 }111 }112 if(__builtin_expect(a[m-1]==a[m],0)) {113 __builtin_puts("0");114 __builtin_exit(0);115 }116 for(register int i=1;i<=m;i++) {117 __builtin_printf("%d%c",a[i]," \n"[i==m]);118 }119 __builtin_exit(0);120 }
View Code

 

转载于:https://www.cnblogs.com/skylee03/p/8659946.html

你可能感兴趣的文章
Android选择本地图片过大程序停止的经历
查看>>
poj 2187:Beauty Contest(旋转卡壳)
查看>>
《Flask Web开发》里的坑
查看>>
Python-库安装
查看>>
Git笔记
查看>>
普通人如何从平庸到优秀,在到卓越
查看>>
SLAM数据集
查看>>
c#学习笔记05——数组&集合
查看>>
【图论算法】Dijstra&BFS
查看>>
注册和上传文件(头像)
查看>>
使用OVS
查看>>
键盘回收的几种方法
查看>>
Python(条件判断和循环)
查看>>
day4 linux安装python
查看>>
LeetCode Container With Most Water (Two Pointers)
查看>>
vue (v-if show 问题)
查看>>
https基础
查看>>
css3 canvas之刮刮卡效果
查看>>
并查集模板
查看>>
RESTful Mongodb
查看>>