HDU 5821 多校脑洞题贪心

题意:

有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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值