思路:

可以把题目转化成

给你一些沿坐标轴方向的线段 让你求交点个数

然后就线段树+扫描线 搞一搞

(线段不包含断点 最后+n 这种方式 比线段包含断点+各种特判要好写得多)

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100005;
int n,stkx[N],stky[N],topx,topy,top,tree[N*4];long long ans;
struct Node{int x,y;}node[N];
bool cmp1(Node a,Node b){if(a.x!=b.x)return a.x<b.x;return a.y<b.y;}
bool cmp2(Node a,Node b){if(a.y!=b.y)return a.y<b.y;return a.x<b.x;}
struct Movement{
int time,num,move,l,r;
Movement(int x,int y,int z){time=x,num=y,move=z;}
Movement(int x,int y,int z,int flg){time=x,l=y,r=z,move=flg;}
Movement(){}
friend bool operator<(Movement a,Movement b){
if(a.time!=b.time)return a.time<b.time;
return a.move<b.move;
}
}movement[N*3];
void insert(int l,int r,int pos,int num,int wei){
if(l==r){tree[pos]+=wei;return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<num)insert(mid+1,r,rson,num,wei);
else insert(l,mid,lson,num,wei);
tree[pos]=tree[lson]+tree[rson];
}
int query(int l,int r,int pos,int L,int R){
if(L>R)return 0;
if(l>=L&&r<=R){return tree[pos];}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)return query(mid+1,r,rson,L,R);
else if(mid>=R)return query(l,mid,lson,L,R);
else return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&node[i].x,&node[i].y),
stkx[++topx]=node[i].x,stky[++topy]=node[i].y;
sort(stkx+1,stkx+1+topx),sort(stky+1,stky+1+topy);
topx=unique(stkx+1,stkx+1+topx)-stkx-1;
topy=unique(stky+1,stky+1+topy)-stky-1;
for(int i=1;i<=n;i++)
node[i].x=lower_bound(stkx+1,stkx+1+topx,node[i].x)-stkx,
node[i].y=lower_bound(stky+1,stky+1+topy,node[i].y)-stky;
sort(node+1,node+1+n,cmp1);
for(int i=1;i<=n;i++)if(node[i].x==node[i-1].x)
movement[++top]=Movement(node[i-1].y,node[i].x,1),
movement[++top]=Movement(node[i].y,node[i].x,-1);
sort(node+1,node+1+n,cmp2);
for(int i=1;i<=n;i++)if(node[i].y==node[i-1].y)
movement[++top]=Movement(node[i].y,node[i-1].x,node[i].x,0);
sort(movement+1,movement+1+top);
for(int i=1;i<=top;i++)
if(movement[i].move)insert(1,topx,1,movement[i].num,movement[i].move);
else ans+=query(1,topx,1,movement[i].l+1,movement[i].r-1);
printf("%lld\n",ans+n);
}

BZOJ 1818 线段树+扫描线的更多相关文章

  1. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  2. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  3. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  4. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  5. BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤

    3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...

  6. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  7. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

  8. POJ1151+线段树+扫描线

    /* 线段树+扫描线+离散化 求多个矩形的面积 */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...

  9. POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]

    题意:求矩形面积并 分析:使用线段树+扫描线...因为坐标是浮点数的,因此还需要离散化! 把矩形分成两条边,上边和下边,对横轴建树,然后从下到上扫描上去,用col表示该区间有多少个下边,sum代表该区 ...

随机推荐

  1. &nbsp; 等等空格用法

    平时经常用到 空格转移字符,记住一个   表示一个字符就可以了. Non-Breaking SPace 记住它是什么的缩写,更有助于我们记忆和使用.下面的字符转义自己视图翻译一下. 记录一下,空格的转 ...

  2. 前端-JQ思维导图

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记

  3. JavaScript实现网页换肤

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...

  4. java RPC系列之一 rmi

    java RPC系列之一    rmi 一.java RPC简单的汇总 java的RPC得到技术,基本包含以下几个,分别是:RMI(远程方法调用) .Caucho的Hessian 和 Burlap . ...

  5. 关于dlg和pro的问题

    微软链接:http://technet.microsoft.com/zh-cn/subscriptions/bb983387.aspx CDialogEx::CDialogEx 构造 CDialogE ...

  6. windows 命令行 for 用法

    for /r 目录名 %i in (匹配模式1,匹配模式2) do @echo %i for /r SATA %i in (*.txt) do @echo %i D:\REY\test>for ...

  7. [luogu2047 NOI2007] 社交网络 (floyed最短路)

    传送门 输入输出样例 输入样例#1: 4 4 1 2 1 2 3 1 3 4 1 4 1 1 输出样例#1: 1.000 1.000 1.000 1.000 题解 在进行floyed的过程中,顺便更新 ...

  8. [2018.8.12]模拟赛B组

    T1 打表出奇迹,发现结论为\(E(a_n)=n+1\)即可. #include <iostream> #include <cstdio> #include <cctyp ...

  9. centos7把编译安装的服务通过systemctl管理

    nginx编译安装的目录是/usr/local/nginx nginx配置文件是/usr/local/nginx/conf/nginx.conf systemctl管理的服务文件在/usr/lib/s ...

  10. IntelliJ IDEA 2017.1.6 x64 的破解

    方式一 现在用这个 http://idea.imsxm.com/好使 步骤如下,点击help按钮,选择Register 点击license server   修改下面的服务器激活地址 方式二 由于Je ...