hdu5821

题意:


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

题解:


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

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <stack>
using namespace std;
#define PF(x) cout << "debug: " << x << " ";
#define EL cout << endl;
#define PC(x) puts(x);
typedef long long ll;
const int maxn = 100000+10;
const int MOD = 1e9+7;
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()
{
    //freopen("in.txt","r",stdin);
    cin>>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 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)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shimu/p/5762303.html