暴力枚举+扫描线+线段树——cf1194E
/*
思路就是枚举矩形下面那条先,把所有和其交叉的竖线更新进线段树,然后扫描先向上更新,遇到竖线上端点就在线段树里删掉,遇到横线就更新答案
*/
#include<bits/stdc++.h>
using namespace std;
#define N 20005
#define ll long long struct SegV{int x,y1,y2;}v[N];//垂直线
struct SegH{int y,x1,x2;}h[N];//水平线
int cmp(SegH a,SegH b){return a.y<b.y;} int n,cntv,cnth;
int y[N],cnty,x[N],cntx;
vector<SegV>Up[N],Down[N]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int sum[N<<];
void update(int pos,int v,int l,int r,int rt){
if(l==r){sum[rt]+=v;return;}
int m=l+r>>;
if(pos<=m)update(pos,v,lson);
else update(pos,v,rson);
sum[rt]=sum[rt<<]+sum[rt<<|];
}
int query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return sum[rt];
int m=l+r>>,res=;
if(L<=m)res+=query(L,R,lson);
if(R>m)res+=query(L,R,rson);
return res;
}
int main(){
cin>>n;
for(int i=;i<=n;i++){
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
x[++cntx]=x1;x[++cntx]=x2;
y[++cnty]=y1;y[++cnty]=y2;
if(x1==x2){//垂直线
cntv++;
v[cntv].x=x1;
v[cntv].y1=min(y1,y2);
v[cntv].y2=max(y1,y2);
}
else {
cnth++;
h[cnth].y=y1;
h[cnth].x1=min(x1,x2);
h[cnth].x2=max(x1,x2);
}
} sort(x+,x++cntx);
cntx=unique(x+,x++cntx)-x-;
sort(y+,y++cnty);
cnty=unique(y+,y++cnty)-y-; for(int i=;i<=cnth;i++){
h[i].y=lower_bound(y+,y++cnty,h[i].y)-y;
h[i].x1=lower_bound(x+,x++cntx,h[i].x1)-x;
h[i].x2=lower_bound(x+,x++cntx,h[i].x2)-x;
}
for(int i=;i<=cntv;i++){
v[i].x=lower_bound(x+,x++cntx,v[i].x)-x;
v[i].y1=lower_bound(y+,y++cnty,v[i].y1)-y;
v[i].y2=lower_bound(y+,y++cnty,v[i].y2)-y;
} sort(h+,h++cnth,cmp);//给水平线从低到高排序
for(int i=;i<=cntv;i++){//按端点处理垂直线
Up[v[i].y2].push_back(v[i]);
Down[v[i].y1].push_back(v[i]);
} long long ans=;
for(int i=;i<=cnth;i++){
memset(sum,,sizeof sum);
//把所有和h[i]交叉的竖线更新进线段树
for(int j=;j<=cntv;j++)
if(v[j].y1<=h[i].y && v[j].y2>=h[i].y)
update(v[j].x,,,cntx,);
//开始向上枚举所有水平线
int now=h[i].y;//当前的高度
for(int j=i+;j<=cnth;j++)if(h[i].y!=h[j].y){
while(now+<=h[j].y){
++now;
for(auto v:Up[now-]){//把这个高度以下的都删掉
if(v.y1<=h[i].y)
update(v.x,-,,cntx,);
}
}
int L=max(h[i].x1,h[j].x1),R=min(h[i].x2,h[j].x2);
if(L<=R){
int res=query(L,R,,cntx,);
ans+=res*(res-)/;
}
}
}
cout<<ans<<endl;
}
暴力枚举+扫描线+线段树——cf1194E的更多相关文章
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- 【BZOJ 4059】 (分治暴力|扫描线+线段树)
4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 632 Solved: 22 ...
- [BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】
题目链接:BZOJ - 1218 题目分析 可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形. 坐标范围 <= 5000 ,直接 n^2 的二维前缀 ...
- [矩形并-扫描线-线段树]Picture
最近在补数学和几何,没啥好写的,因为已经决定每天至少写一篇了,今天随便拿个题水水. 题目大意:给你N个边平行于坐标轴的矩形,求它们并的周长.(N<=5000) 思路:这个数据范围瞎暴力就过了,但 ...
随机推荐
- 【纪中集训】2019.08.10【省选组】模拟TJ
前言 一套码农题-- T1 Description 给定一棵\(n(\in[2,10^5])\)个点的树,\(m(≤10^5)\)次询问,每次询问有两个不相同的点,要让所有点走到这两个点之一(走一条边 ...
- org.zkoss.zul.Filedownload.java 源码
/* Filedownload.java Purpose: Description: History: Mon Apr 16 09:29:44 2007, Created by tomyeh Copy ...
- Python基础(一):程序输入输出、判断合法用户、编写判断成绩的程序
一.程序输入输出 目标: 编写login.py脚本,实现以下目标: 提示用户输入用户名 将用户名保存在变量中 在屏幕上显示欢迎用户的信息 方案: 编写程序时,很多情况下都需要程序与用户交互.在pyth ...
- 过滤PostgreSQL配置文件中被注释的部分
以下正则可以过滤掉PostgreSQL配置文件被注释的部分,包括'#'前带空格的部分,但参数前带空格的部分不会过滤掉 postgres@linux-ij7j:/opt/pg8122/data> ...
- 浏览器地址栏运行HTML代码(谷歌)
在地址栏输入 data:text/html,<h1 style='color:red' >Hello, world!</h1> 浏览器会执行你的html代码,效果如下: 如果觉 ...
- ios 最全的常用字符串操作
1.将NSData / NSString转化 1 2 3 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; // 将字符串 ...
- Webx.0-Web3.0:Web3.0
ylbtech-Webx.0-Web3.0:Web3.0 Web3.0只是由业内人员制造出来的概念词语,最常见的解释是,网站内的信息可以直接和其他网站相关信息进行交互,能通过第三方信息平台同时对多家网 ...
- Stimulsoft_Report纯代码实现数据绑定
Stimulsoft_Report纯代码实现数据绑定 根据穿的参数动态绑定显示报表,涉及多表查询. 一.前台代码: [code] <%@ Page Title="" Lan ...
- 3. Node_export安装部署
首先我们要知道什么是Node_export?因为Prometheus本身不具备监控功能,我们要通过Prometheus收集数据,需要安装对应的export.如Node_export用于监控服务器状态, ...
- 嵌入式C语言4.2 C语言内存空间的使用-指针与修饰符:const,volatile,typedef
const:变量,只读[不能变] 内存属性: 1. 内存操作的大小 2.内存的变化性,可写可读 char *p; const char *p; 描述字符串,p指向的内容是只读的,不可再次修改 ...