首页 > 其他分享 >circle 题解(思维+堆)

circle 题解(思维+堆)

时间:2023-02-04 19:56:32浏览次数:72  
标签:node 思维 int 题解 大圆 端点 circle define

题目

有 \(n\) 个圆心在 \(x\) 轴上的不相交的圆(存在边界重合),求这些圆将平面分为几部分。

保证 \(1 \leq n \leq 3 \times 10^5\),\(-10^9 \leq x_i,y_i \leq 10^9\)。

一个圆一定将平面(无论它被多少个圆嵌套)分为两部分,我们考虑什么时候这个圆会有额外的贡献。

solution

很容易想到一种情况:

pSygsOA.png

此时,两个在大圆中的圆将大圆分割出了额外的一份,贡献加一。

于是我们考虑用一个 map 存储一条线段是否出现过,当两个圆左端点相同时查询是否存在另一半可以分割大圆,如果存在答案加一。

于是我们可以将所有圆按照左端点相同时右端点降序排列,左端点不同左端点降序排列的策略排序,这样可以保证每一对嵌套关系相邻,而且方便处理多层嵌套。

但是还有反例:

pSygXfU.png

如图,此时大圆被三个圆分割,但由于我们一次只处理两个圆,无法统计这种贡献。

我们考虑虚构一个圆,左端点为小圆的右边界,右端点为大圆的右边界,但不计算他的初始贡献。

pSy2lAP.png

此时,当处理到新加入的圆以及圆 \(f\) 时,可以检索到圆 \(d\),贡献被成功计算。

如果新加入的圆无法被分割,由于不计算初始贡献,所以对答案没有影响。

因此,我们需要一个可以快速排序,支持插入的数据结构,堆可以很完美地解决。

点击查看代码
#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define debug cout<<"DEBUG"<<endl;
#define pb push_back
#define pii pair<int,int>
#define vi vector<int>
#define imp map<int,int>
using namespace std;
const int N=300005;
int n;
struct node{
	int l,r;
	bool operator<(const node &k)const {
        if(l==k.l){
        	return r>k.r;
		}
        return l>k.l;
    }
}a[N];
priority_queue<node>q;
map<node,int>vis;
ll ans=1;
int main(){
	freopen("circle.in","r",stdin);
	freopen("circle.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		a[i].l=x-y;
		a[i].r=x+y;
		vis[(node){a[i].l,a[i].r}]=1;
		q.push((node){a[i].l,a[i].r});
		ans++;
	}
	while(q.size()>1){
		node t=q.top();
		q.pop();
		node t2=q.top();
		int l=t.l,r=t.r;
		int l2=t2.l,r2=t2.r;
		if(l==l2){
			if(vis[(node){r,r2}]==1){
				ans++;
			}else{
				q.push((node){r,r2});
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

标签:node,思维,int,题解,大圆,端点,circle,define
From: https://www.cnblogs.com/victoryang-not-found/p/17092214.html

相关文章

  • 每日一道思维题——CF1691C - Sum of Substrings
    题意:给定一个长度为n的字符串算由SiSi+1构成的子字符串值如00为0,01为1,10为10,11为11F(s)为所有值之和求出此值的最小值思路:优先将1放到最后,其次将1放在开头其余的位置......
  • CF765F Souvenirs 题解
    Preface在会压位Trie的前提下,本题最好想的做法应该是压位Trie+回滚莫队,可是竟然没人写这个做法的题解?Solution我们先转化题意:设\(a_i\)在\([l,r]\)中的前驱后继......
  • C语言初阶思维导图
    ​​C语言初阶思维导图文字版​​​​C语言思维导图清晰版​​......
  • 信息安全之web渗透测试思维导图
    一、概述本文包括以下安全思维导图:Web常见漏洞信息收集社会工程学技巧代码审计弱点检测初级安全技术学习路......
  • PAT乙级题解
    1001害死人不偿命的(3n+1)猜想传送门知识点:简单模拟思路:判断奇偶,根据题意即可参考代码:点击查看代码#include<iostream>usingnamespacestd;intmain(){i......
  • 题解 G. Grammar Path 2020-2021 ICPC NERC (NEERC), North-Western Russia Regional
    传送门【大意】给定一个CNF和一个有向图。有向图上的每一条边都写上了一个字母。要求你从\(s\)到\(t\)走一条尽可能短的路,且将经过的字母写下来后,这个字符串能被......
  • [JOI 2021 Final] 地牢 3 题解
    做法学习自日语酱的题解/hs/bx。本文旨在讲述我个人看完题解对此题做法的理解,可以视作对日语酱题解的注解(?。本人很菜,很可能出错,请谅解qwq。首先,对样例进行模拟,得到......
  • 最小公倍佩尔数 题解
    首先需要知道\(f\)是个啥这里直接给出结论,过程可以看大佬的博客\(f(n)=2f(n-1)+f(n-2)\)\(f(0)=0\)\(f(1)=1\)这种类似斐波那契数列的递推式有结论\(gcd(......
  • P3119 [USACO15JAN]Grass Cownoisseur G 题解
    做过的原题,模拟赛时PDF里的题面实在有点难受。首先有显然结论:在一个环上反走一定是不值的,因为环上的点本来就相互可达。所以考虑缩点。缩点后的问题可以看成:求对于每一......
  • P8368 [LNOI2022] 串 题解
    题目链接题目分析题目要求我们构造一个最长的\(T\)序列,我们首先从每个\(T_i\)入手,思考如何安排才能合法。容易观察到对于每个\(T_i\),合法的\(T_{i-1}\)有两种方......