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

起初想到的只有\(n^2\)的暴力,然而复杂度显然炸了,于是试图寻找规律,但是只想到一个假结论:忽略\(y\),然后取上面坐标为奇数的点数与下面坐标为偶数的点数的和与上面坐标为偶数的点数与下面坐标为奇数的点数的和,也即步长为\(1\)

但是显然这样过不了样例啊(上面的方法输出\(2\dots\)然而答案是\(3\)),因为没有考虑在上面和下面选的点的坐标奇偶性相同的情况,也即步长为\(2k(k\in N_+)\)的情况,但是如果要枚举\(\forall k\in [1,5\cdot10^8]\)的话显然复杂度还是不对,于是切\(F\)题的幻想就此破灭\(qwq\)(所以我把CD都切了(逃))

于是经过一番仔\((can)\)细\((kao)\)思\((ti)\)考\((jie)\)发现只需要枚举步长为\(2^i(i\in[0,29])\)即可且\(y\)坐标可以忽略,证明如下:

对\(y\)坐标可以忽略的解释:考虑\(y\)坐标在步长一定时只会影响\(ray\)的斜率,而反射时斜率取相反数,所以显然在\(y\)坐标差一定的情况下,步长总是定值,反射点也总是固定的(口胡),所以不妨忽略\(y\)坐标的影响(可以画图模拟一下)

假设步长不为\(2^k(k\in N)\)则一定可以表示为\(2^l\cdot (2p+1)(l,p\in N)\),此时我们作出从某一点出发步长分别为\(2^l,2^l\cdot(2p+1)(l,p\in N)\)的\(ray\)的路径图像(假设此时\(l=1,p=3\),点\((2,0)\)是两条\(ray\)的一个公共点,则步长分别为\(2,6\))



不难发现在步长不等于\(2^l(l\in N)\)时,步长为\(2^l\cdot (2p+1)(l,p\in N)\)的\(ray\)的反射点与步长为\(2^l\)的\(ray\)的反射点完全重合且反射点密度小于步长为\(2^l\)的\(ray\)的反射点密度,所以对于所有步长非\(2^k(k\in N)\)的\(ray\)一定会存在一个更优解使得\(ans\)更大,由此可得只需判断步长为\(2^k(k\in N)\)的情况即可

所以正解就是枚举对于所有的出发点,步长为\(2^i(i\in[0,29])\)的情况,对所有的\(ans\)取\(max\)即可,每次枚举\(i\)对所有坐标分上下对\(2^{i+1}\)取模分类,用\(map\)存余数为\(r(r\in[0,2^{i+1}-1])\)的坐标个数,时间复杂度为\(O((log10^9)\cdot(n+m))\)

\(AC\)代码\(\downarrow\downarrow\downarrow\)

#include<cstdio>//CF1041F
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map> using namespace std; const int N=1e5+5; int n,m,y,a[N],b[N],base2[31],ans,LUOGU; void solve(int u){
map<int,int>cntd,cntu;
int mod=base2[u+1];
for(int i=1;i<=n;i++){
cntd[a[i]%mod]++;
}
for(int i=1;i<=m;i++){
cntu[b[i]%mod]++;
}
for(int i=1;i<=n;i++){
ans=max(ans,cntd[a[i]%mod]+cntu[(a[i]+base2[u])%mod]);
}
for(int i=1;i<=m;i++){
ans=max(ans,cntu[b[i]%mod]+cntd[(b[i]+base2[u])%mod]);
}
} int main(){
for(int i=0;i<=30;i++){
base2[i]=(1<<i);
}
scanf("%d%d",&n,&y);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
scanf("%d%d",&m,&y);
for(int i=1;i<=m;i++){
scanf("%d",&b[i]);
}
for(int i=0;i<=29;i++){
solve(i);
}
printf("%d\n",max(ans,2));
return 0;
}

Codeforces | CF1041F 【Ray in the tube】的更多相关文章

  1. CodeForces 582A【multiset使用样例】

    题意: 给一些无序的数字,求解一个矩阵,使得矩阵的每一个元素都是行和列标志数的gcd,输出行标志数. 首先对数字进行排序.复杂度n*log(n^2). 这题的证明有官方的英文题解==在这直接贴英文题解 ...

  2. Codeforces 61B【怪在读题】

    搞不懂为什么DFS的写法崩了,然后乱暴力,因为题意不是很懂... 主要还是读题吧(很烦 #include <bits/stdc++.h> using namespace std; type ...

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

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

  4. 【淡墨Unity3D Shader计划】一间 创建一个游戏场景 &amp; 第一Shader写作

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  5. B. Lost Number【CF交互题 暴力】

    B. Lost Number[CF交互题 暴力] This is an interactive problem. Remember to flush your output while communi ...

  6. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  7. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  8. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  9. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

随机推荐

  1. PAT L2-009 抢红包

    https://pintia.cn/problem-sets/994805046380707840/problems/994805066890854400 没有人没抢过红包吧…… 这里给出N个人之间互 ...

  2. SQL UPDATE with INNER JOIN

    mysql - SQL UPDATE with INNER JOIN - Stack Overflowhttps://stackoverflow.com/questions/14491042/sql- ...

  3. Eclipse支持文件UTF-8编码

    Eclipse修改编码格式_百度经验https://jingyan.baidu.com/article/2009576193ee38cb0721b416.html 这篇最棒 如何为eclipse中的文 ...

  4. MySQL之优化

    当 MySQL 单表记录数过大时,增删改查性能都会急剧下降,本文会提供一些优化参考,大家可以参考以下步骤来优化. 一. 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻 ...

  5. 深入解读Promise对象

    promise对象初印象: promise对象是异步编程的一种解决方案,传统的方法有回调函数和事件,promise对象是一个容器,保存着未来才会结束的事件的结果 promise对象有两个特点: 1.p ...

  6. [官网]CREATE EXTENSION PostGreSQL 创建函数的方法

    CREATE EXTENSION https://www.postgresql.org/docs/current/sql-createextension.html CREATE EXTENSION — ...

  7. [转帖]csdn windows 下载整理.

    特别说明:本帖不提供任何密钥或激活方法,请大家也不要在帖内回复或讨论涉及版权的相关内容,仅提供原版ISO下载链接 https://bbs.csdn.net/topics/391111024?list= ...

  8. java随笔3 spring 的注入执行逻辑顺序

  9. rpm和yum

    RMP(红帽软件包管理器) RPM有点像Windows系统中的控制面板,会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系. YUM(软件仓库)

  10. 在windows 7 和linux上安装xlwt和xlrd

    在windows 7上安装xlwt xlrd xlwt是开源社区编写的python库,需要单独安装,下载地址https://pypi.python.org/pypi/xlwt 目前xlwt最新的版本是 ...