[BZOJ1293]SCOI2009生日礼物|贪心

来源:互联网 发布:unity3d克隆物体 编辑:程序博客网 时间:2024/04/28 07:50

这题好像有很多的乱搞方法。。我想的方法是贪心,考虑以i为右端点的最小覆盖了全部颜色的区间的左端点l,发现i增加的时候l显然是不降的,那就好办了,从1-n扫一遍,不断维护l,不断更新答案就行了。。

   还有一种做法是弄出每种颜色出现的第一个位置和下一个位置,一开始把所有第一个位置找出来,放进一个堆,然后更新答案,每次把最左的那个颜色取出,将它的下一个位置加入堆,不断更新答案。。

#include<cstdio>#include<iostream>#include<algorithm>#define N 1000005#define inf 0x3fffffffusing namespace std;struct edge{int col,next;}ed[N];struct num{int x,xu;}q[N];int n,k,i,j,t,x,l,kind,ans=inf,ne=0,cnt=0,tot=0,newq[N],a[N],u[65];bool f;bool cmp(num a,num b){return a.x<b.x;}void add(int s,int col){ed[++ne].col=col;ed[ne].next=a[s];a[s]=ne;}int main(){scanf("%d%d",&n,&k);for (i=1;i<=k;i++){scanf("%d",&t);u[i]=0;for (j=1;j<=t;j++) scanf("%d",&x),q[++cnt].x=x,q[cnt].xu=i;}sort(q+1,q+1+cnt,cmp);q[0].x=-1;for (i=1;i<=cnt;i++){if (q[i].x!=q[i-1].x) a[++tot]=0;newq[tot]=q[i].x;add(tot,q[i].xu);}l=1;kind=0;for (i=1;i<=tot;i++){for (j=a[i];j;j=ed[j].next){u[ed[j].col]++;if (u[ed[j].col]==1) kind++;}f=true;while (f&&kind==k&&l<i){for (j=a[l];j;j=ed[j].next){u[ed[j].col]--;if (u[ed[j].col]==0) kind--,f=false;}if (!f)for (j=a[l];j;j=ed[j].next){u[ed[j].col]++;if (u[ed[j].col]==1) kind++;}else l++;}if (kind==k)ans=min(ans,newq[i]-newq[l]);}printf("%d\n",ans);}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脑子里老是幻觉怎么办 严重认床睡不着怎么办 认床导致睡不着怎么办 碰到打呼噜的人怎么办 打呼吵得睡不着怎么办 打呼太吵睡不着怎么办 睡觉时舍友说话怎么办 夜晚醒了睡不着怎么办 夜晚怕黑睡不着怎么办 宝宝不愿意盖被子怎么办 白天睡觉晚上睡不着怎么办 晚上睡觉不安神怎么办 晚上经常睡不着觉怎么办 老是睡不着觉怎么办啊 小孩睡觉不安稳怎么办 睡觉时动不了怎么办 特别累还睡不着怎么办 又累又睡不着怎么办 干活累的睡不着怎么办 狗一有动静就叫怎么办 楼上天天闹动静怎么办 喝了奶茶失眠怎么办 失眠一宿第二天怎么办 睡觉外面噪音大怎么办 怀孕早期晚上睡不着怎么办 短发发尾翘怎么办 很累就是睡不着怎么办 人累但是睡不着怎么办 如果晚上睡不着该怎么办 晚上睡不着觉该怎么办 晚上睡不着该怎么办呢 晚上失眠睡不着该怎么办 晚上一直睡不着该怎么办 怀孕晚上睡不着该怎么办 运动太累睡不着怎么办 运动完睡不着觉怎么办 晚上冷得睡不着怎么办 晚上脚冷睡不着怎么办 短发头发有点乱怎么办 不想让别人睡觉怎么办 15岁晚上睡不着怎么办