【BZOJ】3523: [Poi2014]Bricks
2015-11-22 15:56
411 查看
题意
\(n(n \le 1000000)\)个物品,颜色分别为\(a[i]\),现在要求排在一排使得相邻两个砖块的颜色不同,且限定第一个砖块和最后一个砖块的颜色,输出一个合法解否则输出-1。分析
贪心?反正我不会证明。题解
从左到右扫,每次放一个数量最多且合法的砖块,如果数量相同,优先放末尾的。#include <bits/stdc++.h> using namespace std; char Buf[15000000], *buf=Buf; int getint() { int x=0; char c=*buf++; for(; c<'0'||c>'9'; c=*buf++); for(; c>='0'&&c<='9'; x=x*10+c-'0', c=*buf++); return x; } typedef pair<int, int> pii; #define mkpii(a, b) make_pair<int, int> (a, b) const int N=1000005; int c , n, st, ed, m, g=1; priority_queue<pii> q; int main() { fread(Buf, 1, sizeof Buf, stdin); n=getint(), st=getint(), ed=getint(); for(int i=1; i<=n; ++i) { int x=getint(); m+=x; x-=(int)(i==st)+(i==ed); if(x>0) { q.push(mkpii(x, i==ed?n+i:i)); } if(x<0) { g=0; } } if(m==1) { g=1; } c[1]=st==ed?n+st:st; c[m]=n+ed; for(int i=2; i<m; ++i) { pii t=q.top(); q.pop(); if(c[i-1]==t.second && q.size()) { pii t2=q.top(); q.pop(); q.push(t); t=t2; } c[i]=t.second; if(t.first-1) { q.push(mkpii(t.first-1, t.second)); } } for(int i=1; i<m; ++i) { if(c[i]==c[i+1]) { g=0; break; } } if(!g) { puts("0"); return 0; } for(int i=1; i<=m; ++i) { int id=c[i]; printf("%d ", id>n?id-n:id); } return 0; }
相关文章推荐
- QT4 WebView控件使用简单总结
- Mysql 5.6安装成功后,找不到Mysql服务解决方案
- ZZULIOJ 1784 Camellia的难题
- codeforces-510B-Fox And Two Dots【DFS】
- 修改mjextension使用一键归档在iOS9下有一定几率会闪退的bug
- ContentProvider android:exported = “true”
- 谷歌浏览器拦截窗口(以及url解析分别在php和js中)
- 【Eclipse_部署web项目篇】修改eclipse默认指向的WebContent目录作为启动运行加载
- HashMap获取学生信息
- 4-2 多项式求值
- hihocoder1257(构造)(2015北京ACM/ICPC)
- hihocoder1257(构造)(2015北京ACM/ICPC)
- 【BZOJ】3521: [Poi2014]Salad Bar
- SQL函数学习---------STUFF()函数
- bootStrap table实现分页
- 最小m段和问题
- 浏览器HTTP缓存原理分析
- linux搭建基于LNMP的wordpress博客
- ZZULIOJ 1783 简单的求和
- 修改注册表