模板:扫描线

那看似平凡的面积,是多少条线的织物啊

前言

突然发现自己之前没发过扫描线的模板
可能是因为之前的实现太差了
这次感觉实现的还是很不错的,
虽然常数比较大,但是好写啊!
原来扫描线也是可以1A的

线段树上利用zld讲解的维护最小值和最小值数量的方法轻松维护
离散化后边化点的细节现在看其实也没有那么难了

代码

#include<bits/stdc++.h>const int N=4e5+100;
const int M=50050;
const int mod=1e9+7;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m;
int q[N],num;
int x1[N],yy1[N],x2[N],y2[N];
struct ope{int h,l,r,op;bool operator < (const ope o)const{return h<o.h;}
}o[N];
int tot;#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
int mn[N<<2],sum[N<<2],laz[N<<2];
inline void pushup(int k){mn[k]=min(mn[ls],mn[rs]);sum[k]=0;if(mn[k]==mn[ls]) sum[k]+=sum[ls];if(mn[k]==mn[rs]) sum[k]+=sum[rs];return;
}
inline void add(int k,int v){laz[k]+=v;mn[k]+=v;return;
}
inline void pushdown(int k){int o=laz[k];laz[k]=0;if(!o) return;add(ls,o);add(rs,o);return;
}
void build(int k,int l,int r){if(l==r){mn[k]=0;sum[k]=q[l+1]-q[l];return;}build(ls,l,mid);build(rs,mid+1,r);pushup(k);return;
}
void change(int k,int l,int r,int x,int y,int op){if(x<=l&&r<=y){add(k,op);return;}pushdown(k);if(x<=mid) change(ls,l,mid,x,y,op);if(y>mid) change(rs,mid+1,r,x,y,op);pushup(k);return;
}int main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();for(int i=1;i<=n;i++){q[++num]=x1[i]=read();q[++num]=yy1[i]=read();q[++num]=x2[i]=read();q[++num]=y2[i]=read();}sort(q+1,q+1+num);num=unique(q+1,q+1+num)-q-1;for(int i=1;i<=n;i++){x1[i]=lower_bound(q+1,q+1+num,x1[i])-q;yy1[i]=lower_bound(q+1,q+1+num,yy1[i])-q;x2[i]=lower_bound(q+1,q+1+num,x2[i])-q;y2[i]=lower_bound(q+1,q+1+num,y2[i])-q;o[++tot]=(ope){yy1[i],x1[i],x2[i]-1,1};o[++tot]=(ope){y2[i],x1[i],x2[i]-1,-1};}q[num+1]=q[num];build(1,1,num);sort(o+1,o+1+tot);ll ans(0);int pl=1;for(int i=1;i<num;i++){while(pl<=tot&&o[pl].h==i){change(1,1,num,o[pl].l,o[pl].r,o[pl].op);++pl;}ll add=q[num+1]-q[1]-(mn[1]?0:sum[1]);ans+=add*(q[i+1]-q[i]);}printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4887-[模板]莫队二次离线(第十四分块(前体))

正题 题目链接:https://www.luogu.com.cn/problem/P4887 题目大意 给出一个长度为nnn的序列aaa。mmm次询问[l,r][l,r][l,r]求有多少个l≤i<j≤rl\leq i< j\leq rl≤i<j≤r满足aixoraja_i\ xor\ a_jai​ xor aj​二进制下恰好有kkk个111。 1≤n,q≤105,0≤ai,k<21…

在.NET Core中设计自己的服务宿主(Service Hosting)框架

很多时候我们都会有设计一个后台服务的需求&#xff0c;比如&#xff0c;传统的Windows Service&#xff0c;或者Linux下的守护进程。这类应用的一个共同特点就是后台运行&#xff0c;并且不占用控制台界面。通常情况下&#xff0c;后台服务在提供服务时&#xff0c;会通过日志…

CF1131 G. Most Dangerous Shark(DP+单调栈优化)

文章目录problemsolutioncodeproblem solution dpi:dp_i:dpi​: 前iii个多米诺骨牌全都倒下的最小花费 li,ril_i,r_ili​,ri​分别表示第iii个多米诺骨牌倒下时所能波及到的最左/右位置 往左倒&#xff0c;则[li,i)[l_i,i)[li​,i)内的牌都可以选择性地先推倒 dpimin⁡{dpjcos…

Cat Virus

Cat Virus 题意&#xff1a; 让你构造一颗树&#xff0c;要求如果一个点为黑&#xff0c;其子树全为黑&#xff0c;白点任意&#xff0c;现在让你构造一棵树&#xff0c;使其染色方案数为K&#xff0c;节点尽可能少 题解&#xff1a; 首先画出k<9的全部情况&#xff0c;并…

NOIP2021:游记

前言 似乎前一秒还在为接下来的考试紧张&#xff0c;下一秒就已经走出了考场 恍惚之间突然意识到&#xff0c;有些日子&#xff0c;可能真的变成了过往 停止emo 感谢FFC&#xff0c;感谢大连&#xff0c;使这次考试顺利进行 主要的问题是T4的暴力 写的时候只有不到一个点&…

微软发布XAML Studio工具:快速构建UWP XAML原型

IT之家1月30日消息 微软车库的最新项目XAML Studio已经在Windows 10应用商店上架&#xff0c;将帮助开发人员快速构建UWP XAML原型&#xff0c;以后可以轻松地将其复制到Visual Studio中。它将允许开发人员实时预览他们的XAML代码&#xff0c;并与结果进行交互&#xff0c;就像…

P5113-Sabbat of the witch【分块,基数排序】

正题 题目链接:https://www.luogu.com.cn/problem/P5113 题目大意 一个长度为nnn的序列aaa&#xff0c;mmm次要求支持以下操作 将区间[l,r][l,r][l,r]都变为xxx。询问区间[l,r][l,r][l,r]的和。将第xxx次操作111撤销。 强制在线 1≤n,m≤105,1≤ai,x≤1091\leq n,m\leq 10^…

C. The Sports Festival

C. The Sports Festival 题意&#xff1a; n个数&#xff0c;依次将所有数加入到区间内&#xff0c;每次得到一个k&#xff0c;k等于当前区间的最大值减最小值&#xff0c; 求所有k的和的最小值 题解&#xff1a; 一开始就没往dp那方面想&#xff0c;自己在dp这方面的理解还…

模板:点分治点分树

文章目录前言点分治背景解析代码点分树情境代码thanks for reading!所谓点分治&#xff0c;就是把所有的点分开来治 &#xff08;逃&#xff09; &#xff08;应广大观众要求&#xff0c;开篇废话改回原风格qwq&#xff09; 前言 很神奇的算法。 没有引入任何新的知识&#x…

.NET Core 3 Preview 2发布,C#8更强大的模式匹配

.NET Core 3 Preview 2 发布了&#xff0c;此版本主要带来了 C# 8 相关的新功能&#xff0c;C# 8 Preview 2 是 .NET Core 3 SDK 的一部分。C# 8 中使用模式进行更多操作&#xff0c;主要特性包括&#xff1a;using 声明改变需要缩进代码的方式&#xff0c;现在可以编写以下代码…

Loj#2474-「2018 集训队互测 Day 3」北校门外的未来【LCT】

正题 题目链接:https://loj.ac/p/2474 题目大意 开始有一个只有点111的图&#xff0c;一个点xxx能走到点yyy当且仅当路径(x,y)(x,y)(x,y)之间&#xff08;不包括x,yx,yx,y&#xff09;不存在编号比xxx或yyy要大的节点。有mmm次操作&#xff1a; 新建一个编号为yyy的节点和xx…

CF407 E. k-d-sequence(线段树+单调栈)

文章目录CF407 E. k-d-sequenceproblemsolutioncodeCF407 E. k-d-sequence problem solution special case&#xff0c;d0d0d0&#xff0c;相当于寻找最长的一段数字相同的区间 other case&#xff0c;如果要满足公差为ddd等差序列 区间内每个数在模ddd意义下同余每个数互不…

D. Binary Literature

D. Binary Literature 题意&#xff1a; 给三个长度为2 * n的01串&#xff0c;让你构造一个长度小于3 * n的字符串&#xff0c;使得这个串至少包含两个01串 题解&#xff1a; 很巧妙的构造题 三个指针分别指向三个串&#xff0c;因为是01串&#xff0c;所以一定存在两个字符…

安逸:鼠绘《诗与远方》

【作品名称】《诗与远方》【作者介绍】徐安&#xff08;笔名安逸&#xff0c;常州&#xff09;&#xff0c;PPT专家&#xff0c;鼠绘专家。平面设计专业&#xff0c;6年PPT设计经验&#xff1b;历届江苏省PPT制作大赛一等奖获得者&#xff0c;PA口袋动画重要合作人。PPT动画制作…

洛谷P4292:重建计划(点分治、单调队列)

解析 第一眼&#xff1a;Wow这么水的黑&#xff1f;&#xff1f; 然后写了一发二分套线段树的3log代码上去 T到飞起&#xff0c;只有40… 无奈瞅了一眼标签&#xff1a;单调队列 对啊 于是又写了一个上去 20 … 好啊 然后就摆烂了 qwq 果然黑题没有一个好东西 一个关键的思…

E. Colorings and Dominoes(未解决)

E. Colorings and Dominoes 题意&#xff1a; n * m的格子&#xff0c;分为黑白格子&#xff0c;白格子可以染成蓝色或者红色&#xff0c;一个1 * 2的多米诺骨牌&#xff0c;可以覆盖两个连续的水平的红色格子或者两个连续的竖着的蓝色格子&#xff0c;对于一个染色方案&…

[HNOI2016]网络(树链剖分+线段树+大根堆)

[HNOI2016]网络 problem solution 另辟蹊径&#xff0c;不把交互请求赋在新增路径上&#xff0c;反而把交互请求赋在树上除去该请求路径覆盖点的其它点上 显然&#xff0c;路径问题树剖是非常可以的、 那么一个点上的信息就表示所有不经过该点的交互请求&#xff0c;用堆…

P4557-[JSOI2018]战争【凸包,闵可夫斯基和】

正题 题目连接:https://www.luogu.com.cn/problem/P4557 题目大意 给出两个点集A,BA,BA,B&#xff0c;qqq次询问给出一个向量vvv&#xff0c;询问将BBB中所有点加上向量vvv后两个集合的凸包是否有交。 1≤n,m,q≤1051\leq n,m,q\leq 10^51≤n,m,q≤105 解题思路 闵可夫斯基和…

IdentityServer4实战 - JWT Token Issuer 详解

一.前言本文为系列补坑之作&#xff0c;拖了许久决定先把坑填完。下文演示所用代码采用的 IdentityServer4 版本为 2.3.0&#xff0c;由于时间推移可能以后的版本会有一些改动&#xff0c;请参考查看&#xff0c;文末附上Demo代码。本文所诉Token如无特殊说明皆为 JWT Token。众…

P3834 【模板】可持久化线段树 2(整体二分做法)

P3834 【模板】可持久化线段树 2&#xff08;主席树&#xff09; 我们详细讲讲这个整体二分如何求区间第k小 我们都知道二分可以求出区间里某个想要的值&#xff0c;如果有很多询问&#xff0c;我们对每个询问都进行二分&#xff0c;复杂度就是O(QNlog(1e9))铁超&#xff0c;那…