原题链接:https://www.luogu.com.cn/problem/P5816

内部白点

题目描述

无限大正方形网格里有 nnn 个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点)。每秒钟,所有内部白点同时变黑,直到不存在内部白点为止。你的任务是统计最后网格中的黑点个数。

内部白点的定义:一个白色的整点 P(x,y)P(x,y)P(x,y) 是内部白点当且仅当 PPP 在水平线的左边和右边各至少有一个黑点(即存在x1<x<x2x_1 < x < x_2x1​<x<x2​ 使得 (x1,y)(x_1,y)(x1​,y) 和 (x2,y)(x_2,y)(x2​,y) 都是黑点),且在竖直线的上边和下边各至少有一个黑点(即存在 y1<y<y2y_1 < y < y_2y1​<y<y2​ 使得 (x,y1)(x,y_1)(x,y1​) 和 (x,y2)(x,y_2)(x,y2​) 都是黑点)。

输入格式

输入第一行包含一个整数 nnn,即初始黑点个数。

以下 nnn 行每行包含两个整数 xxx,yyy,即一个黑点的坐标。没有两个黑点的坐标相同,坐标的绝对值均不超过 10910^9109。

输出格式

输出仅一行,包含黑点的最终数目。

如果变色过程永不终止,输出-1。

输入输出样例

输入 #1
4
0 2
2 0
-2 0
0 -2
输出 #1
5

说明/提示

数据范围

对于 36%36\%36% 的数据,n≤500n \le 500n≤500。

对于 64%64\%64% 的数据,n≤3×104n \le 3 \times 10^4n≤3×104 。

对于 100%100\%100% 的数据,n≤105n \le 10^5n≤105 。

题解

思路比较简单,但是细节挺多。

首先,必定不会有−1-1−1的情况出现,因为一个点从白点变成黑点当且仅当这个白点上下左右都有黑点,而这个白点变成黑点后,它的作用完全可以被催生它的四个黑点取代,即如果新的黑点可以让其他白点变黑那么原来的黑点一样可以。

解决了这个问题,我们就不需要再纠结新产生的黑点对其他白点的影响了,利用初始条件给定的黑点我们就能一次得出答案。

下面考虑怎么一次求出答案,白点变黑点的条件是上下左右均有黑点,我们同样可以套用扫描线的思路,数据结构维护一维,延伸推进一维。在这道题中,可以用线段树来维护横向的信息,当线段树上某个位置有值的时候,就说明此时这一列上下均有一个黑点,再找到当前纵坐标下最左/右端的两个黑点,求这两个黑点之前线段树区间和就是新增的黑点数量。

具体做法是,从下往上地遍历所有点,如果当前点是某个横坐标下最下方的点,那么就在线段树上给该位置+1+1+1,如果当前点是某个横坐标下最上方的点,那么就在线段树上给该位置−1-1−1,这样就保证线段树上有值的位置就是上下都有黑点的位置。

一些细节:横坐标需要离散化、注意独占一纵列的黑点、注意本来上下左右就有黑点的黑点、注意左右本来就有黑点且本身又是纵线最下面的点的黑点。

代码

《取max的初始值设置成0被负数卡了一天且对拍到自闭的故事》

#include<bits/stdc++.h>
#define ls v<<1
#define rs v<<1|1
using namespace std;
const int M=1e5+5;
struct Point{int x,y,val;}pt[M];
struct node{int le,ri,sum;}tree[M<<2];
bool cmpy(Point a,Point b){return a.y==b.y?a.x<b.x:a.y<b.y;}
bool cmpx(Point a,Point b){return a.x==b.x?a.y<b.y:a.x<b.x;}
int n,ans,x[M],tot;
void up(int v){tree[v].sum=tree[ls].sum+tree[rs].sum;}
void build(int v,int le,int ri)
{tree[v].le=x[le],tree[v].ri=x[ri];if(le==ri)return;int mid=le+ri>>1;build(ls,le,mid),build(rs,mid+1,ri);
}
void add(int v,int x,int val)
{if(val>1)return;if(tree[v].le==tree[v].ri){tree[v].sum+=val;return;}if(x<=tree[ls].ri)add(ls,x,val);else add(rs,x,val);up(v);
}
int ask(int v,int le,int ri)
{if(le<=tree[v].le&&tree[v].ri<=ri)return tree[v].sum;int r=0;if(le<=tree[ls].ri)r=ask(ls,le,ri);if(tree[rs].le<=ri)r+=ask(rs,le,ri);return r;
}
void in()
{scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d%d",&pt[i].x,&pt[i].y),x[i]=pt[i].x;
}
void ac()
{sort(pt+1,pt+1+n,cmpx);for(int i=1;i<=n;++i){x[i]=pt[i].x;if(pt[i].x!=pt[i-1].x&&pt[i].x!=pt[i+1].x){pt[i].val=2;continue;}if(pt[i].x!=pt[i-1].x)pt[i].val=1;else if(pt[i].x!=pt[i+1].x)pt[i].val=-1;}tot=unique(x+1,x+1+n)-x-1;build(1,1,tot);sort(pt+1,pt+1+n,cmpy);for(int i=1,j=1,le,ri;i<=n;++i){for(j=i,le=INT_MAX,ri=-INT_MAX;pt[i].y==pt[i+1].y;++i)add(1,pt[i].x,pt[i].val),le=min(le,pt[i].x),ri=max(ri,pt[i].x);add(1,pt[i].x,pt[i].val),le=min(le,pt[i].x),ri=max(ri,pt[i].x);for(j+=1;j<i;++j)ans-=(!pt[j].val||pt[j].val==1);if(le!=ri)ans+=ask(1,le+1,ri-1);}printf("%d\n",ans+n);
}
int main()
{in(),ac();//system("pause");
}

Luogu5816 [CQOI2010]内部白点相关推荐

  1. 【bzoj1818】[Cqoi2010]内部白点

    转载:http://hzwer.com/1836.html Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部 ...

  2. 遥感影像内部“白点”去除技巧

    "白点"怎么来的? 其实"白点"并不是值像素是白色的,实际上是该像素位置为空洞,恰巧画布背景是白色,所以显示成了白点,若画布背景是红色,就是红点! 为什么会产生 ...

  3. 【BZOJ1818】【CQOI2010】【XSY2428】内部白点(树状数组+扫描线)

    先把所有点的xxx坐标离散化. 然后分别将所有点按xxx.yyy排序.这里以按xxx排序为例,对于xxx坐标相同的两个点,我们把它们连成一条线段.那么按yyy坐标排序也一样,把yyy坐标相同的两个点也 ...

  4. 树状数组 + 扫描线 ---- BZOJ1818[内部白点][树状数组+扫描线]

    题目链接 中文题目不再赘述 解题思路:很明显所谓把白点变成黑点,就可以看成两个线段的交点,那么求线段交点的个数我们就可以用扫描线,但是现在有一个问题就是可能你任取两点构成的线段线段的端点会重复计算那么 ...

  5. 【BZOJ1818】内部白点

    链接:BZOJ1818 解法:树状数组 题意转化为求线段的交点个数. 先将任一坐标离散化,这里以 x x x 为例.之后将 x" role="presentation" ...

  6. linux下解压文件丢失文件,Linux下解压文件

    Win10 FaceAPI小demo开发问题汇总 Win10 FaceAPI小demo开发问题汇总 最近使用微软牛津计划做一个小demo,使用FaceAPI做一个小应用,实现刷脸的功能.开发的过程中用 ...

  7. 如何解读决策树和随机森林的内部工作机制?

    随机森林在过去几年里得到了蓬勃的发展.它是一种非线性的基于树的模型,往往可以得到准确的结果.但是,随机森林的工作过程大都处于黑箱状态,往往难以解读和完全理解.近日,Pivotal Engineerin ...

  8. 解密最近几年的新型骗局-情侣网店、未交易、淘宝内部券,你中招了几个

    随着社会的发展,各类的骗局也是层出不穷,稍不留神就会中招,否则怎么会有''城市套路深,我想回农村,农村路太滑,人心更复杂''这句话呢?所以我们要擦亮双眼,今天我就先给大家解密几个最近几年的骗局,看下自 ...

  9. 结电场已经是光入射之前内部各种因素平衡所致的。凭什么说光生载流子是结电场推过去的?好像光生载流子只受结电场作用似的。提出动能假设 ?网友的相同疑问

    光电池里载流子咋个原因定向移动的? dctyu 2011-7-2科创茶话 最近纠结于那个江湖科学问题.遂产生了这个问题. 1.光线射入半导体材料.不论是进了P型一边还是进了N型一边,都会使价电子进入导 ...

  10. 轮播图Swiper小白点(分页器)与图片不同步即失效问题Vue

    一.现象 在使用Swiper轮播图时,图片正常轮播,但是分页器也就是下方显示页码小白点的却跟当前图片的顺序不相对应 二.分析 主要是因为在建立swiper对象时,未在数据请求结束后初始化swiper对 ...

最新文章

  1. Matlab中只运行m文件中部分程序的方法
  2. Seagull License Server 9.4 SR3 2781 完美激活(解决不能打印问题)
  3. OpenGL cubemap 立方体贴图实例
  4. php文件锁解锁是删除对应的文件_软件 | 文件解锁强制删除工具 Wise Force Deleter v1.49...
  5. magento模板中XML与phtml关系
  6. 正则表达式与python re
  7. 通过实验来比较git merge --no-ff 与--ff 和--squash的区别
  8. WEB测试与APP测试重点及区别
  9. 2.描述性统计的matlab 实现
  10. (转)知识图谱如何让智能金融“变魔术”
  11. 一款超漂亮的简历生成器,金三银四的你一定用得上
  12. 库卡profinet通讯中文说明书
  13. 怎么更新计算机显卡,电脑显卡怎么升级?电脑显卡升级的教程
  14. 义乌义川机器人_义乌人文
  15. 百度富文本编辑器插入视频链接相关问题
  16. java 个人通讯录_java web个人通讯录系统设计
  17. 在学习thymeleaf中,给function 方法传Controller传递过来的参数,报错:Uncaught SyntaxError: missing ) after argument list
  18. Linux下安装google浏览器
  19. ajax怎么请求数据,简单快捷
  20. 微积分-微积分的本质

热门文章

  1. OSG实时纹理提取 离屏渲染 输出到OpenCV 反向渲染 OSG摄像头反转 OSG动态模型 摄像机实时渲染
  2. 一台电脑安装多个Chrome
  3. 343.整数拆分(力扣leetcode) 博主可答疑该问题
  4. 怎么轻松学JAVA(三个月拿实习Offer):小猿的JAVA后端之路(持续更新)
  5. How to support Specular-Glossiness in Three.js
  6. dotnet core项目升级到 .net core 2.0
  7. 单片机TM4C123学习(二):中断与按键控制
  8. jquery 获取网页参数
  9. java对象创建、对象内存布局、对象的访问定位、句柄池、直接指针
  10. SpringMVC中的父子容器关系