标签:
//贪心的做法比较明显:取出方格中的数从左往右排列形成一个 m 进制的数,前者想要数最大,则每次取符合条件的最大的数,后者想要数最小,则每次取符合条件的最小的数。
//做法也比较暴力:在整个剩余的数形成的集合中两人每次贪心取数,那么就相当于是对剩余的数形成的集合进行搜索,考虑到极端情况:集合里面有很多数,但是只有一个可以取,这时通过加强集合元素的条件(是剩余的数 && (之前能被取出 || 现在能被取出))来缩小集合的大小,但是在数被取出之后需要对集合进行维护(添加元素)
//之前感觉写起来挺麻烦,就一直没动手去写,没想到今天写完交上去就过了......
1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 #include "utility" 6 #include "set" 7 #include "map" 8 using namespace std; 9 const int mod = 1e9 + 9; 10 int m; 11 int x[100010], y[100010]; 12 set<int> s; 13 bool vis[100010]; 14 map<pair<int, int>, int> mp; 15 bool available(int index) 16 { 17 int X = x[index], Y = y[index]; 18 pair<int, int> point = make_pair(X, Y), pre, next; 19 bool no; 20 int i, j; 21 for(i = 1, pre = make_pair(X - 1, Y + 1); i <= 3; ++i, ++pre.first) { 22 if(!mp[pre]) 23 continue; 24 no = 1; 25 for(j = 1, next = make_pair(pre.first - 1, pre.second - 1); j <= 3; ++j, ++next.first) { 26 if(mp[next] && next != point) { 27 no = 0; 28 break; 29 } 30 } 31 if(no) 32 return 0; 33 } 34 return 1; 35 } 36 37 void res_add(__int64 &res, int v) 38 { 39 res = (res * m) % mod; 40 res = (res + v) % mod; 41 } 42 43 void cube_add(int index) 44 { 45 int i; 46 pair<int, int> next; 47 int tmp; 48 for(i = 1, next = make_pair(x[index] - 1, y[index] - 1); i <= 3; ++i, ++next.first) { 49 tmp = mp[next]; 50 if(!tmp) 51 continue; 52 --tmp; 53 if(available(tmp)) { 54 // printf("add_cube index == %d next == %d\n", index, tmp); 55 // printf("%d %d\n", next.first, next.second); 56 s.insert(tmp); 57 } 58 59 } 60 } 61 62 int main() 63 { 64 int i; 65 scanf("%d", &m); 66 for(i = 0; i <= m - 1; ++i) { 67 scanf("%d%d", &x[i], &y[i]); 68 mp[make_pair(x[i], y[i])] = i + 1; 69 } 70 for(i = 0; i <= m - 1; ++i) { 71 if(available(i)) { 72 s.insert(i); 73 // printf("ava == %d\n", i); 74 } 75 } 76 int tmp; 77 __int64 res = 0; 78 for(i = 1; i <= m; ++i) { 79 while(!s.empty()) { 80 if(i & 1) 81 tmp = *s.rbegin(); 82 else 83 tmp = *s.begin(); 84 // printf("chi == %d\n", tmp); 85 s.erase(tmp); 86 if(available(tmp)) { 87 res_add(res, tmp); 88 mp.erase(make_pair(x[tmp], y[tmp])); 89 cube_add(tmp); 90 break; 91 } 92 } 93 } 94 printf("%I64d\n", res); 95 }
标签:
原文地址:http://www.cnblogs.com/AC-Phoenix/p/4333197.html