Luogu P5490 扫描线】的更多相关文章

模板题,想象一条线从左边扫到右边,只有在矩阵边界才会产生影响,所以我们离散化缩小数据范围,再用线段树维护扫描线上的情况,得出结果 #include<bits/stdc++.h> #define ls k<<1 #define rs k<<1|1 #define int long long//注意要开longlong using namespace std; ; ]; struct Seg_Tree{ int l,r,sum,cnt; }tr[N<<]; in…
Luogu P5490 作为一道模板题让我卡了一个月…… 对于线段树+离散化新手而言这实在是太难了…… 有关离散化: 可以查看这一篇文章:https://www.jianshu.com/p/9347659dcf18 一种缩小数据范围的小技巧,在本题中用于缩短线段树的区间大小 基本思路 想象一条直线,从左往右扫,我们要计算的就是直线扫过的面积. 很容易可以想出把整个图形按照每一条竖线切割,分割成几个矩形. 具体做法可以看代码. #include<iostream> #include<cst…
题目链接 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id=4814 (Luogu) https://www.luogu.org/problem/P3699 题解 写了这么多扫描线依然不会写.. 首先思路非常简单,枚举每个点,把所有的直线按照极角序排序,然后扫描线解决.(注意这里扫描线是一条从这个点出发的射线) 事件有三种: (1)插入一条线段.(2)删除一条线段.(3)查询某个位置与该点的连线是否被某一目前存在的直线穿过. 显然可以用一个se…
Code: #include<bits/stdc++.h> #define maxn 200007 #define inf 100005 using namespace std; void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } struct Edge { int l,r,h,flag; }edges[maxn]; int n; namespace tr…
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=2731 (luogu)https://www.luogu.org/problemnew/show/P3219 题解: 先讲一种复杂度明显不对但是本题数据跑得很快的做法: 先按底边\(y\)坐标排序,从下往上扫,每扫到一行链表维护当前的所有区间,另外再开个数组记录每个横坐标被覆盖的次数.复杂度\(O(\sum d_i)\) 然后ckw巨佬的做法: 按底边\(y\)坐标排序,找…
求 \(n\) 个矩形的面积并 Solution 将矩形转化为 \(y_1\) 位置的 + 修改 和 \(y_2\) 位置的 - 修改.然后按照 \(+y\) 顺序依次处理所有的修改,到达的一个新的位置就算一下上一段的总贡献. 至于线段树,要么对 \(x\) 坐标离散化,要么动态开点. 我觉得后者比较快乐. 注意这里的标记没有必要下传 #include <bits/stdc++.h> using namespace std; const int N = 5000005; struct even…
[CERC2017]Intrinsic Interval https://www.luogu.org/blog/ywycasm/solution-p4747# 这种“好的区间”,见得还是比较多的了. mx-mi=r-l 比较经典的题是统计这样的区间个数.可以分治+大力分类讨论mx,mi的位置 但是这个题是一个询问. 先观察一些显而易见的性质: 1.好的区间的交也是好的区间 2.好的区间的并也是好的区间 所以,考虑对于一个询问,如果往后固定r找到了一个[L,R]的L左边最靠后的l,使得[l,r]是…
[学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) 上题: 给出N个矩形,求最后所得的图形的面积(周长). 比如这个图形,我们去掉多余的线条,看看它最后的图形: 看到这个花里胡哨的图形,它的面积就是抛开红色的其他部分面积和. 周长呢?就是下面这个图形的红色边长度. 问题是怎么求,这就需要用到扫~描~线~了. 先解决简单一些的面积: 我们假象有一条垂…
Luogu P1502 题意很好理解,就是问给出的矩形套住的最大和. 但是做起来却十分麻烦. --来自疯狂爆10分的愤怒 一个比较高效的思路是--把每一个星星作为左下角向右上方拓展形成一个矩形, 拓展的规则为只要窗口的右上角在这个矩形之内,就可以覆盖到这个星星.然后用线段树维护一条扫描线从左往右扫过去,寻找单点的最大值. 值得注意的是题面提出了窗框上的星星不计入答案,这样一搞整道题就变得相当恶心了 一个比较好理解且比较方便的做法就是以星星的横纵坐标+0.5作为矩形的左下角. 那么这样就能保证这个…
二次联通门 : luogu P1382 楼房 /* luogu P1382 楼房 线段树 + 扫描线 + 离散化 正解貌似是堆... MMP...二段式线段树各种错误... 离散化一下横坐标 扫描线扫一下就好.. 注意判断一个横坐标上对应两个y值的情况... */ #include <algorithm> #include <cstdio> #define Max 1000002 void read (int &now) { now = ; bool temp = fals…