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