天神下凡

天神下凡

断了今生、忘了曾经 提交于 2020-03-17 06:16:15
https://zybuluo.com/ysner/note/1176892 题面 给出 \(n\) 个圆心同在 \(x\) 轴上的圆,问圆的轮廓将平面分为几块?( 保证圆互不相交 ) \(n\leq3*10^5\) \(r\leq10^9,x\leq10^9\) 解析 经过观察,可以发现,如果一个圆的直径被其它小圆的直径完全覆盖,就会产生额外一贡献。 因为圆在一条直线上,我们只用关心其在直线上的一部分,即可以 用直径代替一个圆 。 一条直线再次被覆盖?能想到什么? 线段树?栈? \(method\ 1\) 并查集 据说这是我的原创方法? 在手玩样例时,我发现, 每次产生贡献的前一步都是把已联通(通过圆相切的方式)的两个点作为一个圆直径的两端点 。 如何判断两点是否联通? 每覆盖一条直线,两端点就连通了,此时两端点中间的点就没用了,直接把两端点纳入同一并查集即可。 当然,两端点联通有一种方式叫 在同一圆直径的两端 ,即存在同圆,这会影响答案,要排序除掉。 由于半径范围(即直径两端点范围)过大,要用 \(map\) 。 于是复杂度达到了 \(O(nlog^2n)\) ,但时间比为 \(1.16s/3s\) ,不虚。(并查集+ \(map\) ) 可以通过离散化达到 \(O(nlogn)\) #include<iostream> #include<cmath> #include

天神下凡

北城余情 提交于 2020-03-17 06:15:23
背景 Czy 找到宝藏获得屠龙宝刀和神秘秘籍!现在他要去找经常ntr 他的Jmars 报仇…… 题目描述 Czy 学会了一招“堕天一击”,他对一个地点发动堕天一击,地面上就会留下一个很 大的圆坑。圆坑的周围一圈能量太过庞大,因此无法通过。所以每次czy 发动技能都会把 地面分割。Jmars 拥有好大好大的土地,几十眼都望不到头,所以可以假设土地的大小是 无限大。现在czy 对他发动了猛烈的攻击,他想知道在泽宇攻击之后他的土地被切成几份 了? Czy 毕竟很虚,因此圆心都在x 坐标轴上。另外,保证所有圆两两之间不会相交。 格式 输入第一行为整数n,表示czy 放了n 次堕天一击。 接下来n 行,每行两个整数x[i],r[i]。表示在坐标(x[i] , 0)放了一次堕天一击,半 径为r[i]。 输出一行,表示地面被分割成几块。 样例输入 4 7 5 -9 11 11 9 0 20 样例输出 6 数据范围 对于30%数据,n<=5000 对于100%数据,1<=n<=300000,-10^9<=x[i]<=10^9,1<=r[i]<=10^9. solution: 这道题我打的真是暴力,A了......... 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #include