Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化
1818: [Cqoi2010]内部白点
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 704 Solved: 344
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0 2
2 0
-2 0
0 -2
Sample Output
数据范围
36%的数据满足:n < = 500
64%的数据满足:n < = 30000
100%的数据满足:n < = 100000
HINT
题解 :
-1的情况很好搞,在纸上画画就看出来了。(黄学长博客中有证明:http://hzwer.com/1836.html )
之后我们发现,其实只用找有多少个白点上下左右都为黑点。
然后我们就想到了可以用扫描线。。。
把每个竖线和横线找到。
从下往上扫描,
遇到竖线的下端点就 让坐标+1。
遇到横线就去统计 在 l~r 中的和。
遇到竖线的上端点就 让坐标 -1。
这个用树状数组维护一下即可。
代码和对拍:
丑陋的对拍:
- #include<bits/stdc++.h>
- using namespace std;
- #define INF 1e9
- int a[][],X[],Y[];
- int main()
- {
- int sum,i,j,x,y,xx,yy,xx1,yy1,dx,dy,n,pd;
- scanf("%d",&n);
- xx=-INF;yy=-INF;xx1=INF;yy1=INF;
- for(i=;i<=n;i++){scanf("%d %d",&X[i],&Y[i]);xx=max(xx,X[i]);yy=max(yy,Y[i]);xx1=min(xx1,X[i]);yy1=min(yy1,Y[i]);}
- dx=(int)fabs(xx1);dy=(int)fabs(yy1);
- for(i=;i<=n;i++)
- {
- X[i]+=dx;Y[i]+=dy;
- a[X[i]][Y[i]]=;
- }
- sum=n;
- for(i=xx1+dx;i<=xx+dx;i++)
- {
- for(j=yy1+dy;j<=yy+dy;j++)
- {
- if(a[i][j]==)
- {
- pd=;
- x=i;y=j;
- while(x<=xx+dx){if(a[x][y]==){pd++;break;}x++;}
- x=i;y=j;
- while(y<=yy+dy){if(a[x][y]==){pd++;break;}y++;}
- x=i;y=j;
- while(x>=xx1+dx){if(a[x][y]==){pd++;break;}x--;}
- x=i;y=j;
- while(y>=yy1+dy){if(a[x][y]==){pd++;break;}y--;}
- if(pd==)sum++;
- }
- }
- }
- printf("%d",sum);
- return ;
- }
- #include<bits/stdc++.h>
- using namespace std;
- bool vis[][];
- int add=;
- int main()
- {
- srand(time());
- int n,i,x,y;
- n=rand()%+;
- printf("%d\n",n);
- for(i=;i<=n;i++)
- {
- while()
- {
- x=rand()%-;y=rand()%-;
- if(vis[x+add][y+add]==false)
- {
- vis[x+add][y+add]=true;
- break;
- }
- }
- printf("%d %d\n",x,y);
- }
- return ;
- }
AC程序
- #include<bits/stdc++.h>
- using namespace std;
- #define MAXN 100010
- struct node
- {
- int x,y;
- }p[MAXN];
- struct NODE
- {
- int x,y,pos;
- }pp[MAXN];
- struct Au
- {
- int l,r,t;
- }s[MAXN*];//这一定要开三倍.
- int BIT[MAXN],n,xx[MAXN];
- int read()
- {
- int s=,fh=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
- while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
- return s*fh;
- }
- bool cmp1(NODE a,NODE b)
- {
- if(a.y==b.y)return a.x<b.x;
- return a.y<b.y;
- }
- bool cmp2(NODE a,NODE b)
- {
- if(a.x==b.x)return a.y<b.y;
- return a.x<b.x;
- }
- bool cmp3(Au a,Au b)
- {
- if(p[a.l].y==p[b.l].y)return p[a.l].x<p[a.l].x;
- return p[a.l].y<p[b.l].y;
- }
- int lowbit(int o){return o&(-o);}
- void Add(int k,int add)
- {
- while(k<=n)
- {
- BIT[k]+=add;
- k+=lowbit(k);
- }
- }
- int Sum(int k)
- {
- int sum=;
- while(k>)
- {
- sum+=BIT[k];
- k-=lowbit(k);
- }
- return sum;
- }
- int main()
- {
- int i,cnt,sum,cx,wx,wx1;
- n=read();
- for(i=;i<=n;i++){p[i].x=read();p[i].y=read();xx[i]=p[i].x;pp[i].x=p[i].x;pp[i].y=p[i].y;pp[i].pos=i;}
- sort(pp+,pp+n+,cmp1);//按纵坐标从小到大排,纵坐标相等按横坐标从小到大排.(处理出来横线.)
- cnt=;
- for(i=;i<n;i++)//存储横线要存左右端点坐标.
- {
- if(pp[i].y==pp[i+].y)
- {
- s[++cnt].l=pp[i].pos;s[cnt].r=pp[i+].pos;s[cnt].t=;
- }
- }
- sort(pp+,pp+n+,cmp2);
- for(i=;i<n;i++)//存储竖线只用存上下端点.
- {
- if(pp[i].x==pp[i+].x)
- {
- s[++cnt].l=pp[i].pos;s[cnt].r=pp[i].pos;s[cnt].t=;//下端点.
- s[++cnt].l=pp[i+].pos;s[cnt].r=pp[i+].pos;s[cnt].t=-;//上端点.
- }
- }
- sort(s+,s+cnt+,cmp3);
- /*for(i=n;i>1;i--)
- {
- if(p[s[i].l].y==p[s[i-1].l].y)
- }*/
- memset(BIT,,sizeof(BIT));sum=n;
- sort(xx+,xx+n+);
- cx=unique(xx+,xx+n+)-(xx+);
- //sort(yy+1,yy+n+1);
- //cy=unique(yy+1,yy+n+1)-(yy+1);
- for(i=;i<=cnt;i++)
- {
- if(s[i].t==)
- {
- wx=lower_bound(xx+,xx+cx+,p[s[i].r].x)-(xx+);
- wx1=lower_bound(xx+,xx+cx+,p[s[i].l].x)-(xx+);
- sum+=(Sum(wx)-Sum(wx1+));
- }
- else
- {
- wx=lower_bound(xx+,xx+cx+,p[s[i].l].x)-(xx+);
- //if(wx==0&&xx[1]==p[s[i].l].x)wx=1;
- Add(wx+,s[i].t);
- }
- }
- printf("%d",sum);
- fclose(stdin);
- fclose(stdout);
- return ;
- }
id
Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化的更多相关文章
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组
BZOJ_1818_[Cqoi2010]内部白点 _扫描线+树状数组 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟 ...
- BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...
- bzoj 1818 [CQOI 2010] 内部白点 - 扫描线 - 树状数组
题目传送门 快速的列车 慢速的列车 题目大意 一个无限大的方格图内有$n$个黑点.问有多少个位置上下左右至少有一个黑点或本来是黑点. 扫描线是显然的. 考虑一下横着的线段,取它两个端点,横坐标小的地方 ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- 【bzoj3224】【Tyvj 1728】 普通平衡树 树状数组
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入$x$数2. 删除$x$数(若有多个相同的数,因只删除一个)3. 查询$x$数的排名(若有多个相同的数,因输出最小 ...
- BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)
题目链接 treap及树状数组模板题. treap版: #include<bits/stdc++.h> using namespace std; typedef long long ll; ...
- 【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)
[BZOJ1818][CQOI2010]内部白点(树状数组,扫描线) 题面 BZOJ 题解 不难发现\(-1\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...
- bzoj1818 内部白点(好题) 离散化+树状数组
题目传送门 题意:给出很多黑点,当一个坐标上下左右都有黑点时,这个点也被染成黑色,问最后黑点的数量. 思路:首先,一个很显然的结论,不可能出现无限染色的情况.所以不会输出-1,当n为0或者1时,答案就 ...
随机推荐
- STL unique使用问题
string strs[] = {"one","one","two","three","three" ...
- 九度OJ 1433 FatMouse -- 贪心算法
题目地址:http://ac.jobdu.com/problem.php?pid=1433 题目描述: FatMouse prepared M pounds of cat food, ready to ...
- 判断JS对象是否拥有某属性的方法举例
判断JS对象是否拥有某属性 JS是否拥有某属性的判断方法,这里提供两种方式,供大家参考. 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); ...
- [java bug记录] java.util.zip.ZipException: invalid code lengths set
1. 描述:将代码迁移到maven工程,其中用ZipInputStream读取/src/main/resources下的zip文件时报错:“java.util.zip.ZipException: in ...
- SimpleXML解析xml文件
SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式. 与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据. Simp ...
- phpcms V9 添加模块(转)
转自:http://www.cnblogs.com/Braveliu/p/5101345.html 为phpcms创建一个模块的开发流程 [1]创建模块目录 通过前面的学习,我们已经知道phpcms ...
- pdo如何防止 sql注入
我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用 mysql_real_escape_ ...
- TDirectory.GetDirectoryRoot获取指定目录的根目录
使用函数: System.IOUtils.TDirectory.GetDirectoryRoot 函数定义: class function GetDirectoryRoot(const Path: s ...
- 当今app行业 比较流行的 简称 汇总
B=Business,即企业:C=Customers,即消费者,这样就好理解这些简称了:M=Medium,即媒介B2B:(Business To Business)商家对商家进行交易 如:阿里巴巴.生 ...
- PHP中的urlencode和urldecode的理解
平时在工作中经常要写 $xxx = urldecode($_GET['xxx']);的类似代码,大部分的情况都是没有问题的.也能很好的工作. 所以也没有怎么在意.但是突然有一天我想到 $xxx =$_ ...