计算几何弱渣果然就是一点感觉也没有。

题目大意;

题解:

首先考虑不删怎么做?

肯定要把点给离散,那么现在对于每一小段,要求出是哪条线段最近?

按一个顺序扫过去,每一条线段打一个加入和删除的标记。

由于线段互不相交,所以线段顺序不会随着小段的移动而改变。

因此,我们可以用一个set去维护插入删除,比较远近时,就求交,判断谁近。

那么第一问答案就出来了。

第二问、第三问都是一样的。

删掉一条线段,对一小段来说,如果删掉了最近的那一条线段,答案会增加它和第二条线段的面积,那么维护v[i]表示删掉第i条线段面积增加多少,ans1=ans0+max(v[i])

第三问,首先答案是ans0+max(v[i])+cmax(v[i])

但是我们会发现我们少考虑了一种情况,那就是如果线段i和线段j是一小段的最近和次近,其实选择他们还会增加第二条线段到第三条线段的面积,随便做。

总复杂度是 O ( n l o g n ) O(n log n) O(nlogn)

注意用atan2(y,x)这个函数可以方便地做几角排序。
Code:

#include<set>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define db double
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using namespace std;const int N = 5e4 + 5;int n;const db eps = 1e-8;struct P {db x, y;P(){}P(db x_, db y_){x = x_, y = y_;}
} p, q;
struct L {P p, v;L(){}L(P p_, P v_){p = p_, v = v_;}
};
P operator +(P a, P b) {return P(a.x + b.x, a.y + b.y);}
P operator -(P a, P b) {return P(a.x - b.x, a.y - b.y);}
P operator *(P a, db b) {return P(a.x * b, a.y * b);}
db operator ^(P a, P b) {return a.x * b.y - a.y * b.x;}
db dot(P a, P b) {return a.x * b.x + a.y * b.y;}
db len(P a) {return sqrt(dot(a, a));}
P jd(L a, L b) {return b.p + b.v * ((a.v ^ (a.p - b.p)) / (a.v ^ b.v));}L a[N], ty, tz;
struct nod {int x;nod(int _x = 0) {x = _x;}
};
bool operator <(nod x, nod y) {db u = len(jd(a[x.x], ty)), v = len(jd(a[y.x], ty));if(abs(u - v) < eps) return x.x < y.x;return u < v;
}
set<nod> s;struct nod2 {P p;int x;
} d[N * 2]; int d0, D;const db pi = acos(-1);
db jj(P p) {return atan2(p.y, p.x);
}
int cmp2(nod2 a, nod2 b) {return jj(a.p) < jj(b.p);
}int c[N][2], c0[N];struct edge {int fi[N * 2], nt[N * 4], to[N * 4], v[N * 4], tot;void link(int x, int y, int z) {nt[++ tot] = fi[x], to[tot] = y, v[tot] = z, fi[x] = tot;}
} e;db ans0, ans1, ans2, v[N];db calc(int x) {return abs(jd(ty, a[x]) ^ jd(tz, a[x])) / 2;
}struct nod3 {int x, y; db z;
} w[N * 2]; int w0;int cmp3(nod3 a, nod3 b) {if(a.x < b.x) return 1;if(a.x > b.x) return 0;return a.y < b.y;
}int main() {freopen("area.in", "r", stdin);freopen("area.out", "w", stdout);scanf("%d", &n);fo(i, 1, n) {scanf("%lf %lf %lf %lf", &p.x, &p.y, &q.x, &q.y);d[++ d0].p = p; d[d0].x = i;d[++ d0].p = q; d[d0].x = i;a[i].p = p; a[i].v = q - p;}{sort(d + 1, d + d0 + 1, cmp2);fo(i, 1, d0) {if(i == 1 || abs(d[i].p ^ d[D].p) > eps) d[++ D] = d[i];int x = d[i].x;if(!c0[x]) c[x][c0[x] ++] = D; else {c[x][1] = D;if((d[c[x][0]].p ^ d[c[x][1]].p) < 0)swap(c[x][0], c[x][1]);}}}fo(i, 1, n) {if(c[i][0] < c[i][1])e.link(c[i][1], i, -1), e.link(c[i][0], i, 1); elsee.link(c[i][1], i, -1), e.link(1, i, 1), e.link(c[i][0], i, 1);}fo(i, 1, D) {ty.v = d[i].p; tz.v = d[i % D + 1].p;for(int j = e.fi[i]; j; j = e.nt[j]) {int x = e.to[j];if(e.v[j] == 1) s.insert(nod(x)); else s.erase(s.find(nod(x)));}if(s.empty()) {ans0 = ans1 = ans2 = 1e15;} else {int x = (*s.begin()).x;ans0 += calc(x);if(s.size() == 1) {ans1 = ans2 = 1e15;} else {int y = (*++s.begin()).x;v[x] += calc(y)   - calc(x);if(s.size() == 2) {ans2 = 1e15;} else {int z = (*++(++s.begin())).x;w[++ w0].x = x; w[w0].y = y;w[w0].z = calc(z) - calc(y);}}}}fo(i, 1, n)  ans1 = max(ans1, ans0 + v[i]);db c0 = 0, c1 = 0;fo(i, 1, n) if(v[i] > c1)c0 = c1, c1 = v[i]; elseif(v[i] > c0) c0 = v[i];if(ans2 < 1e10) ans2 = ans0 + c0 + c1;sort(w + 1, w + w0 + 1, cmp3);fo(i, 2, w0 + 1) if(i > w0 || w[i - 1].x != w[i].x || w[i - 1].y != w[i].y) {ans2 = max(ans2, ans0 + v[w[i - 1].x] + v[w[i - 1].y] + w[i - 1].z);} else w[i].z += w[i - 1].z;if(ans0 > 1e10) printf("infinite\n"); else printf("%.2lf\n", ans0);if(ans1 > 1e10) printf("infinite\n"); else printf("%.2lf\n", ans1);if(ans2 > 1e10) printf("infinite\n"); else printf("%.2lf\n", ans2);
}

【清华2019冬令营模拟12.8】视野相关推荐

  1. JZOJ 5977. 【清华2019冬令营模拟12.15】堆

    Description Input Output Sample Input 10 10 0 1 1 2 2 4 3 12 2 6 2 15 3 5 3 10 7 7 9 16 2 3 1 10 9 2 ...

  2. jzoj 5970.【北大2019冬令营模拟12.1】space 莫比乌斯反演

    Description Input Output Sample Input 2 1 2 2 1 1 2 2 1 Sample Output 24 样例解释: Data Constraint 分析: 对 ...

  3. JZOJ[5971]【北大2019冬令营模拟12.1】 party(1s,256MB)

    题目 题目大意 给你一棵树,在树上的某一些节点上面有人,要用最小的步数和,使得这些人靠在一起.所谓靠在一起,即是任意两个人之间的路径上没有空的节点(也就是连在一起). N ≤ 200 N \leq 2 ...

  4. jzoj5990. 【北大2019冬令营模拟2019.1.6】Bear (状压dp)

    题面 题解 我永远讨厌dp.jpg 搞了一个下午优化复杂度最后发现只要有一个小trick就可以A了→_→.全场都插头dp就我一个状压跑得贼慢-- 不难发现我们可以状压,对于每一行,用状态\(S\)表示 ...

  5. jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥

    分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...

  6. JZOJ5498. 【清华集训2017模拟12.10】大佬的难题

    Sample Input Sample Input1: 4 201334450 1474105774 350932494 Sample Input2: 97670 1734691087 7596883 ...

  7. [JZOJ5498]【清华集训2017模拟12.10】大佬的难题

    Description 给出三个1~n的排列a,b,c 求 ∑1≤i,j≤n[ai<aj][bi<bj][ci<cj] \sum\limits_{1\leq i,j\leq n}[a ...

  8. jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)

    这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...

  9. JZOJ 5984. 【北大2019冬令营模拟2019.1.1】仙人掌

    Description Input Output Sample Input 5 10 1 2 2 3 2 4 3 5 1 5 2 4 3 5 4 2 3 1 Sample Output 2060 Da ...

最新文章

  1. 用mermaid写sequenceDiagram
  2. verilog实现伺服电机控制
  3. DSPBuilder笔记
  4. ES6中变量的解构赋值
  5. kafka依赖_Kafka集群搭建及必知必会
  6. 软件测试一个项目几个接口,你打开一个项目网址中间发生了什么?(软件测试面试题)...
  7. java 微信小程序消息模板
  8. bt种子文件是什么(包括bt文件结构)
  9. win10 联想键盘快捷键关闭_Win10电脑不用鼠标怎么关机键盘与快捷键关机技巧
  10. NetVLAD: CNN architecture for weakly supervised place recognition 翻译
  11. 4G模块配置、概念、调试记录
  12. java贪吃蛇保存,Java 实现贪吃蛇游戏的示例
  13. 人脑词典、亡者归来……来看库兹韦尔对于未来的四个疯狂预测
  14. MacBook 更新Big Sur后,虚拟机无法运行时显示该主机 CPU 类型不支持虚拟化性能计数器,模块“VPMC”启动失败,未能启动虚拟机
  15. 零基础学FPGA(六):FPGA时钟架构(Xilinx为例,完整解读)
  16. OpenCV 读写图像、读写像素、修改像素值(案例:图像反处理)
  17. macbook录屏声音收录的处理
  18. 自动化控制重要国际学术会议
  19. 学习Python单利模式
  20. Python—reverse()和reversed()方法介绍

热门文章

  1. GB28181协议--实时视音频点播(预览)
  2. Adobe新的AI产品开放公测!Firefly带来全新的制图体验,让你效率翻倍!
  3. Photoshop基础知识——第九章(路径、钢笔、矢量形状工具)
  4. 小米8 android p 公测,米粉欢呼!小米8 Android P内测9月开启
  5. 《剑指Offer》做题总结(三)
  6. 欧洲最大IT展会CeBIT开幕 绿色IT是主题
  7. MyBatisPlus主键生成策略
  8. iOS APP 架构设计
  9. mq报错abbit@syld36: * connected to epmd (port 4369) on syld36 * epmd reports node ‘rabbit‘ uses po
  10. 机器学习实战(二)LR算法:实现简单的分类模型