博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces 520D 又见贪心
阅读量:4506 次
发布时间:2019-06-08

本文共 2745 字,大约阅读时间需要 9 分钟。

戳这里:

//贪心的做法比较明显:取出方格中的数从左往右排列形成一个 m 进制的数,前者想要数最大,则每次取符合条件的最大的数,后者想要数最小,则每次取符合条件的最小的数。

//做法也比较暴力:在整个剩余的数形成的集合中两人每次贪心取数,那么就相当于是对剩余的数形成的集合进行搜索,考虑到极端情况:集合里面有很多数,但是只有一个可以取,这时通过加强集合元素的条件(是剩余的数 && (之前能被取出 || 现在能被取出))来缩小集合的大小,但是在数被取出之后需要对集合进行维护(添加元素)

//之前感觉写起来挺麻烦,就一直没动手去写,没想到今天写完交上去就过了......

1 #include "iostream" 2 #include "cstdio" 3 #include "cstring" 4 #include "algorithm" 5 #include "utility" 6 #include "set" 7 #include "map" 8 using namespace std; 9 const int mod = 1e9 + 9;10 int m;11 int x[100010], y[100010];12 set
s;13 map
, int> mp;14 bool available(int index)15 {16 int X = x[index], Y = y[index];17 pair
point = make_pair(X, Y), pre, next;18 bool no;19 int i, j;20 for(i = 1, pre = make_pair(X - 1, Y + 1); i <= 3; ++i, ++pre.first) {21 if(!mp[pre])22 continue;23 no = 1;24 for(j = 1, next = make_pair(pre.first - 1, pre.second - 1); j <= 3; ++j, ++next.first) {25 if(mp[next] && next != point) {26 no = 0;27 break;28 }29 }30 if(no)31 return 0;32 }33 return 1;34 }35 36 void res_add(__int64 &res, int v)37 {38 res = (res * m) % mod;39 res = (res + v) % mod;40 }41 42 void cube_add(int index)43 {44 int i;45 pair
next;46 int tmp;47 for(i = 1, next = make_pair(x[index] - 1, y[index] - 1); i <= 3; ++i, ++next.first) {48 tmp = mp[next];49 if(!tmp)50 continue;51 --tmp;52 if(available(tmp)) {53 // printf("add_cube index == %d next == %d\n", index, tmp);54 // printf("%d %d\n", next.first, next.second);55 s.insert(tmp);56 }57 58 }59 }60 61 int main()62 {63 int i;64 scanf("%d", &m);65 for(i = 0; i <= m - 1; ++i) {66 scanf("%d%d", &x[i], &y[i]);67 mp[make_pair(x[i], y[i])] = i + 1;68 }69 for(i = 0; i <= m - 1; ++i) {70 if(available(i)) {71 s.insert(i);72 // printf("ava == %d\n", i);73 }74 }75 int tmp;76 __int64 res = 0;77 for(i = 1; i <= m; ++i) {78 while(!s.empty()) {79 if(i & 1)80 tmp = *s.rbegin();81 else82 tmp = *s.begin();83 // printf("chi == %d\n", tmp);84 s.erase(tmp);85 if(available(tmp)) {86 res_add(res, tmp);87 mp.erase(make_pair(x[tmp], y[tmp]));88 cube_add(tmp);89 break;90 }91 }92 }93 printf("%I64d\n", res);94 }

 

转载于:https://www.cnblogs.com/AC-Phoenix/p/4333197.html

你可能感兴趣的文章
Codeforces Round #197 (Div. 2) : E
查看>>
加解密封装
查看>>
hdu_5800_To My Girlfriend(变种背包)
查看>>
hdu 1402 A * B Problem Plus(FFT)
查看>>
JavaScript中的额事件一
查看>>
367. Valid Perfect Square
查看>>
碎片的实例
查看>>
20162318 2016-2017-2 《程序设计与数据结构》第4周学习总结
查看>>
nginx backup 功能
查看>>
babel 7.x 和 webpack 4.x 配置vue项目
查看>>
魅族MX3 smart bar处失灵
查看>>
Hibernate第一个程序(最基础的增删改查) --Hibernate
查看>>
bzoj1296: [SCOI2009]粉刷匠
查看>>
LC-601 体育馆人流量
查看>>
2.App Components-App Widgets
查看>>
POJ 2481 Cows【树状数组】
查看>>
实习生面试--算法题之字符串最长公共子序列长度
查看>>
RHEL7网卡设置
查看>>
信息收集之网站镜像克隆
查看>>
StringBuffer类概述及其构造方法
查看>>