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 }