P5816 [CQOI2010]内部白点 题解

【题目链接】

【解析】

好题。

拿到题目首先先看一下它的无解情况是怎么判断的。

然后很明显这个是不存在无解情况的。

因为它的黑点开始都是给定了的,可以理解为一个边界。

而新的变化的黑点不会往外扩张,那么也就意味着边界不会扩大。

边界不会扩大,那么变色过程就会终止。

然后考虑按着题目里的意思来看,你就会发现一个白点变为黑点,始终实在两个横坐标相同的点之间的。

这可以抽象为一根竖线,然后这个时候你发现只要出现了一根水平的线就对答案有贡献了。

那么,你就可以使用一种扫描线的过程。

对于竖线就是扫到上端点就执行单点减的过程,扫到下断点就单点加。

对于横线就直接区间查找一波,等价于寻找与它有交点的竖线个数。

然后就没了,不过坐标可能为负,所以需要离散化。

#include<bits/stdc++.h>
#define int long long
using namespace std;
template<typename T> inline void read(T &x){T f=1;x=0;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x*=f;}
const int N  = 6e5;
int n,xx[N],yy[N],c[N],ans,m1,m2,num;
struct node{int x,y;}a[N];
struct line{int x,y,rx,type;}l[N];
int mp(line x,line y){
	if(x.y==y.y) return x.type<y.type;
	else return x.y<y.y;
}
int cmp(node x,node y){if(x.y!=y.y)return x.y<y.y; return x.x<y.x;}
int comp(node x,node y){if(x.x!=y.x) return x.x<y.x;return x.y<y.y;}
int lowbit(int x){return x&(-x);}
void change(int x,int val){
	for(int i=x;i<=N;i+=lowbit(i)) c[i]+=val;
}
int ask(int x){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)) ans+=c[i];
	return ans;
}
void work(){
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<n;i++){
		if(a[i].y==a[i+1].y){
			l[++num].x=a[i].x;l[num].y=a[i].y;
			l[num].rx=a[i+1].x;l[num].type=0;
		}
	}
	sort(a+1,a+n+1,comp);
	for(int i=1;i<n;i++){
		if(a[i].x==a[i+1].x){
			l[++num].x=a[i].x;l[num].y=a[i].y;l[num].type=1;
			l[++num].x=a[i].x;l[num].y=a[i+1].y;l[num].type=-1;
		}
	}
	sort(l+1,l+num+1,mp);
}
signed main(){
	read(n);
	for(int i=1;i<=n;i++) read(a[i].x),read(a[i].y),xx[i]=a[i].x,yy[i]=a[i].y;
	sort(xx+1,xx+n+1);sort(yy+1,yy+n+1);
	m1=unique(xx+1,xx+n+1)-1-xx;
	m2=unique(yy+1,yy+n+1)-1-yy;
	for(int i=1;i<=n;i++){
		int val=lower_bound(xx+1,xx+m1+1,a[i].x)-xx;a[i].x=val;
		val=lower_bound(yy+1,yy+m2+1,a[i].y)-yy;a[i].y=val;
	}
	work();
	ans=n;
	for(int i=1;i<=num;i++){
		if(!l[i].type){
			ans+=ask(l[i].rx-1)-ask(l[i].x);
		}
		else{
			change(l[i].x,l[i].type);
		}
	}
	cout<<ans;
	return 0;
}
posted @ 2021-06-23 21:16  Pitiless0514  阅读(67)  评论(0编辑  收藏  举报