解题:POI 2014 Bricks----贪心
ydnhaha
·
·
题解
题面
题外话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;
}
```