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,一经查实,立即删除!

相关文章

C# 视频监控系列(2):客户端——封装API

前言 本章主要是在C#封装的海康DVR客户端SDK 的代码上修改的&#xff0c;并参考《Hikvision 板卡网络开发包编程手册V4.7.pdf》补上更完整的注释&#xff0c;并且参照VC源码做了小部分修改。 参考 1. C#封装的海康DVR客户端SDK 系列 1. C# 视频监控系列&#xff08;1&…

java继承 、方法重写、重写toString方法

1.Java的继承&#xff0c;关键词Extends 1 package cn.mwf.oo;2 3 public class TextExtends {4 public static void main(String[] args) {5 Student s new Student("侠客小飞", 60, "计算机科学与技术");6 s.rest();7 s.st…

网络攻击与防御 实验1

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

ActiveRecord.JS 与 Google Gears

ActiveRecord是仿照Rails的ActiveRecord写的js orm框架&#xff0c; 我使用它操作gears 的sqlite数据库。看起来不错&#xff0c;但是文档比较恶心&#xff0c;我按照文档的操作ActiveRecord.define方法根本就不能用&#xff0c;去邮件列表里一看&#xff0c;有个老外和我一样的…

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…

忧伤的池塘

雨滴 和我出生以前一样&#xff0c; 雨水的气息里&#xff0c; 村庄安静下来。 天总是暗得很早&#xff0c; 晃动着木叶和漆黑的门。 没有人在村子里走动&#xff0c;黑暗的木条窗 正流淌进忧伤的池塘。转载于:https://blog.51cto.com/nuhuhu/133658

[转]使用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关开一次既解决】 教程篇 …

IIS的安全配置策略

IIS的安全配置策略<?XML:NAMESPACE PREFIX O />因为IIS(即Internet Information Server)的方便性和易用性&#xff0c;使它成为最受欢迎的Web服务器软件之一。但是&#xff0c;IIS的安全性却一直令人担忧。如何利用IIS建立一个安全的Web服务器&#xff0c;是很多人关心…

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

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

robots.txt 简单解析

简介 robots.txt 是一个规范&#xff0c;对于执行正常操作的爬虫理应遵守的规范. 例子 博客园例子 https://www.cnblogs.com/robots.txt User-Agent: * Allow: / 允许所有爬虫爬取网站任何地址。 百度例子 User-agent: Baiduspider # 百度自己的爬虫 Disallow: /baidu # 不允许…

rhel5之光盘更新终结篇

1&#xff0c;进入/etc/yum.repos.d目录中&#xff0c;编辑rhel5-local.repo文件&#xff0c;这个文件名可以随便取&#xff0c;以个人爱好为准&#xff0c;加入如下内容&#xff1a; [Cluster] nameRed Hat Enterprise Linux $releasever - $basearch -Cluster baseurlfile://…

爬虫 查看站点的个数和解析网站使用的技术栈和找到网站的所有者

简介 网站的个数可以作为自己要爬取时间的估算。 技术栈可以知道自己要爬取的难度。 网站的个数 www.baidu.com 然后 输入 site:www.cnblogs.com 就可以知道 博客园大概有多少个页面了。 1000万个左右。 识别网站所采用技术栈 pip install builtwith import builtwith builtwit…

安装Windows 2003 域控制器

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