题目链接

\(Description\)

有两条平行于\(x\)轴的直线\(A,B\),每条直线上的某些位置有传感器。你需要确定\(A,B\)轴上任意两个整点位置\(x_A,x_B\),使得一条光线沿\(x_A\to x_B\)射出(碰到\(A,B\)后反射),能够碰到的传感器数量最多是多少。

每条直线上的传感器数量\(\leq10^5,\ 0\leq x_i\leq 10^9\)。

\(Solution\)

由光的反射定律可知,光束接触直线的相邻两个点的水平距离是确定的,设这个距离为\(dx\)(纵坐标就没有什么用了)。

那么会被从\(x_A\)出发的光束照到的点,在\(A\)轴上满足坐标为\(x_A+2k\cdot dx\);在\(B\)轴上满足坐标为\(x_A+(2k-1)\cdot dx\)。

我们发现若\(dx=a\cdot b\),\(a\)为奇数,\(b\)为\(1\)或偶数,则选\(dx'=\frac{dx}{a}=b\)会碰到所有\(dx\)会碰到的点,即不会更差。

换句话说就是,所有 \(dx=奇数\) 可以被 \(dx'=1\) 取代,\(dx=偶数\) 可以被 \(dx'=某个2的幂\) 取代。

所以存在(除\(1\)外的)奇数因子的\(dx\)没有必要判断。那么我们只需要判断\(dx=2^l,l\geq 0\)的情况。这一共有\(\log(10^9)\)种。

对于一个确定的\(dx\),如果\(A\)轴上两个点\(x_1,x_2\)同时被碰到,那么满足\(x_1\equiv x_2\mod{(2 \cdot dx)}\);

如果选了\(A\)轴上的\(x_1\),\(B\)轴上的一个点\(x_2\)想要被碰到,就要满足\(x_1+dx\equiv x_2\mod{(2 \cdot dx)}\)。

所以我们把\(A\)点集中的每个\(x_i\)对\(2dx\)取模,\(B\)组中的每个\(x_i\)减掉一个\(dx\)再对\(2dx\)取模)。

然后把余数相同的分为一组,点数最多的一组就是当前最优解。

sort或直接map都可以。

复杂度\(O(n\log n\log(10^9))\)。

注意\(ans\)初始是\(2\)。。

//171ms	1500KB
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 150000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=2e5+5; int n,A[N],tmp[N],Now;
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
} int main()
{
int n=read(); read();
for(int i=1; i<=n; ++i) A[i]=read();
int m=read(),tot=n+m; read();
for(int i=n+1; i<=tot; ++i) A[i]=read(); int ans=2/*!*/; tmp[tot+1]=2e9+1;
for(int dx=1; dx<=int(1e9); dx<<=1)
{
int mod=dx<<1;
for(int i=1; i<=n; ++i) tmp[i]=A[i]%mod;
for(int i=n+1; i<=tot; ++i) tmp[i]=(A[i]+dx)%mod;
std::sort(tmp+1,tmp+1+tot);
for(int i=1,las=1; i<=tot; ++i)
if(tmp[i+1]!=tmp[i]) ans=std::max(ans,i-las+1), las=i+1;
}
printf("%d\n",ans); return 0;
}

Codeforces.1041F.Ray in the tube(思路)的更多相关文章

  1. Codeforces 1041F Ray in the tube (看题解)

    Ray in the tube 感觉是套路题.. 如果确定一个差值x我们如何取确定答案呢, 我们把a[ i ] -> a[ i ] % (2 * x), 把b[ i ] -> (b[ i ...

  2. L - Ray in the tube Gym - 101911L (暴力)

    ---恢复内容开始--- You are given a tube which is reflective inside represented as two non-coinciding, but ...

  3. CF 1041 F. Ray in the tube

    F. Ray in the tube 链接 题意: 有两条平行于x轴的直线A,B,每条直线上的某些位置有传感器.你需要确定A,B轴上任意两个整点位置$x_a$,$x_b$,使得一条光线沿$x_a→x_ ...

  4. Codeforces | CF1041F 【Ray in the tube】

    昨天晚上全机房集体开\(Div2\),因为人傻挂两次\(B\)题的我开场就\(rank2000+\dots qwq\)于是慌乱之中的我就开始胡乱看题(口胡),于是看了\(F\dots\)(全机房似乎也 ...

  5. Codeforces Round #509 (Div. 2) F. Ray in the tube(思维)

    题目链接:http://codeforces.com/contest/1041/problem/F 题意:给出一根无限长的管子,在二维坐标上表示为y1 <= y <= y2,其中 y1 上 ...

  6. codeforces 724c Ray Tracing

    好题 原题: There are k sensors located in the rectangular room of size n × m meters. The i-th sensor is ...

  7. Sereja and Brackets CodeForces - 380C (线段树+分治思路)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  8. codeforces 630C - Lucky Numbers 递推思路

    630C - Lucky Numbers 题目大意: 给定数字位数,且这个数字只能由7和8组成,问有多少种组合的可能性 思路: 假设为1位,只有7和8:两位的时候,除了77,78,87,88之外还哇哦 ...

  9. [CF1041F Ray in the tube][数学]

    http://codeforces.com/contest/1041/problem/F 题目大意: 下边界有n个给定点,上边界有m个给定点,可以从任意一个点发出一条激光,激光碰到边界会反射 激光到达 ...

随机推荐

  1. Tomcat权威指南-读书摘要系列10

    Tomcat集群 一些集群技术 DNS请求分配 TCP网络地址转换请求分配 Mod_proxy_balance负载均衡与故障复原 JDBC请求分布与故障复原

  2. Python模块调用方式详解

    Python模块调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其 ...

  3. SQL语句(十三)多表查询

    多表查询 1. 笛卡尔乘积 简单格式 SELECT * 或字段列表 FROM 数据表列表 实例 --1. 笛卡尔乘积 (五条件的连接--很多条件无意义) Select * from Student, ...

  4. XMPP 基础

    CHENYILONG Blog XMPP 基础 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong ...

  5. Linux 并发链接数

    并发数查看   查看 TCP 协议连接数 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' SYN_RECV # ...

  6. Linux内核启动流程分析(一)【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接 ...

  7. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  8. jquery.validate动态更改校验规则

    有时候表单中有多个字段是相互关联的,以下遇到的就是证件类型和证件号码的关联,在下拉框中选择不同的证件类型,证件号码的值的格式都是不同的,这就需要动态的改变校验规则. 点击(此处)折叠或打开 <! ...

  9. 用Executors工具类创建线程池

    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 线程池主要用来解决线程生命周期开销问题和资源不足问题.通过对多个任务重用线程,线程创建 ...

  10. 不使用第三方软件、使用IE11自带功能来屏蔽浏览器广告

    第一步: 下载后面的附件http://files.cnblogs.com/limits/IE11%E5%8E%BB%E5%B9%BF%E5%91%8A.zip 打开此路径IE11跟踪保护+CSS去广告 ...