BZOJ 1818: [Cqoi2010]内部白点

news/2024/11/16 7:01:51/

Description

如果一个点左右上下都有黑点,那么这个点也会变成黑点,问最后有多少个黑点\(n\leqslant 10^5\).

Solution

扫描线.

显然变化后的点并不会产生新点,因为他的产生就需要他上下左右有点。

可以把他们转化成一些横纵的互不相交的直线...然后求交点个数...就是扫描线...

Code

/**************************************************************Problem: 1818User: BeiYuLanguage: C++Result: AcceptedTime:1672 msMemory:16532 kb
****************************************************************/#include <bits/stdc++.h>
using namespace std;const int N = 300050;inline int in(int x=0,char s=getchar(),int v=1) { while(s>'9'||s<'0')v=s=='-'?-1:v,s=getchar();while(s>='0'&&s<='9')x=x*10+s-'0',s=getchar();return x*v; }int n,cp,cl,cy,ans;
int yy[N];
pair<int,int> pp[N];
struct P { int x,y,f; }p[N];
struct L { int x,y1,y2; }l[N];int cmpp(const P &a,const P &b) { return a.x==b.x?a.f>b.f:a.x<b.x; }
int cmpl(const L &a,const L &b) { return a.x<b.x; }void Add1(L a) { p[++cp]=(P) { a.y1,a.x,1 },p[++cp]=(P) { a.y2,a.x,-1 }; }
void Add2(L a) { l[++cl]=a; }
int Qy(int x) { return lower_bound(yy+1,yy+cy+1,x)-yy; }namespace Seg {int d[N<<2];#define lc (o<<1)#define rc (o<<1|1)#define mid ((l+r)>>1)void Update(int o) { d[o]=d[lc]+d[rc]; }void Add(int o,int l,int r,int x,int v) {
//      cout<<o<<" "<<l<<" "<<r<<" "<<x<<" "<<v<<endl;if(l==r) { d[o]+=v;return; }if(x<=mid) Add(lc,l,mid,x,v);else Add(rc,mid+1,r,x,v);Update(o);}int Qur(int o,int l,int r,int L,int R) {
//      cout<<o<<" "<<l<<" "<<r<<" "<<L<<" "<<R<<endl;if(L<=l && r<=R) return d[o];int res=0;if(L<=mid) res+=Qur(lc,l,mid,L,R);if(R>mid) res+=Qur(rc,mid+1,r,L,R);return res;}
};int main() {n=in();for(int i=1;i<=n;i++) {int x=in(),y=in();pp[i]=make_pair(x,y);yy[++cy]=y,yy[++cy]=y-1,yy[++cy]=y+1;}sort(yy+1,yy+cy+1);cy=unique(yy+1,yy+cy+1)-yy-1;for(int i=1;i<=n;i++) pp[i].second=Qy(pp[i].second);sort(pp+1,pp+n+1);for(int i=1,j;i<=n;i=j+1) {for(j=i;j<=n && pp[i].first==pp[j+1].first;j++);for(int k=i;k<j;k++) Add2((L) { pp[k].first,pp[k].second+1,pp[k+1].second-1 });}for(int i=1;i<=n;i++) swap(pp[i].first,pp[i].second);sort(pp+1,pp+n+1);for(int i=1,j;i<=n;i=j+1) {for(j=i;j<=n && pp[i].first==pp[j+1].first;j++);for(int k=i;k<j;k++) if(pp[k].second+1<=pp[k+1].second-1)Add1((L) { pp[k].first,pp[k].second+1,pp[k+1].second-1 });}sort(p+1,p+cp+1,cmpp);sort(l+1,l+cl+1,cmpl);/*  cout<<cp<<endl;for(int i=1;i<=cp;i++) cout<<p[i].x<<" "<<p[i].y<<" "<<p[i].f<<endl; cout<<cl<<endl;for(int i=1;i<=cl;i++) cout<<l[i].x<<" "<<l[i].y1<<" "<<l[i].y2<<endl;*/for(int i=1,j,k=1;i<=cl;i=j+1) {for(;k<=cp&&(p[k].x<l[i].x||(p[k].x==l[i].x&&p[k].f>0));k++) Seg::Add(1,1,cy,p[k].y,p[k].f);for(j=i;j+1<=cl && l[i].x==l[j+1].x;j++);for(int t=i;t<=j;t++) ans+=Seg::Qur(1,1,cy,l[t].y1,l[t].y2);for(;k<=cp && p[k].x==l[i].x;k++) Seg::Add(1,1,cy,p[k].y,p[k].f);}printf("%d\n",ans+n);return 0;
}

  

转载于:https://www.cnblogs.com/beiyuoi/p/6748682.html


http://www.ppmy.cn/news/244205.html

相关文章

eoj1818 dijkstra求最短路及其条数

求出有n(1 < n < 100)个结点有向图中&#xff0c;结点1到结点n的最短路径&#xff0c;以及最短路径的条数。 Input 第一行有2个整数n和m( 0 < m < 3000)&#xff0c;接下来m行每行有三个整数u,v,w结点u到v之间有一条权为w的边(w<100000)。 Output 输出只有一…

自考总结:202304考期

考虑成绩昨天刚出&#xff0c;打算做下2023年4月考期的总结。 报考 202304考期报了三科&#xff1a;数据结构导论、管理经济学、信息系统开发与管理。这三科之中&#xff0c;除了信息系统开发与管理已经考过 2 次了&#xff0c;数据结构导论上次学了弃考了&#xff08;考前复…

bzoj 1818/1732 聚会

首先&#xff0c;答案的点一定在三组lca中的一个上 它在那个最深的lca上&#xff0c;不要问我为什么 或者&#xff0c;这三组lca一定有两个重复的&#xff0c;答案是那个不重复的。 #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>…

Yolov5 (v6.1)添加注意力机制

Apply Transformer in the backbone 1、要把注意力结构代码放到common.py文件中 2、手把手带你Yolov5 (v6.1)添加注意力机制(一)&#xff08;并附上30多种顶会Attention原理图&#xff09; 3、手把手带你Yolov5 (v6.1)添加注意力机制(二)&#xff08;在C3模块中加入注意力机…

最新万能门店小程序V5.1.0 独立版源码

使用说明&#xff08;更详细配置见程序根目录下的pdf文档&#xff09;&#xff1a; 1&#xff0c;宝塔新建网站&#xff0c;网站运行目录要指向/public 2&#xff0c;开启SSL&#xff0c;配置好伪静态 3&#xff0c;把网址www.niumawu.com批量替换为你自己的网址 4&#xff0c…

NOI 1818:红与黑(C++)

题目地址&#xff1a;http://noi.openjudge.cn/ch0205/1818/ 题目&#xff1a;求地图中能到达的黑砖总数 一开始没有思路&#xff0c;参考了&#xff1a;http://blog.csdn.net/c20190102/article/details/52329390 思路&#xff1a;简单搜索 使用二维数组保存地图&#xff…

ural 1818 Fair Fishermen

题意&#xff1a; 有n个人分鱼&#xff0c;第一个人先来拿&#xff0c;检查一下总数&#xff0c;如果不能恰好分成n份&#xff0c;则扔掉多余的部分&#xff0c;然后拿走自己应得的1/n&#xff0c;第二个人也重复这个步骤&#xff0c;直到第n个人&#xff0c;然后告诉你每次扔掉…

【BZOJ1818】内部白点

链接&#xff1a;BZOJ1818 解法&#xff1a;树状数组 题意转化为求线段的交点个数。 先将任一坐标离散化&#xff0c;这里以 x x 为例。之后将 x" role="presentation" style="position: relative;">xx 与 y y 坐标分别排序,求出这些线段。以…