CodeForces 521B Cubes :在保证稳定的前提下两个人分别取最大和最小:得到最后的取数顺序(模拟+stl实现的map set pair 迭代器C

其实读懂题意之后,题目总体还是比较好做的,除了个别地方==

什么叫保证稳定呢,就是取完这个木块之后,木块的上面,左上,右上不因为他被拿了而没有支点

首先要能想到用包含pair的map来判断某个坐标有没有木块(stl真方便

set里面放的都是当前可以取的木块,用set来实现取最大值,取最小值,加木块,删木块很方便==

最后有一个地方:当前能拿的木块,以后不一定能拿,比如:

(x,y) (x+2,y) (x+1,y+1)

本来三个点都能拿,但只要拿掉底部的其中一个另外一个就不能拿了==,故在拿掉一个元素后进行check方圆2的点,cheack ok如果不在集合加入集合,check 失败如果在集合里面剔除他,注意拿掉一个点后要令那个点的map值为0==

其实就是个用了很多stl的模拟TUT

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<map>
 4 #include<set>
 5 #include<algorithm>
 6 #define MOD 1000000009
 7 #define LL long long
 8 using namespace std;
 9 pair<LL,LL>p[100005];
10 map<pair<LL,LL>,LL>mp;
11 set<LL>s;
12 LL check(LL x,LL y)
13 {
14   pair<LL,LL>tmp_p,t_p,_p;
15   LL id,i,j,judge;
16   _p=make_pair(x,y);
17   for (i=-1;i<=1;i++)
18   {
19     tmp_p=make_pair(x+i,y+1);
20     if (mp[tmp_p]) {
21       judge=0;
22       for (j=-1;j<=1;j++){
23         t_p=make_pair(x+i+j,y);
24         if (mp[t_p]!=0&&t_p!=_p) judge=1;
25       }
26       if (judge==0) return 0;
27     }
28   }
29   return 1;
30 }
31 int main()
32 {
33   LL n,i,x,y,ans,id,tmp_id,ti,tj;
34   pair<LL,LL>tmp_p;
35   scanf("%I64d",&n);
36   mp.clear();  s.clear();
37   for (i=1;i<=n;i++)
38   {
39     scanf("%I64d%I64d",&x,&y);
40     p[i]=make_pair(x,y);
41     mp[p[i]]=i;
42   }
43   for (i=1;i<=n;i++)
44   {
45     if (check(p[i].first,p[i].second))
46       s.insert(i);
47   }
48   ans=0;
49   set<LL>::iterator it;
50   for (i=1;i<=n;i++)
51   {
52     if (i%2){
53       it=s.end();
54       it--;
55       id=(*it);
56     }
57     else{
58       it=s.begin();
59       id=(*it);
60     }
61     ans=(ans*n+id-1)%MOD;
62     s.erase(id);
63     mp[p[id]]=0;
64     for (ti=-2;ti<=2;ti++)
65       for (tj=-2;tj<=2;tj++)
66       {
67         tmp_p=make_pair(p[id].first+ti,p[id].second+tj);
68         if (mp[tmp_p]==0) continue;
69         tmp_id=mp[tmp_p];
70         if (check(tmp_p.first,tmp_p.second)){
71           if (s.find(tmp_id)==s.end()) s.insert(tmp_id);
72         }
73         else{
74           if (s.find(tmp_id)!=s.end()) s.erase(tmp_id);
75         }
76       }
77   }
78   printf("%I64d\n",ans);
79   return 0;
80 }
View Code

题目链接:http://codeforces.com/contest/521/problem/B

posted on 2015-03-03 17:18  xiao_xin  阅读(502)  评论(0编辑  收藏  举报

导航