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