题目链接:hdu_5821_Ball
题意:
给你序列A和序列B,依次给你m个区间,每次你可以交换区间内的任意数,问最后能不能将A变成B
题解:
比赛当时没想到,智商被压制
1001:
假设有4个红球,初始时从左到右标为1,2,3,4。那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4。 那么就可以把同色球都写成若干个不同色球了。所以现在共有n个颜色互异的球。按照最终情况标上1,2,。。,n的序号,那么贪心的来每次操作就是把一个区间排序就行了。
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 typedef pair<int,int>P; 5 6 int t,n,m,b[1001],e[1001][2]; 7 P a[1001]; 8 int main() 9 { 10 scanf("%d",&t); 11 while(t--) 12 { 13 scanf("%d%d",&n,&m); 14 F(i,1,n)scanf("%d",&a[i].second),a[i].first=-1; 15 F(i,1,n)scanf("%d",b+i); 16 F(i,1,m)scanf("%d%d",&e[i][0],&e[i][1]); 17 F(i,1,n)F(j,1,n)if(b[i]==a[j].second&&a[j].first==-1){a[j].first=i;break;} 18 int fg=0; 19 F(i,1,n)if(a[i].first==-1){fg=1;break;} 20 if(fg){puts("No");continue;} 21 F(i,1,m)sort(a+e[i][0],a+e[i][1]+1); 22 F(i,1,n)if(a[i].second!=b[i]){fg=1;break;} 23 if(fg)puts("No");else puts("Yes"); 24 } 25 return 0; 26 }