https://codeforces.com/gym/101911/problem/L

题意

在二维坐标系中给出两个直线 y = a, y = b。在这两条直线上分别有n个和m个传感器,可以任意选两个传感器A,B,发射一束A->B的激光,这个激光遇到直线就会反射,问最多会经过多少个传感器。

1<=n,m<=3e5

题解

先解决一个问题,已知一条射线,如何快速求出经过的传感器个数?

对于上下直线分开讨论。

  1. 假设如图所示,从下往上的射线在下直线的跨度是 c = ( x b − x a ) ∗ 2 c = (x_b-x_a)*2 c=(xb​−xa​)∗2,对于每个传感器令其坐标为 x u x_u xu​,只需 满足 x u ≡ x a m o d c x_u \equiv x_a \ mod\ c xu​≡xa​ mod c即在这个射线上。
  2. 对于上直线,同理,只需满足 x u + c / 2 ≡ x a m o d c x_u+c/2 \equiv x_a \ mod\ c xu​+c/2≡xa​ mod c

这两条直线间隔的距离是无所谓的,这个只决定射线的斜率而已。
一个很直观的做法就是枚举上下所有的两个点,然后取最大值,但这个复杂度不允许 O ( n 2 m 2 ) O(n^2m^2) O(n2m2)。

画画图可以发现,一些c比较大的射线能用比它小的射线代替,例如c = 6可以被 c = 2代替,但是c = 4 不能被 c = 2 代替。

多尝试一下发现只要 c = 2 l c = 2^l c=2l的射线都不可被替代, c = 2 l ∗ 奇 数 c = 2^l*奇数 c=2l∗奇数都可以被 c = 2 l c = 2^l c=2l的所代替。

所以我们只需在每个传感器处枚举 l o g ( 1 e 9 ) log(1e9) log(1e9)根射线即可。时间复杂度为 O ( ( n + m ) l o g ( 1 e 9 ) l o g ( n ) ) O((n+m)log(1e9)log(n)) O((n+m)log(1e9)log(n))

代码

#include <bits/stdc++.h>
using namespace std;
#define FOR0(a,b) for(int i = a; i < b; ++i)
#define FORE(a,b) for(int i = a; i <= b; ++i)
typedef long long ll;
typedef pair<int,int> pii;const int maxn = 1e5+5;map<ll,ll> mp1,mp2;
ll n,m;
ll a[maxn], b[maxn];;int main() {int y;scanf("%lld%lld", &n,&y);for(int i = 0; i < n; ++i)scanf("%lld", &a[i]);scanf("%lld%lld", &m, &y);for(int i = 0; i < m; ++i)scanf("%lld", &b[i]);ll c = 2;ll ans = 2;for(; c <= 1e9; c <<= 1) {mp1.clear();mp2.clear();for(int i = 0; i < n; ++i)mp1[a[i]%c]++;for(int i = 0; i < m; ++i)mp2[b[i]%c]++;for(int i = 0; i < n; ++i) ans = max(ans, mp1[a[i]%c]+mp2[(a[i]+c/2)%c]);for(int i = 0; i < m; ++i)ans = max(ans, mp2[b[i]%c]+mp1[(b[i]+c/2)%c]);}printf("%lld\n", ans);return 0;
}

Problem G Ray in the tube(思维)相关推荐

  1. L. Ray in the tube(思维暴力)

    L. Ray in the tube(思维&暴力) 思路:思维+暴力. 记:A,BA,BA,B的横坐标距离为xxx. 1.当xxx为奇数时,显然x=1x=1x=1包含所有奇数的情况. 2.当x ...

  2. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp

    Problem G. k-palindrome 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022 ...

  3. Problem G. Pandaria(线段树合并 + Kruskal 重构树)

    Problem G. Pandaria 给定一个有nnn条边的无向连通图,每条边有对应的边权,每个点有一个颜色, 问从一个点出发,经过不超过www的边权,所能到达的点中,颜色出现次数做多且颜色编号最小 ...

  4. Problem G: 函数---判断日期(年月日)是否合法

    Problem G: 函数---判断日期(年月日)是否合法 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 566  Solved: 240 Descr ...

  5. Problem G: C语言习题 医生值班

    Problem G: C语言习题 医生值班 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 847  Solved: 102 [Submit][Stat ...

  6. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜

    Problem G: 蛤玮点菜 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 320  Solved: 31 SubmitWeb Board Desc ...

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

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

  8. Problem G: 规范序排列

    Problem G: 规范序排列 Time Limit: 1 Sec  Memory Limit: 16 MB Submit: 1127  Solved: 651 [Submit][Status][W ...

  9. Problem G: 打印字母菱形图案

    Problem G: 打印字母菱形图案 Time Limit: 1 Sec  Memory Limit: 16 MB Submit: 392  Solved: 209 [Submit][Status] ...

最新文章

  1. 图片lightbox2
  2. wxpython设置listctrl选中行_Excel办公实操,进行给特定行(列),重复打印与避免打印...
  3. java数据从本地文件中取出_java 从数据库取数据并存入本地文本中
  4. python以下是变量合法命名的是_Python超级详细的变量命名规则
  5. 【计算机网络复习 数据链路层】3.5.3 CSMA协议
  6. 余承东卸任华为云CEO 兼任智能汽车解决方案 BU CEO
  7. 小网站架构优化-提升抗并发能力:子应用程序分离方案
  8. 多线程 简单的实现案例
  9. linux没有检测到触摸板,linux – 制作没有按钮的触摸板,就像带有按...
  10. atitit.提升稳定性---hibernate 增加重试retry 机制解决数据库连接关闭
  11. java判断session中是否存在_java中session用法 判断用户是否登录
  12. JanusGraph安装和配置教程
  13. 6大页面数据抓取工具
  14. 【ArcGIS|空间分析】选址分析(为学校选址)
  15. PAT 甲级 1015. Reversible Primes
  16. redis双写不一致终极解决方案分析
  17. Android攻城狮ScrollView
  18. 【解决方案】webpack `Invalid Host/Origin header`问题
  19. 奔驰c260语言设置方法图解,奔驰glc260l​中控​按钮图解,glc260l车内按键功能说明...
  20. Linux中cut命令的作用

热门文章

  1. 干货 | 携程Dynamo风格存储的落地实践
  2. Unity自定义创建文件夹
  3. Windows 10快速删除大量回收站文件以及由此引起的回收站右键清空反应慢问题的解决
  4. 全球首推语音定制产品,百度地图背后的语音技术到底有多强大?
  5. 风力机叶片气动设计 matlab 程序,基于MATLAB的小型风力机叶片设计
  6. Sping中怎么处理@Bean注解bean同名的问题
  7. win10文件后缀名怎么显示_Win10显示隐藏文件后系统根目录( C盘)文件及文件夹的作用...
  8. js获取字符串字符数和字节数,注意:区分字符串字符数和字节数(编程环境UTF-8的情形)
  9. python 3.x语句print_Python 3.x语句print(1,2,3,sep=’.’)
  10. 基于Linux的及时通信软件