HDU 5821 Ball (排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5821
有n个盒子,每个盒子最多装一个球。
现在进行m次操作,每次操作可以将l到r之间盒子的球任意交换。
问进行上述操作后,是否能变成指定的状态。
将颜色相同的球,尽量靠最终状态近的分配。对于每次操作 按最终序号靠近进行排序。最后检查是否一致就行了。
官方题解:
假设有4个红球,初始时从左到右标为1,2,3,4。那么肯定存在一种方案,使得最后结束时红球的顺序没有改变,也是1,2,3,4。 那么就可以把同色球都写成若干个不同色球了。所以现在共有n个颜色互异的球。按照最终情况标上1,2,。。,n的序号,那么贪心的来每次操作就是把一个区间排序就行了。
1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cstdio> 7 #include <vector> 8 #include <cmath> 9 #include <ctime> 10 #include <list> 11 #include <set> 12 #include <map> 13 using namespace std; 14 typedef long long LL; 15 typedef pair <int, int> P; 16 const int N = 1e3 + 5; 17 P ball[N]; 18 int a[N], b[N]; 19 20 int main() 21 { 22 int t, n, m; 23 scanf("%d", &t); 24 while(t--) { 25 scanf("%d %d", &n, &m); 26 for(int i = 1; i <= n; ++i) { 27 scanf("%d", a + i); 28 ball[i].first = 0, ball[i].second = a[i]; 29 } 30 for(int i = 1; i <= n; ++i) { 31 scanf("%d", b + i); 32 for(int j = 1; j <= n; ++j) { 33 if(!ball[j].first && ball[j].second == b[i]) { 34 ball[j].first = i; //最终 35 break; 36 } 37 } 38 } 39 int l, r; 40 while(m--) { 41 scanf("%d %d", &l, &r); 42 sort(ball + l, ball + r + 1); 43 } 44 bool ok = true; 45 for(int i = 1; i <= n; ++i) { 46 if(ball[i].first != i) { 47 ok = false; 48 break; 49 } 50 } 51 printf("%s\n", ok ? "Yes" : "No"); 52 } 53 return 0; 54 }