码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #295 (Div. 1)

时间:2015-03-03 13:36:37      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

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

待完成

Codeforces Round #295 (Div. 1)

标签:

原文地址:http://blog.csdn.net/u011686226/article/details/44036875

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!