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 }
View Code

 

posted @ 2016-08-11 20:44  Recoder  阅读(188)  评论(0编辑  收藏  举报