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

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

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

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e5 + ;
const int MAXM = 2e5 + ;
const ll mod = 1e9 + ; int x[MAXN],y[MAXN];
vector<int>p,vec[MAXN],ans;
int num[MAXM],sum[MAXM]; int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
int t;
scanf("%d",&t);
while(t--) {
int n,y0;
scanf("%d%d",&n,&y0);
p.clear();
p.push_back();
for(int i = ; i <= n; i++) {
scanf("%d%d",&x[i],&y[i]);
vec[x[i]].clear();
vec[x[i] + ].clear();
p.push_back(x[i]);
p.push_back(x[i] + );
}
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
for(int i = ; i <= n; i++) vec[x[i]].push_back(y[i]);
int cnt = , pre = ;
mst(sum, );
mst(num, );
for(int i = ; i < p.size(); i++) {
int nx = p[i];
sum[nx] = vec[nx].size();
vector<int>temp;
for(int j = ; j < vec[pre].size(); j++) {
int k = abs(1e5 + - pre) + abs(y0 - vec[pre][j]);
num[k]++;
if(num[k] == ) cnt++;
else temp.push_back(k);
}
for(int j = ; j < temp.size(); j++) {
if(num[temp[j]]) cnt--;
num[temp[j]] = ;
}
sum[nx] += cnt;
pre = p[i];
}
ans.clear();
mst(num, );
pre = cnt = ;
for(int i = p.size() - ; i >= ; i--) {
int nx = p[i];
vector<int>temp;
for(int j = ; j < vec[pre].size(); j++) {
int k = abs( - pre) + abs(y0 - vec[pre][j]);
num[k]++;
if(num[k] == ) cnt++;
else temp.push_back(k);
}
for(int j = ; j < temp.size(); j++) {
if(num[temp[j]]) cnt--;
num[temp[j]] = ;
}
sum[nx] += cnt;
ans.push_back(sum[nx]);
pre = p[i];
}
sort(ans.begin(),ans.end());
printf("%d %d\n",ans[],ans[ans.size() - ]);
}
return ;
}

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

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

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  2. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

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

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4061 题意:定义一个长度为 n 的序列 a1,a2,..,an ...

  4. ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)

    题目链接: 题意:有 n 个人围成一个圈,从 1 开始报到第 k 个人出环,问第 m 个出环的人是谁,n.m.k <= 1e18 且 min(m,k)<= 2e6. 题解:容易得出O(m) ...

  5. ACM-ICPC 2018 南京赛区现场赛 K. Kangaroo Puzzle (思维+构造)

    题目链接:https://codeforc.es/gym/101981/attachments 题意:在 n * m 的平面上有若干个袋鼠和墙(1为袋鼠,0为墙),每次可以把所有袋鼠整体往一个方向移动 ...

  6. HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)

    HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: ...

  7. ICPC 2018 徐州赛区网络赛

    ACM-ICPC 2018 徐州赛区网络赛  去年博客记录过这场比赛经历:该死的水题  一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进.     D. Easy Math 题意:   ...

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

    现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...

  9. ACM-ICPC 2017 西安赛区现场赛 K. LOVER II && LibreOJ#6062. 「2017 山东一轮集训 Day2」Pair(线段树)

    题目链接:西安:https://nanti.jisuanke.com/t/20759   (计蒜客的数据应该有误,题目和 LOJ 的大同小异,题解以 LOJ 为准)     LOJ:https://l ...

随机推荐

  1. ABP中的本地化处理(上)

    今天这篇文章主要来总结一下ABP中的多语言是怎么实现的,在后面我们将结合ABP中的源码和相关的实例来一步步进行说明,在介绍这个之前我们先来看看ABP的官方文档,通过这个文档我们就知道怎样在我们的系统中 ...

  2. Elasticsearch 常用配置参数总结

    # ---------------------------------- Cluster ----------------------------------- # Use a descriptive ...

  3. Python开发【杂货铺】:作用域的痛点

    1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? #块级作用域 if 1 == 1: name = "lzl" print(name) for i in range ...

  4. (五)web服务中的异常处理

    一.服务端发布服务 package com.webservice; import javax.jws.WebParam; import javax.jws.WebResult; import java ...

  5. 九、小程序 Redux详解与在小程序中怎么使用(action和reducers)

    什么是Redux ​ Redux我们可以把它理解成一个状态管理器,可以把状态(数据)存在Redux中,以便增.删.改.例如: 从服务器上取一个收藏列表,就可以把取回来的列表数据用Redux管理,多个页 ...

  6. A*算法与8数字谜题(参见《算法》P226习题2.5.32)

    A*算法的目的是找到一条从起始状态到最终状态的最短路径. 在A*算法中,需要在每个点计算启发函数:f(S) = g(S) + h(S),其中g(S)是从起点到S点的距离,h(S)是对从S点到终点的最短 ...

  7. Android中BroadcastReceiver的使用

    1.Android中广播分为静态注册和动态注册 2.下面是一个简单静态注册的例子 创建一个继承BroadcastReceiver的子类 public class DeviceBootReceiver ...

  8. oracle学习笔记:字符串替换 replace、regexp_replace、translate函数

    1.replace 函数 语法:replace(char, search_string, replacement_string) --针对字符串替换 功能: ​ 将char中的字符串替换. ​ 当re ...

  9. nodejs入门API之net模块

    net常用API解析以及应用 手动解析HTTP请求头 基于网络模块net与文件模块fs搭建简易的node服务 net模块部分API参数详细解析 一.net常用API解析以及简单的应用 net模块的组成 ...

  10. 装机篇:将ubuntu 14.04安装在移动硬盘中

    这样做有诸多好处,最大的好处莫过于获得新鲜感. 需要注意的只有一点,要把bootloader装在整个硬盘的MBR而不是单独某个分区的DBR里. 另,我所成功的版本为14.04.1,之前使用14.04. ...