CF1167G题解
CF1167G题解
简化题意:数轴上有 n 个不相交且处于坐标为非负整数的单位正方形,给 m 个询问点,求出把这个点右侧的数轴逆时针旋转至与左侧相交时的角度。
首先,碰撞时只能有以下两种情况:
1.正方形与数轴碰撞。
2.正方形与正方形碰撞。
对于第一种情况,我们通过画图就可以很好理解求法:

答案就是 \(\arctan \dfrac{1}{d}\) 。
对于第二中情况,我们可以证明,两个正方形只会在顶点上相交。

采用反证法,如果两个正方形的交点 A 在其中一个的边上(显然不可能都在边上),那么过 A 向其所在的边所对的正方形的底边作垂线,并连接 A 与旋转中心 M ,我们就可以通过角平分线的性质证明出 \(\triangle AMH\) 全等于 \(\triangle AMB\) ,因此 \(BM=HM\) ,而 B,M 都是整点,因此 \(BM\) 长为整数,所以 \(HM\) 长为整数,H 在整点上,这也就证明了交点一定在正方形顶点上。
那满足什么条件时才会在顶点上相交呢?

结合下图和上图我们可以推出,当 \(\left|d1-d2\right|\leqslant1\) 时两个正方形会相交在顶点上,这时答案为 \(2\times\arctan \dfrac{1}{\max(d1,d2)}\) 。

数学的部分结束了,我们就开始考虑做法。
对于情况一,我们可以通过双指针 \(O(n)\) 求出所有答案。但对于情况二,我们考虑到情况一的答案最小为 \(\arctan \dfrac{1}{3500}\) ,这时情况二里 \(\max(d1,d2)\) 为 \(7000\) ,也就是说要向两侧找最多 \(7000\) 个点,直接暴力找是 \(O(md)\) 的,过不了,但我们可以用 bitset 来维护每个询问点左右两侧 d 个点上是否有正方形,这样就可以把复杂度降到 \(O(\dfrac{nd}{w}+q)\) ,这样就可以通过此题。
#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
inline int read(){
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s;
}
const int N=200501;
const ld pi=acos(-1);//求π
int n,d,m,le,ri;
ll a[N],q[N];
bitset<7005>l,r,tmp;
ld work(int i,int j){
return atan((ld)i/(ld)j);
}
int main(){
// freopen("travel.in","r",stdin);
// freopen("travel.out","w",stdout);
n=read(),d=read();
for(int i=1;i<=n;i++)a[i]=read();
m=read();
for(int i=1;i<=m;i++)q[i]=read();
for(int i=1;i<=n&&a[i]<=q[1]+7000;i++){//处理第一个询问点前的情况
if(a[i]>=q[1])r.set(a[i]-q[1]);
else{
le=i+1;
if(a[i]>=q[1]-7001)l.set(q[1]-a[i]-1);
}
}
for(int i=1;i<=m;i++){
ld ans=0;
int pos=0;
if(l.test(0)||r.test(0))ans=pi/(ld)2.0;
else ans=work(1,min(l._Find_first(),r._Find_first()));
tmp=l&r;if(tmp.any())pos=tmp._Find_first(),ans=max(ans,pos?2*work(1,pos):pi);//d1=d2的情况
tmp=(l<<1)&r;if(tmp.any())pos=tmp._Find_first(),ans=max(ans,2*work(1,pos));
tmp=l&(r<<1);if(tmp.any())pos=tmp._Find_first(),ans=max(ans,2*work(1,pos));//|d1-d2|=1的情况
printf("%.15Lf\n",ans);
if(i==m)return 0;
l<<=(q[i+1]-q[i]),r>>=(q[i+1]-q[i]);
while(a[le]<q[i+1]){
if(a[le]>=q[i+1]-7001)l.set(q[i+1]-a[le]-1);
le++;
}
while(a[ri]<=q[i+1]+7000&&ri<=n){
if(a[ri]>=q[i+1])r.set(a[ri]-q[i+1]);
ri++;
}
}
}
CF1167G题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 大唐电信AC集中管理平台弱口令漏洞
网络资产搜索: 找到平台 进行默认口令登入:admin/1***** 登陆 End!!!
- 配置SASS过程
1.首先在电脑上安装Node.js 2.其次在命令行配置npm,命令:npm init.运行后会创建一个package.json文件 3.然后输入命令配置npm中可以使用SASS的包,命令:npm i ...
- IIS 7.0、IIS 7.5 和 IIS 8.0 中的 HTTP 状态代码
https://support.microsoft.com/zh-cn/help/943891/the-http-status-code-in-iis-7-0--iis-7-5--and-iis-8- ...
- Java中File类
File类是java.io包中唯一代表磁盘文件本身的对象.File类的对象主要用来获取文件本身的一些信息,如文件所在目录.文件长度.读写权限等. 一. 文件的创建与删除 通常使用以下三种方法来创建一个 ...
- UGUI让自动布局下的子物体不接受布局(LayoutGroup)影响
在子物体上添加Layout Element组件 看到这个组件上有个Ignore Layout,这个就是忽视布局,把它勾上就可以忽视父级对它的布局了. 转自:https://zhuanlan.zhihu ...
- Servlet执行步骤
<!-- 1. 用户发请求,action=add 2. 项目中,web.xml中找到url-pattern = /add -> 第12行 3. 找第11行的servlet-name = A ...
- 本地mysql端口3306 一直干不掉这样解决
第一步:先whereis mysql(查找到MySQL的一些本地文件) 主要删除这两个 再干掉端口3306 即可
- layui.dtree的学习,自定义扩展toolbar按钮(toolbarExt)
学习layui.dtree请前往 http://www.wisdomelon.com/DTreeHelper/ 记录一下dtree的自定义扩展toolbar按钮(toolbarExt) html代码: ...
- dbeaver,执行SQL时,空行导致SQL执行报错" ERROR: syntax error at or near "case"Position: 1"
dbeaver,执行SQL时,空行导致SQL执行报错" ERROR: syntax error at or near "case"Position: 1" 解决 ...
- decode procedure
1 test data preparation 1> select representative data voice to match real application scenario ...