国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【BZOJ 4561】【JLOI 2016】圓的異或并

2019-11-06 06:06:17
字體:
來源:轉載
供稿:網友

先貼一下大神的鏈接。寫得非常簡練啊 http://blog.csdn.net/commonc/article/details/51392221

考慮把一個圓當做左右括號,每次掃到圓的左端點就相當于找到一個左括號,入棧;掃到圓的右端點,就和左括號一起出棧。 其實這道題目有個非常重要的性質:圓兩兩之間無交點。這個性質在很多地方要用,首先就是上面的做法就要用到。 然后考慮怎么判斷這個圓的面積是加的還是減的。一開始我自己yy了一個算法,大概就是看一下距離當前最近的那條弧是凸的還是凹的,凸的說明那個圓和自己的情況是相同的,凹的說明自己被那個圓包含。后來想了一下好麻煩。。。 上面鏈接中的做法意思差不多,但是想起來簡單很多。具體可以看代碼。對于已經處理過的圓,分成兩半存在set里面,下半弧是-1,上半弧是1。然后從左端點射出一條豎直向上的線,找到第一個相交的點(就是upper_bound那部分),如果這個點是下半弧的一部分(凸的),那么那個圓和自己的情況是相同的,如果這個點是上半弧的一部分(凹的),說明自己被那個圓包含。如果相切的話顯然優先當做下半弧考慮。

#include<set>#include<cmath>#include<cstdio>#include<vector>#include <queue>#include<cstring>#include<iomanip>#include<stdlib.h>#include<iostream>#include<algorithm>#define ll long long#define inf 1000000000#define mod 1000000007#define N 400005#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;struct cir{ll x,y,r;}c[N];struct pnt{ll num,x,kind;}b[N];set<pnt> S;ll n,i,nw,k;int f[N];ll sqr(ll x) {return x*x;}bool cmp(const pnt &x,const pnt &y) {return x.x<y.x;}bool Operator <(pnt x,pnt y) { double xx=c[x.num].y+x.kind*sqrt(sqr(c[x.num].r)-sqr(nw-c[x.num].x)); double yy=c[y.num].y+y.kind*sqrt(sqr(c[y.num].r)-sqr(nw-c[y.num].x)); if(xx!=yy) return xx<yy; return x.kind<y.kind; } int main(){ scanf("%lld",&n); fo(i,1,n) { scanf("%lld%lld%lld",&c[i].x,&c[i].y,&c[i].r); b[++k] = (pnt){i,c[i].x-c[i].r,1}; b[++k] = (pnt){i,c[i].x+c[i].r,-1}; } sort(b+1,b+k+1,cmp); set<pnt>::iterator it; fo(i,1,k) { nw = b[i].x; if (b[i].kind == 1) { it = S.upper_bound((pnt){b[i].num,0,-1}); //找當前左端點向上碰到的第一條弧 if (it == S.end()) f[b[i].num] = 1; else { if ((*it).kind == 1) f[b[i].num] = -f[(*it).num]; //如果是上半弧,說明被包含 else f[b[i].num] = f[(*it).num]; //如果是下半弧,說明包含情況和那個圓相同 } S.insert((pnt){b[i].num,0,-1});//插入兩條弧 S.insert((pnt){b[i].num,0,1}); } else { S.erase((pnt){b[i].num,0,-1});//刪去兩條弧 S.erase((pnt){b[i].num,0,1}); } } ll res = 0; fo(i,1,n) res+=sqr(c[i].r)*f[i];
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 达拉特旗| 绥棱县| 山阳县| 精河县| 德庆县| 麦盖提县| 介休市| 墨竹工卡县| 苍山县| 韶山市| 康马县| 清水河县| 金堂县| 五寨县| 霍城县| 临邑县| 辰溪县| 屏南县| 开封市| 婺源县| 馆陶县| 湘西| 赤城县| 罗甸县| 盘锦市| 岑巩县| 昭苏县| 平谷区| 正阳县| 岗巴县| 清丰县| 福州市| 长葛市| 长子县| 聂荣县| 昌乐县| 白沙| 深水埗区| 涞源县| 台中县| 通辽市|