1818: [Cqoi2010]内部白点
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1394 Solved: 625
[Submit][Status][Discuss]
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),即一个黑点的坐标。没有两个黑点的坐标相同,坐标的绝对值均不超过\(10 ^9\)。
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
扫描线板子题
易发现所有能变色的白点一定在第一秒就能变色,上下左右都有黑点。而且永不停止是不可能的。
把黑点离散化,按y排一下序,用vector在每一列的上端点存1,下端点存-1到每一行,顺便找出每一行的左端点和右端点用数组存下来
最后按行扫一遍,先加上端点再区间查询这一行的左右段点再减下端点即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int i,m,n,j,k,zl[100001],zr[100001],x,y,l,r,ll[100001],rr[100001],c[100001],ans;
struct vv{ int x,y; } a[100001],b[100001];
vector <pair<int,int> > q[100001], p[100001];
bool cmp2(vv a,vv b) {if(a.y==b.y) return a.x<b.x; return a.y<b.y;}
void add(int now,int z) { for(int i=now;i<=y;i+=i & -i) c[i]+=z;}
int ask(int now)
{
int ans=0;
for(int i=now;i>0;i-=i & -i) ans+=c[i];
return ans;
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
zl[i]=a[i].x; zr[i]=a[i].y;
}
sort(zl+1,zl+1+n); sort(zr+1,zr+1+n);
x=unique(zl+1,zl+1+n)-zl-1; y=unique(zr+1,zr+1+n)-zr-1;
for(i=1;i<=n;i++)
{
a[i].x=lower_bound(zl+1,zl+1+x,a[i].x)-zl, a[i].y=lower_bound(zr+1,zr+1+y,a[i].y)-zr;
b[i].x=a[i].x; b[i].y=a[i].y;
}
sort(a+1,a+1+n,cmp2);
l=0x3f3f3f3f; r=0;
memset(ll,0x3f,sizeof(ll));
for(i=1;i<=n;i++)
{
if(a[i].y!=a[i-1].y)
{
if(r) p[r].push_back(make_pair(a[i-1].y,-1)), q[l].push_back(make_pair(a[i-1].y,1));
l=0x3f3f3f3f; r=0;
}
l=min(a[i].x,l); r=max(a[i].x,r);
ll[a[i].x]=min(ll[a[i].x],a[i].y);
rr[a[i].x]=max(rr[a[i].x],a[i].y);
}
if(r) p[r].push_back(make_pair(a[n].y,-1)), q[l].push_back(make_pair(a[n].y,1));
for(i=1;i<=x;i++)
{
for(j=0;j<q[i].size();j++) add(q[i][j].first,q[i][j].second);
if(rr[i]) ans+=ask(rr[i])-ask(ll[i]-1);
for(j=0;j<p[i].size();j++) add(p[i][j].first,p[i][j].second);
}
printf("%d",ans);
}
1818: [Cqoi2010]内部白点的更多相关文章
- bzoj 1818 Cqoi2010 内部白点 扫描线
[Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1126 Solved: 530[Submit][Status][Disc ...
- 【BZOJ】1818: [Cqoi2010]内部白点(树状数组+离散+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1818 这一题一开始我就看错了,bzoj的那个绝对值109简直坑人,应该是10^9,我直接写了个暴力. ...
- bzoj 1818: [Cqoi2010]内部白点
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...
- BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...
- BZOJ 1818: [Cqoi2010]内部白点 (BIT + 扫描线)
就是求多条线段的交点数,直接BIT+扫描线就行了. 注意不要算重最初存在的点. CODE #include<bits/stdc++.h> using namespace std; char ...
- BZOJ 1818: [Cqoi2010]内部白点(树状数组)
传送门 解题思路 首先一定不可能有\(-1\)的情况,因为新产生的黑点不会造成任何贡献,它的各个方面都是不优的.那么只需要统计一遍答案,首先要将横坐标相同的两个点看成一条竖线,纵坐标相同的点看成一条横 ...
- Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化
1818: [Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 704 Solved: 344[Submit][Status] ...
- 【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)
[BZOJ1818][CQOI2010]内部白点(树状数组,扫描线) 题面 BZOJ 题解 不难发现\(-1\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
随机推荐
- Python Django migrate 报错解决办法
1. 在现有基础上又添加一个表的时候migrate报错 migrate报错django.db.utils.OperationalError: (1050, "Table 'cmdb_eidc ...
- HTML5新增的form属性简介——张鑫旭
一.引言 HTML5中新增了一个名为form的属性,是一个与处理表单相关的元素. 在HTML4或XHTML中,我们要提交一个表单,必须把相关的控件元素都放在<form>元素下.因为表单提交 ...
- DW如何打开已经关闭的站点文件提示框
DW在已经新建成功站点后,若将站点文件提示框关闭后,如何重新打开呢?即如下图所示的提示框: 点击站点下拉菜单中的‘在站点定位’即可打开关闭的提示框.
- 在element-ui的el-tree组件中用render函数生成el-button
本文主要介绍怎么在el-tree组件中通过render函数来el-button. 这是element-ui中el-tree树: 这是需要实现的效果: tree.vue文件中,具体实现的代码如下: &l ...
- javascript 关于new()继承的笔记
近期的一些学习总结,如有错误不严谨地方,希望指正! 使用new操作符会有如下操作: 1.创建一个对象temp = {}, 2. temp.__proto__ = A.prototype, 3. A.c ...
- Linux 环境下为VirtualBox安装增强功能
VirtualBox安装CentOS后,再安装增强功能就可以共享文件夹.粘贴板以及鼠标无缝移动,主要步骤如下: 1.yum -y update 2.yum -y install g++ gcc gcc ...
- CCSUOJ评测系统——第四次scrum冲刺
1.小组成员 舒 溢 许嘉荣 唐 浩 黄欣欣 廖帅元 刘洋江 薛思汝 2.最终成果及其代码仓库链接 CCSU评测系统 代码仓库 3.评测系统功能 用户注册 用户可选题目进行提交 用户做题结果 排名功能 ...
- windows 命令行使用p4
首先,p4的命令行真的恶心,要不是非要用我一定换成git(逃) 参考网站:https://www.perforce.com/manuals/v15.1/cmdref/p4_add.html 全程尝试各 ...
- LeetCode题解之Number of 1 Bits
1.题目描述 2.问题分析 使用C++ 标准库的 bitset 类,将整数转换为 二进制,然后将二进制表示转换为字符串,统计字符串中 1 的个数即可. 3.代码 int hammingWeight(u ...
- [SQL SERVER] 映射网络驱动器,让SQL服务器可见
在服务器上运行: EXEC sp_configure 'show advanced options', 1; GO RECONFIGURE; GO EXEC sp_configure 'xp_cmds ...