ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068

题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi),空投的位置在 (x0,y0),每一秒所有人向靠近空投的位置走一步,四个方向有优先级先后(优先纵坐标),若已经在空投的位置则不变。往空投位置移动过程中,若两个或者更多人在同一点相遇(在空投相遇不算),则他们都死亡。给出空投的纵坐标,询问空投在所有横坐标中最少和最多存活的人数是多少。

题解:在最优情况下,空投的横坐标必然是某一个人的横坐标,因为这样可以保证在该横坐标的人都不会死亡;而在最坏情况下,空投的横坐标则在两个不同横坐标的人之间,若所有人横坐标都相差1,则空投横坐标也是某一个人的横坐标,所以需要考虑的横坐标最多只有 2n 个。把横坐标排序后,分别从左往右扫一遍记录每个点左边存活的人数和从右往左扫一遍每个点右边存活的人数即可,具体看代码~

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define ull unsigned long long
 5 #define mst(a,b) memset((a),(b),sizeof(a))
 6 #define mp(a,b) make_pair(a,b)
 7 #define pi acos(-1)
 8 #define pii pair<int,int>
 9 #define pb push_back
10 const int INF = 0x3f3f3f3f;
11 const double eps = 1e-6;
12 const int MAXN = 1e5 + 10;
13 const int MAXM = 2e5 + 10;
14 const ll mod = 1e9 + 7;
15
16 int x[MAXN],y[MAXN];
17 vector<int>p,vec[MAXN],ans;
18 int num[MAXM],sum[MAXM];
19
20 int main() {
21 #ifdef local
22     freopen("data.txt", "r", stdin);
23 //    freopen("data.txt", "w", stdout);
24 #endif
25     int t;
26     scanf("%d",&t);
27     while(t--) {
28         int n,y0;
29         scanf("%d%d",&n,&y0);
30         p.clear();
31         p.push_back(0);
32         for(int i = 1; i <= n; i++) {
33             scanf("%d%d",&x[i],&y[i]);
34             vec[x[i]].clear();
35             vec[x[i] + 1].clear();
36             p.push_back(x[i]);
37             p.push_back(x[i] + 1);
38         }
39         sort(p.begin(),p.end());
40         p.erase(unique(p.begin(),p.end()),p.end());
41         for(int i = 1; i <= n; i++) vec[x[i]].push_back(y[i]);
42         int cnt = 0, pre = 0;
43         mst(sum, 0);
44         mst(num, 0);
45         for(int i = 0; i < p.size(); i++) {
46             int nx = p[i];
47             sum[nx] = vec[nx].size();
48             vector<int>temp;
49             for(int j = 0; j < vec[pre].size(); j++) {
50                 int k = abs(1e5 + 1 - pre) + abs(y0 - vec[pre][j]);
51                 num[k]++;
52                 if(num[k] == 1) cnt++;
53                 else temp.push_back(k);
54             }
55             for(int j = 0; j < temp.size(); j++) {
56                 if(num[temp[j]]) cnt--;
57                 num[temp[j]] = 0;
58             }
59             sum[nx] += cnt;
60             pre = p[i];
61         }
62         ans.clear();
63         mst(num, 0);
64         pre = cnt = 0;
65         for(int i = p.size() - 1; i >= 0; i--) {
66             int nx = p[i];
67             vector<int>temp;
68             for(int j = 0; j < vec[pre].size(); j++) {
69                 int k = abs(0 - pre) + abs(y0 - vec[pre][j]);
70                 num[k]++;
71                 if(num[k] == 1) cnt++;
72                 else temp.push_back(k);
73             }
74             for(int j = 0; j < temp.size(); j++) {
75                 if(num[temp[j]]) cnt--;
76                 num[temp[j]] = 0;
77             }
78             sum[nx] += cnt;
79             ans.push_back(sum[nx]);
80             pre = p[i];
81         }
82         sort(ans.begin(),ans.end());
83         printf("%d %d\n",ans[0],ans[ans.size() - 1]);
84     }
85     return 0;
86 }

原文地址:https://www.cnblogs.com/scaulok/p/9941093.html

时间: 2024-10-07 18:18:03

ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)的相关文章

2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5984 Pocky 题意 给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余的长度不大于d时停止.现在给出x和d,问切割次数的数学期望是多少. 解题思路 当看到第二个样例2 1时,结果是1.693147,联想到ln

ACM-ICPC 2018 青岛赛区现场赛 D. Magic Multiplication &amp;&amp; ZOJ 4061 (思维+构造)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意:定义一个长度为 n 的序列 a1,a2,..,an 和长度为 m 的序列 b1,b2,..,bm 所构成的新序列 c 为 a1b1,a1b2,....,anbm,给出最终的序列和两个初始序列的长度,构造出字典序最小的初始序列. 题解:首先我们知道两个个位数相乘最多可以得到两位数,易知最终序列的第一个数字 c1 的构造一定有 a1 的参与,当 a1 <

2014年ACM牡丹江赛区现场赛K题(ZOJ 3829)

Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science. It is also known as postfix notation since every operator in an expres

2014ACM/ICPC亚洲区鞍山赛区现场赛——题目重现

2014ACM/ICPC亚洲区鞍山赛区现场赛--题目重现 题目链接 5小时内就搞了5题B.C.D.E,I. H题想到要打表搞了,可惜时间不够,后面打出表试了几下过了- - K题过的人也比较多,感觉是个几何旋转+ploya,但是几何实在不行没什么想法 B:这题就是一个大模拟,直接数组去模拟即可,注意细节就能过 C:类似大白上一题红蓝三角形的, 每个数字找一个互质和一个不互质个数,除掉重复就直接除2,然后总的C(n, 3)减去即可,问题在怎么处理一个数字互质和不互质的,其实只要处理出不互质的即可,这

ICPC 2018 徐州赛区网络赛

ACM-ICPC 2018 徐州赛区网络赛 ?去年博客记录过这场比赛经历:该死的水题 ?一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. ? ? D. Easy Math 题意: ? 给定 \(n\), \(m\) ,求 \(\sum _{i=1}^{m} \mu(in)\) .其中 $ 1 \le n \le 1e12$ , $ 1 \le m \le 2e9$ ,\(\mu(n)\) 为莫比乌斯函数. ? 思路: ? 容易知道,\(i\) 与 \(n\) 不互质时, \(\m

ACM总结——2017ACM-ICPC北京赛区现场赛总结

现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情理之中意料之外了,我们本来以为自己会在北京赛区拿个倒数20什么的(比赛前听说北京赛区是最难的),事实上虽然不是很简单,但是也绝对没有想象中难(以为会A1或者零来着). 说下比赛前吧~赛前一星期是软考,所有自己训练很少,也正是这样,这场比赛算是抱了大腿(自己太菜了..)!咳咳~虽然软考复习了两周,但是

2013区域赛长沙赛区现场赛 K - Pocket Cube

K - Pocket Cube Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4801 Description Pocket Cube is a 3-D combination puzzle. It is a 2 × 2 × 2 cube, which means it is constructed by 8 mini-cubes.

2014ACM/ICPC亚洲区域赛牡丹江站现场赛-K ( ZOJ 3829 ) Known Notation

Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science. It is also known as postfix notation since every operator in an expres

2014ACM/ICPC亚洲区鞍山赛区现场赛1009Osu!

鞍山的签到题,求两点之间的距离除以时间的最大值.直接暴力过的. A - Osu! Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 5078 Appoint description:  System Crawler  (2014-10-22) Description Osu! is a very popular music game. B