BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组

Description

无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点)。每秒钟,所有内部白点同时变黑,直到不存在内部白点为止。你的任务是统计最后网格中的黑点个数。 内部白点的定义:一个白色的整点P(x,y)是内部白点当且仅当P在水平线的左边和右边各至少有一个黑点(即存在x1 < x < x2使得(x1,y)和(x2,y)都是黑点),且在竖直线的上边和下边各至少有一个黑点(即存在y1 < y < y2使得(x,y1)和(x,y2)都是黑点)。

Input

输入第一行包含一个整数n,即初始黑点个数。以下n行每行包含两个整数(x,y),即一个黑点的坐标。没有两个黑点的坐标相同,坐标的绝对值均不超过109。

Output

输出仅一行,包含黑点的最终数目。如果变色过程永不终止,输出-1。

Sample Input

4
0 2
2 0
-2 0
0 -2

Sample Output

5

数据范围
36%的数据满足:n < = 500
64%的数据满足:n < = 30000
100%的数据满足:n < = 100000


先排两边序,取出所有两个端点是黑点且极长的横/竖线。
可以发现新增的黑点一定是这些线的交点。
于是把横线拆成两个。
全部按横坐标排序,遇到横线决定+1还是-1,遇到竖线就查一次区间和,这个可以用树状数组搞一搞。
 
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 300050
int n,V[N],c[N];
struct P {
int x,y;
}a[N];
inline bool cmp1(const P &x,const P &y) {return x.x==y.x?x.y<y.y:x.x<y.x;}
inline bool cmp2(const P &x,const P &y) {return x.y==y.y?x.x<y.x:x.y<y.y;}
struct A {
int x,y,z,opt,pri;
bool operator < (const A &u) const {
return x==u.x?pri<u.pri:x<u.x;
}
}q[N];
void fix(int x,int v) {for(;x<=n;x+=x&(-x)) c[x]+=v;}
int inq(int x) {int re=0;for(;x;x-=x&(-x)) re+=c[x]; return re;}
int main() {
scanf("%d",&n);
int i,cnt=0;
for(i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y),V[i]=a[i].y;
sort(V+1,V+n+1);
int ww=unique(V+1,V+n+1)-V-1;
for(i=1;i<=n;i++) a[i].y=lower_bound(V+1,V+ww+1,a[i].y)-V;
sort(a+1,a+n+1,cmp1);
for(i=1;i<=n;i++) {
int j=i;
for(;i<n&&a[i+1].x==a[j].x;i++);
q[++cnt]=(A){a[j].x,a[j].y,a[i].y,1,2};
}
sort(a+1,a+n+1,cmp2);
for(i=1;i<=n;i++) {
int j=i;
for(;i<n&&a[i+1].y==a[j].y;i++);
q[++cnt]=(A){a[j].x,a[j].y,1,0,1};
q[++cnt]=(A){a[i].x,a[j].y,-1,0,3};
}
sort(q+1,q+cnt+1);
int ans=0;
for(i=1;i<=cnt;i++) {
if(q[i].opt==0) fix(q[i].y,q[i].z);
else {
ans+=inq(q[i].z)-inq(q[i].y-1);
}
}
printf("%d\n",ans);
}

BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组的更多相关文章

  1. 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组

    [BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...

  2. BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组

    问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...

  3. FZU 2225 小茗的魔法阵 扫描线+树状数组

    这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...

  4. BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组

    BZOJ_4627_[BeiJing2016]回转寿司_离散化+树状数组 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 ...

  5. BZOJ_2743_[HEOI2012]采花_离线+树状数组

    BZOJ_2743_[HEOI2012]采花_离线+树状数组 Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大 ...

  6. HDU 5862 Counting Intersections 扫描线+树状数组

    题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...

  7. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组

    题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...

  8. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  9. [BZOJ4822][CQOI2017]老C的任务(扫描线+树状数组)

    4822: [Cqoi2017]老C的任务 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 379  Solved: 203[Submit][Statu ...

随机推荐

  1. 解决Linux中文环境下astro和Calibre不能输入的问题

    例如我的opensuse在中文环境下不能在astro中输入指令,Calibre的grid spacing设置框不能输入,经过摸索,找到以下两种解决方法: 1.    将系统环境变成英文,在.bashr ...

  2. PHP实现上次登录功能

    通过一个sql语句把上次的登录时间给本次登录时间,再把当前时间记录下来 update userinfo  set lasttime=userinfo.logintime,logintime= CURR ...

  3. 根据URL发起HTTP请求,我的HTTPHelper。

     完整的demo using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  4. 搭建私有Nuget仓库

    使用Nexus搭建私有Nuget仓库 https://www.cnblogs.com/Erik_Xu/p/9211471.html 前言 Nuget是ASP .NET Gallery的一员,是免费.开 ...

  5. Easy AR简单教程

    Easy AR简单教程 相关SDK资源下载链接:http://pan.baidu.com/s/1dERtCWD   密码:o0jd 1.ImageTarget的制作 (1).导入EasyARSD包,删 ...

  6. cocos2d-x 3.2 for wp8-xaml应用商店提交应用时出现的API错误(不能用CreateEventExA)解决的方法

    好不easy做完一个游戏.提交到商店显示"本地API不支持CreateEventExA"之类的错误提示 于是我在整个解决方式里查找CreateEventExA,发现没有,却在Aud ...

  7. iOS 使用 Core Plot 绘制统计图表入门

     本文转载至 http://blog.csdn.net/zhibudefeng/article/details/7677457   iOS(iPhone/iPad) 下图形组件有两个有名的,s7gra ...

  8. Jaccard Similarity and Shingling

    https://www.cs.utah.edu/~jeffp/teaching/cs5955/L4-Jaccard+Shingle.pdf https://www.cs.utah.edu/~jeffp ...

  9. git版本控制-- Windows+Git+TortoiseGit+COPSSH安装图文教程

    Windows+Git+TortoiseGit+COPSSH 安装图文教程 教程网址: http://www.liaoxuefeng.com/wiki/0013739516305929606dd183 ...

  10. kinect/xiton 的环境搭建 + rgb图像和深度图的标定

    ~ 软件下载地址 openni https://structure.io/openni https://github.com/OpenNI/OpenNI2 其他软件建议直接下载或通过某宝购买配套的 ~ ...