A
简单题
B
有m个方块 每个方块有一个值 并且是堆起来稳定的 一个方块可以拿掉当且仅当剩下的还是稳定的 双方轮流拿 从左到右放组成一个m进制的数
#include <cstdio> #include <cstring> #include <queue> #include <set> #include <map> #include <algorithm> using namespace std; const __int64 mod = 1000000009; struct node { int x, y; }a[100010]; int in[100010]; map <pair<int, int>, int> mp; //map <int, pair<int, int> > mp2; set <int> s2; bool ok(int x) { x--; if(in[mp[make_pair(a[x].x-1, a[x].y+1)]] == 1) return false; if(in[mp[make_pair(a[x].x, a[x].y+1)]] == 1) return false; if(in[mp[make_pair(a[x].x+1, a[x].y+1)]] == 1) return false; return true; } int main() { int n; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d %d", &a[i].x, &a[i].y); mp[make_pair(a[i].x, a[i].y)] = i+1; } for(int i = 0; i < n; i++) { if(mp[make_pair(a[i].x-1, a[i].y-1)]) in[i+1]++; if(mp[make_pair(a[i].x, a[i].y-1)]) in[i+1]++; if(mp[make_pair(a[i].x+1, a[i].y-1)]) in[i+1]++; } __int64 ans = 0; for(int i = 0; i < n; i++) { if(ok(i+1)) { s2.insert(i+1); } } int flag = 0; while(s2.size()) { int x; if(flag&1) { x = *s2.begin(); } else { x = *s2.rbegin(); } //printf("***%d\n", x-1); s2.erase(x); if(!ok(x)) continue; ans = ans*(__int64)n; ans %= mod; x--; ans += (__int64)x; ans %= mod; pair<int, int> p = make_pair(a[x].x, a[x].y); if(mp[make_pair(p.first-1, p.second+1)]) in[mp[make_pair(p.first-1, p.second+1)]]--; if(mp[make_pair(p.first, p.second+1)]) in[mp[make_pair(p.first, p.second+1)]]--; if(mp[make_pair(p.first+1, p.second+1)]) in[mp[make_pair(p.first+1, p.second+1)]]--; mp[p] = 0; if(mp[make_pair(p.first-1, p.second-1)]) { if(ok(mp[make_pair(p.first-1, p.second-1)])) { s2.insert(mp[make_pair(p.first-1, p.second-1)]); //printf("+++%d\n", mp[make_pair(p.first-1, p.second-1)]-1); } } if(mp[make_pair(p.first, p.second-1)]) { if(ok(mp[make_pair(p.first, p.second-1)])) { s2.insert(mp[make_pair(p.first, p.second-1)]); //printf("+++%d\n", mp[make_pair(p.first, p.second-1)]-1); } } if(mp[make_pair(p.first+1, p.second-1)]) { if(ok(mp[make_pair(p.first+1, p.second-1)])) { s2.insert(mp[make_pair(p.first+1, p.second-1)]); //printf("+++%d\n", mp[make_pair(p.first+1, p.second-1)]-1); } } flag++; } printf("%I64d\n", ans); return 0; }
C
待完成
时间: 2024-10-05 05:25:56