/*
思路就是枚举矩形下面那条先,把所有和其交叉的竖线更新进线段树,然后扫描先向上更新,遇到竖线上端点就在线段树里删掉,遇到横线就更新答案
*/
#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的更多相关文章

  1. HDU 3642 - Get The Treasury - [加强版扫描线+线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  2. P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)

    题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...

  3. 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树

    [BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...

  4. 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 ...

  5. 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树

    题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...

  6. hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

    题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...

  7. 【BZOJ 4059】 (分治暴力|扫描线+线段树)

    4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 632  Solved: 22 ...

  8. [BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】

    题目链接:BZOJ - 1218 题目分析 可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形. 坐标范围 <= 5000 ,直接 n^2 的二维前缀 ...

  9. [矩形并-扫描线-线段树]Picture

    最近在补数学和几何,没啥好写的,因为已经决定每天至少写一篇了,今天随便拿个题水水. 题目大意:给你N个边平行于坐标轴的矩形,求它们并的周长.(N<=5000) 思路:这个数据范围瞎暴力就过了,但 ...

随机推荐

  1. Halo(五)

    ApplicationPreparedEvent 监听事件 Event published once the application context has been refreshed but be ...

  2. 测试demo 配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  3. 【Nginx】缓存配置

    1.如何配置基本缓存设置 开启简单的缓存配置,只需要两个指令:proxy_cache_path和proxy_cache.proxy_cache_path配置缓存的存放地址和其他的一些常用配置,prox ...

  4. shell脚本编程测试类型上

    一bash的条件测试 判断某需求是否满足,需要由测试机制来实现.专用的测试表达式需要由测试命令辅助完成测试过程. 评估布尔声明,以便用在条件性执行中.若真,则返回0:若假,则返回1. 测试命令:• t ...

  5. Mac上的Apache 开启,停止,重启

    sudo apachectl -k start     启动 sudo apachectl -k stop     停止   sudo apachectl -k restart   重启

  6. Ceph的正确玩法之Ceph纠删码理论与实践

    http://blog.itpub.net/31545808/viewspace-2637083/ 注意空格,有的命令少空格 随着云计算业务的快速发展,国内外云计算企业的专利之争也愈发激烈.在云计算这 ...

  7. SCP-bzoj-1069

    项目编号:bzoj-1069 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 求凸包后在凸包上旋转卡壳.然而复杂度要求较低,故可直接枚举四边形的一条对角线,另两个顶点在凸包上随这条对角线的移动 ...

  8. HDU 6610 Game — 2019第三场杭电多校 1008题

    目录 题意 思路 AC_Code @(hdu 6610) 题意 大概说一下我理解的题意... 链接:here 你有\(n\)堆石子,每堆石子有\(a_i\)个石子.游戏规则:\(Alice\)先选择一 ...

  9. Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析

    Redis 的几种常见使用方式包括: 单机模式 主从模式 哨兵模式(sentinel) 集群模式(cluster) 第三方模式 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备 ...

  10. mysql添加制定ip访问

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'120.244.114.45' IDENTIFIED BY 'Zhh722@7758521' WITH GRANT OPT ...