luogu P3407 散步 二分答案

 

题目描述

 

一条道路上,位置点用整数A表示。

当A=0时,有一个王宫。当A>0,就是离王宫的东边有A米,当A<0,就是离王宫的西边有A米。

道路上,有N个住宅从西向东用1-N来标号。每个住宅有一个人。住宅只会存在于偶数整数点。

该国国王认为,国民体质下降,必须要多运动,于是下命令所有人都必须出门散步。所有的国民,一秒钟可以走1米。每个国民各自向东或者向西走。这些方向你是知道的。命令发出后所有人同时离开家门开始散步。

然而该国的国民个都很健谈,如果在散步途中两个人相遇,就会停下来交谈。正在走路的人碰到已经停下来的人(重合)也会停下来交谈。一但停下来,就会聊到天昏地暗,忘记了散步。

现在命令已经发出了T秒,该国有Q个重要人物,国王希望能够把握他们的位置。你能帮他解答吗?

 

输入格式

 

第一行是3个整数,N,T,Q

接下来N行,每行两个整数Ai,Ri。Ai是家的坐标,如果Ri是1,那么会向东走,如果是2,向西。数据保证Ai是升序排序,而且不会有两个人初始位置重合。

接下来Q行,每行一个整数,表示国王关心的重要人物。

 

输出格式

 

Q行,每行一个整数,表示这个人的坐标。

 

20%数据 N<=100,T<=10000

另外20%数据 N<=5000

另外20%数据 从最西边数起连续的若干国民全部往东,剩下的全部往西

100%数据 Ai为偶数,|Ai|<=10^18,|T|<=10^18,1<=Q<=N<=100000.

----------------------------------------我是分割线---------------------------------------------------------------

题面大意:数轴上有n个人,每秒钟在给定的方向(向东或向西)移动一个距离,当一个人与一个人相遇时两人不再移动,求t秒后,指定m个人所在的位置。

看到这道题的第一眼,估计你们应该都想出正解了,这题的正解应该是比较好想的。

对于每一个行走的人(以向西走的为例),最终停下来无非三种情况:

1,时间到了,不能再走了。

2,和自己西边向东走的人相遇了。

3,自己西边的有人相遇了,自己遇上了相遇的人。

对于最西边向西走的,可以不用管他。

同理可以判定向东走的人。分类讨论就行了。

时间复杂度O(N)。

贴上代码方便理解:

#include<bits/stdc++.h>#define ll long long
#define mp make_pair
#define rep(i, a, b) for(int i = (a);i <= (b);i++)
#define per(i, a, b) for(int i = (a);i >= (b);i--)using namespace std;typedef pair<int, int> pii;
typedef double db;
const int N = 1e6 + 50;
int n, Q, q[N];
long long ans[N], p[N][2], t;
inline ll read(){ll x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') f = -1; ch = getchar();}while(ch >='0' && ch <='9'){x = (x<<3)+(x<<1)+(ch^48); ch = getchar();}return x*f;
}
int main(){n = read(); t = read(); Q = read();rep(i, 1, n) p[i][0] = read(), p[i][1] = read();rep(i, 1, Q) q[i] = read();     rep(i, 1, n)if(p[i][1] == 2){if(i == 1)ans[i] = p[i][0] - t;else if(p[i-1][1] == 2)ans[i] = max(ans[i-1], p[i][0]-t);else ans[i] = max(p[i][0]/2+p[i-1][0]/2, p[i][0]-t);}per(i, n, 1)   if(p[i][1] == 1){if(i == n)ans[i] = p[i][0]+t;else if(p[i+1][1] == 1)ans[i] = min(ans[i+1], p[i][0]+t);else ans[i] = min(p[i][0]/2+p[i+1][0]/2, p[i][0]+t);}rep(i, 1, Q) printf("%d\n", ans[q[i]]);return 0;
}
View Code

 

但是,这不是重点,这道题还有一个非正解的O(N logN)的做法,常数巨小,跑的比上面的O(N)正解还要快!

思路:预处理出每一个相遇点,与当位置+或者-t,看看是否会到达最近的相遇点,如果能就输出相遇点,否则输出pos+t 或者pos-t.最近的相遇点可以二分查找,细节有点多,需要额外注意。

code:

#include<bits/stdc++.h>#define ll long long
#define mp make_pair
#define rep(i, a, b) for(int i = (a);i <= (b);i++)
#define per(i, a, b) for(int i = (a);i >= (b);i--)using namespace std;typedef pair<int, int> pii;
typedef double db;
const int N = 1e6 + 50;
const ll inf = 4557430888798830399;
ll n, t, q;
ll s[N], k = 0;
struct people{ll pos, dic, id; } a[N];
bool mycmp(people a, people b) {return a.pos < b.pos; }
inline ll read(){ll x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') f = -1; ch = getchar();}while(ch >='0' && ch <='9'){x = (x<<3)+(x<<1)+(ch^48); ch = getchar();}return x*f;
}
int main(){n = read(); t = read(); q = read();rep(i, 1, n) a[i].pos = read(), a[i].dic = read(), a[i].id = i;sort(a+1, a+n+1, mycmp);rep(i, 2, n){if(a[i].dic == 2 && a[i-1].dic == 1) s[++k] = (a[i].pos+a[i-1].pos)>>1;}  s[0] = -inf, s[k+1] = inf;rep(i, 1, q){ll x = read();ll posx = a[a[x].id].pos, flag = a[a[x].id].dic;ll l = 1, r = k, mid;while(l < r){mid = (l+r)>>1;if(flag == 1){if(s[mid] < posx) l = mid+1;if(s[mid] > posx) r = mid;}if(flag == 2){if(mid == l) mid++;if(s[mid] < posx) l = mid;if(s[mid] > posx) r = mid-1;}}mid = l;if(s[mid] < posx && flag == 2){if(s[mid+1] < posx && s[mid+1] != inf) mid++;}if(s[mid] > posx && flag == 1){if(s[mid-1] > posx && s[mid-1] != inf) mid--; }if(flag == 1){if(s[mid] > posx+t && s[mid] > posx) printf("%lld\n", posx+t);else if(s[mid] < posx) printf("%lld\n", posx+t);else if(s[mid] < posx+t && s[mid] > posx) printf("%lld\n", s[mid]);else printf("%lld\n", s[mid]);}if(flag == 2){if(s[mid] < posx-t && s[mid] < posx) printf("%lld\n", posx-t);else if(s[mid] > posx-t && s[mid] < posx) printf("%lld\n", s[mid]);else if(s[mid] > posx) printf("%lld\n", posx-t); else printf("%lld\n", s[mid]);}}return 0;
}
View Code

好了,这道题就这么愉快地结束了。

转载于:https://www.cnblogs.com/smilke/p/11533230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络攻击与防御 实验1

做实验的截图 转载于:https://www.cnblogs.com/ma1998/p/11536582.html

SQL注入原理-手工联合注入查询技术

实验报告记录 得到实验结果 转载于:https://www.cnblogs.com/ma1998/p/11536959.html

51CTO寄来的奖品

这两周都是天天上班面对着电脑,挺无聊的.不过幸好有51CTO与我相伴,一直都在关注51CTO的活动.最近我所在的项目组的老员工个个都新买了笔记本,之前他们所用的旧笔记本自然退还给公司了.呵呵,这样像我这样的新员工就有笔记本分配的了,虽然旧了些还是将就着用了.就这样,回到员工宿…

实验3 SQL注入原理-万能密码注入

实验目的 &#xff08;1&#xff09;理解【万能密码】的原理 &#xff08;2&#xff09;学习【万能密码】的使用 实验原理 一、访问目标网站 1.选择一个存在漏洞的论坛 http://192.168.1.3:8009 进入 2.输入用户名【admin】&#xff0c;密码【2‘ or 1】 转载于:https://www.cn…

[转]使用URLConnection下载文件或图片并保存到本地

Codeimport java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; /** * 使用URLConnection下载文件或图片并保存到本地。 * * author 老紫竹(laozizhu.com) …

整理了一些t-sql技巧

把长日期转换为短日期 Convert(char(10),getdate(),120) MS-SQL数据库开发常用汇总 1.按姓氏笔画排序:Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密:select encrypt(原始密码)select pwdencrypt(原始密码)select pwdcompa…

STM32——IDA反编译 Hex\Bin文件成C代码(转)

转&#xff1a;https://blog.csdn.net/daidi1989/article/details/86304843 IDA是一款功能强大的反编译软件&#xff0c;网上找了许久没找到它的使用教程&#xff0c;经过摸索可将STM32的hex文件进行反汇编&#xff0c;操作步骤如下&#xff0c;首先下载IDA Pro版破解软件&…

STM32——ST-LINK通过BIN文件烧录STM32芯片(转)

转&#xff1a;https://www.cnblogs.com/schips/p/8215711.html 提供2种下载方式 KEIL编译下载 KEIL 5 在开发中还算是比较强大的一种平台。在开发中通过编译再下载会显得很方便。 尽管这个是老生常谈的问题&#xff0c;但还是在这里补全这个设置步骤 1.点击“魔法棒” 2.Debug…

离线应用架构

看完了Google的官方架构文档&#xff08; [url]http://code.google.com/apis/gears/architecture.html[/url]&#xff09;&#xff0c; 结合了Modal和Modeless两种优点&#xff0c;总结出如下架构模式&#xff1a;这种架构的好处是&#xff0c;用户总是把数据存在本地&#xff…

突破PTU网页认证校园网开热点

人总有浮躁&#xff0c; 之前只是把脚本写好&#xff0c;没有实操过。 [这是更新过的教程&#xff0c;保证只要按教程走一定可以--->运行成功] 教程可能有些生涩&#xff0c;需要一点耐心 ###ps&#xff1a;不保证热点不出现断网情况【此时手机WiFi关开一次既解决】 教程篇 …

PowerDesigner 导入sql脚本到MySQL乱码问题

为什么80%的码农都做不了架构师&#xff1f;>>> PowerDesigner 12.5 / MySQL 5.0.22 通过PowerDesigner生成MySQL5的数据库脚本。因为对MySQL的命令不熟悉&#xff0c;所以就下载了一个MySQL UI TOOLS。想着通过MySQL Query Browser来执行SQL脚本。 安装好之后&…

安装Windows 2003 域控制器

操作系统要求&#xff1a;Windows 2003 Server StdWindows 2003 Server EntWindows 2003 Server Dc相关配置要求&#xff1a;DNS服务器转载于:https://blog.51cto.com/handongliu/141779

域控制器的强制卸载,Active Directory系列之十四

域控制器的强制卸载上篇博文中我们介绍了如何对域控制器进行常规卸载&#xff0c;本文中我们将介绍如何对域控制器进行强制卸载。为什么需要对域控制器进行强制卸载呢&#xff1f;如果域控制器不能和复制伙伴正常通讯&#xff0c;而且更正无望&#xff0c;那我们就要考虑进行强…

题解 [SHOI2014]概率充电器

前情提要&#xff1a;最近大佬们都在写题解&#xff0c;只有我在咕咕咕。QAQ&#xff1b;明明我都把flag写出来辣&#xff0c;dalao们没看见&#xff0c;然后就被嘲讽了,QAQ 洛谷 树形DP期望&#xff08;讲了两次&#xff0c;菜鸡的我才做&#xff31;&#xff21;&#xff31;…

AtCoderGC038B - Sorting a Segment 数据结构 + RMQ

题意&#xff1a;给定一个长度为N的排列&#xff0c;你只能对其中长度为K的连续子序列进行一次从小到大的排序&#xff0c;问&#xff1a;排序之后能形成多少不同的排列&#xff1f; 数据范围&#xff1a; 1 < n, k < 200,000&#xff0c; k < n. -------------------…

luogu P2216 [HAOI2007]理想的正方形 递推+ST表

题意&#xff1a;有一个a*b的整数组成的矩阵&#xff0c;现请你从中找出一个n*n的正方形区域&#xff0c;使得该区域所有数中的最大值和最小值的差最小。 数据规模&#xff1a; &#xff08;1&#xff09;矩阵中的所有数都不超过1,000,000,000 &#xff08;2&#xff09;20%的数…

[USACO12MAR]花盆Flowerpot 二分答案+单调队列

题意&#xff1a; 给出N滴水的坐标&#xff0c;y表示水滴的高度&#xff0c;x表示它下落到x轴的位置。 每滴水以每秒1个单位长度的速度下落。你需要把花盆放在x轴上的某个位置&#xff0c;使得从被花盆接着的第1滴水开始&#xff0c;到被花盆接着的最后1滴水结束&#xff0c;之…

jQuery使用手册

jQuery是一款同prototype一样优秀js开发库类&#xff0c;特别是对css和XPath的支持&#xff0c;使我们写js变得更加方便&#xff01;如果你不是个js高手又想写出优 秀的js效果&#xff0c;jQuery可以帮你达到目的&#xff01;下载地址&#xff1a;Starterkit &#xff08;http:…

全志_外部中断

全志_外部中断 平台&#xff1a;全志A64 源码&#xff1a;Android 7.1  Linux3.1 1 #include <linux/init.h>2 #include <linux/module.h>3 #include <linux/fs.h>4 #include <linux/device.h>5 #include <linux/slab.h>6 #include <linux/…

[ZJOI2007]时态同步 树形DP

题意&#xff1a;给定一棵N个节点的无根树&#xff0c;每条边都有一个权值V&#xff0c;选取其中一个点作为关键点&#xff0c;你可以任意增加某条边的权值&#xff0c;求使得从关键点出发&#xff0c;到任意一个叶子节点的距离都相同所需要增加的权值和。 数据范围&#xff1a…