解题:POI 2014 Bricks----贪心

· · 题解

题面

题外话1:洛谷上POI的翻译怎么老出锅。。。无解要输出0。。。

题外话2:先%一发下面颜神的带权线段树233

注意细节quq ```cpp #include<queue> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int outp[1000009]; int n,b,e,rd,tot,noww; struct a{int col,num;}; bool operator <(a x,a y) { return (x.num==y.num)?x.col!=e:x.num<y.num; } priority_queue<a> qs; int main () { scanf("%d%d%d",&n,&b,&e); for(int i=1;i<=n;i++) { scanf("%d",&rd); tot+=rd; if(i==b) rd--; if(i==e) rd--; if(rd>0) qs.push((a){i,rd}); else if(rd<0) {printf("0");return 0;} } outp[1]=b,noww=b; for(int i=2;i<tot;i++) { a tn=qs.top();qs.pop(); int ttp=tn.col,tmp=tn.num; if(ttp==noww) if(!qs.empty()) { a tm=qs.top();qs.pop(); int tpp=tm.col,tep=tm.num; outp[i]=tpp; noww=tpp; if(tep>1) qs.push((a){tpp,tep-1}); qs.push(tn); continue ; } else { printf("0"); return 0; } noww=ttp; outp[i]=ttp; if(tmp>1) qs.push((a){ttp,tmp-1}); } outp[tot]=e; for(int i=1;i<tot;i++) if(outp[i]==outp[i+1]||!outp[i]) { printf("0"); return 0; } for(int i=1;i<=tot;i++) { printf("%d",outp[i]); if(i!=tot) printf(" "); } return 0; } ```