昨天晚上全机房集体开\(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. 02-安装linux系统

    安装linux系统 需要准备的软件: 1.VMware-workstation-full-14.1.1.28517.exe 2.CentOS-6.5-x86_64-bin-DVD1.iso镜像文件 第 ...

  2. 使用json读写文件中的数据

    把json的数据写入到文件中 import json with open('data.json','w+') as f: json.dump({"name":"张彪&qu ...

  3. java集合迭代器

    一.Java中有一个设计模式是迭代器模式 1.迭代器模式定义迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.迭代器模式概述Java集合框 ...

  4. WebSocket推送

    本篇博客只是记录websocket在自己的项目中的应用,只是记录,不做说明(后来替换为GoEasy了). /** * 握手的设置,这其实是为了获取session */ public class Get ...

  5. js中表达式 >>> 0 浅析

    zepto源码的Array.prototype.reduce有一行 len = t.length >>> 0 当时就很疑惑,知道 >>是移位,那>>>又 ...

  6. java学习之—栈匹配字符串符号

    /** * 栈 * Create by Administrator * 2018/6/11 0011 * 上午 10:20 **/ public class StackR { private int ...

  7. github上测试服出现bug,如何回滚并获得合并之前的分支

    使用场景: 当我们提交了一个pr,但是该pr合并之后,经过在测试测试有问题,需要回滚.这个时候主master代码将会被回滚到提交你的pr之前的代码.而你的pr由于已经被合并过了,所以无法继续提交. 这 ...

  8. 重写TreeView模板来实现数据分层展示(二)

    前面一片文章实现TreeView的基本的模板重写,那么照着这个思路,我们再来写一个稍稍复杂的TreeView ,其它的内容都和前面系列内容相似,还是和之前文章介绍的一样,首先看看做出的DEMO的最终样 ...

  9. WPF Path总结(一)

    首先来看看Path的定义,参考MSDN:绘制一系列相互连接的直线和曲线.介绍比较简单,我们再来看看备注中有些什么,Path 对象可以绘制封闭式还是开放式形状. 多个形状和甚至曲线的形状.与不 Line ...

  10. C#中is运算符

    is运算符可以检查对象是否与特定的类型兼容.“兼容”表示对象或者该类型,或者派生自该类型.例如,要检查变量是否与object类型兼容,可以使用下面的代码: int i=10; if(i  is  ob ...