HDU 5821 多校脑洞题贪心

来源:互联网 发布:it狂人第二季 编辑:程序博客网 时间:2024/05/12 04:40

题意:

有N个盒子,每个盒子最多装一个球. 球的颜色不一定相同.
现在要进行m次区间操作:
每次操作 [l, r] 后可以随意将区间内的球重新分配回去.
问经过上述操作后是否有可能达到给定的状态.

 

思路

贪心.

首先应该明白 待操作数据与目标数据是一一对应的关系,然后接下来就去想,如何可以判断是否可以匹配上。

为每个球记录它在最终结果中的序号. 对于颜色相同的球:左边的尽量分配小的序号.
对于m次区间操作,就将区间[l,r]中的球按最终序号排序.
每次排序都相当于让区间中的球向它们的最终位置更近一步.
最终再比较是否每个球都到位

#include<bits/stdc++.h>#define LL long long using namespace std; ///       const int maxn = 100000+10;int n,t,m,b[maxn];struct st{int val,pos;}q[maxn];bool cmp(st x,st y){    return x.pos<y.pos;}int main(){    scanf("%d",&t);    while(t--){        scanf("%d%d",&n,&m);        for(int i=1;i<=n;i++){            scanf("%d",&q[i].val);            q[i].pos=-1;        }        for(int i=1;i<=n;i++){            scanf("%d",&b[i]);        }        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                if(q[j].val==b[i]&&q[j].pos==-1){                    q[j].pos=i;                    break;                }            }        }        while(m--){            int l,r;            scanf("%d%d",&l,&r);            sort(q+l,q+r+1,cmp);        }        int fg=0;        for(int i=1;i<=n;i++){            if(q[i].val!=b[i]){                fg=1;                break;            }        }        if(!fg)            puts("Yes");        else            puts("No");    }    return 0;}



1 0
原创粉丝点击