hdu 5821 Ball
题意:
a,b两个包含n个整数(代表球的颜色)的数组,对a数组经过m次区间随意交换位置的操作后,看是否和b数组完全匹配!
官方题解:
假设有4个红球,初始时从左到右标为1,2,3,4。那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4。 那么就可以把同色球都写成若干个不同色球了。所以现在共有n个颜色互异的球。按照最终情况标上1,2,。。,n的序号,那么贪心的来每次操作就是把一个区间排序就行了。
/*by*/ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <stack> using namespace std; typedef long long LL; const LL N=1010; const LL INF=0x3f3f3f3f; stack <char>s; typedef struct { int v,po; } by; by a[N]; int b[N]; bool cmp(by q,by w) { return q.po<w.po; } int main() { int T; cin>>T; while(T--) { int n,m,i,j; scanf("%d%d",&n,&m); for(i=1; i<=n; i++) { scanf("%d",&a[i].v); a[i].po=0; } for(i=1; i<=n; i++) { scanf("%d",&b[i]); for(j=1; j<=n; j++) { if(!a[j].po&&a[j].v==b[i]) { a[j].po=i;/*应在b数组中对应位置的下标*/ break; } } } int x,y; for(i=1; i<=m; i++) { scanf("%d%d",&x,&y); sort(a+x,a+y+1,cmp); } bool flag=true; for(i=1; i<=n&&flag; i++) { if(a[i].v!=b[i]) flag=false; } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }