【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)
【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)
题面
题解
不难发现\(-1\)就是在搞笑的。
那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着的方向上得到了若干条线段,同理,在竖直方向上也得到了若干条线段,那么最终的答案就是这些线段的交点个数加上原先就有的白点个数,再减去交点上的黑点数目。
直接离散没有任何问题,那么直接扫描线计算即可。
代码有点丑。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Node{int x,y;}p[MAX];
bool operator<(Node a,Node b){if(a.y^b.y)return a.y<b.y;return a.x<b.x;}
bool cmp(Node a,Node b){if(a.x^b.x)return a.x<b.x;return a.y<b.y;}
struct Line{int x,y,v;}X[MAX<<1];
bool operator<(Line a,Line b){if(a.x^b.x)return a.x<b.x;return a.y<b.y;}
int Sx[MAX],tx,Sy[MAX],ty;
int n,ans,tot,c[MAX],v[MAX];
int lb(int x){return x&(-x);}
void add(int x,int w){while(x<=n)c[x]+=w,x+=lb(x);}
int getsum(int x){int s=0;while(x)s+=c[x],x-=lb(x);return s;}
int main()
{
n=read();ans=n;
for(int i=1;i<=n;++i)p[i].x=read(),p[i].y=read();
for(int i=1;i<=n;++i)Sx[++tx]=p[i].x,Sy[++ty]=p[i].y;
sort(&Sx[1],&Sx[tx+1]);tx=unique(&Sx[1],&Sx[tx+1])-Sx-1;
sort(&Sy[1],&Sy[ty+1]);ty=unique(&Sy[1],&Sy[ty+1])-Sy-1;
for(int i=1;i<=n;++i)p[i].x=lower_bound(&Sx[1],&Sx[tx+1],p[i].x)-Sx;
for(int i=1;i<=n;++i)p[i].y=lower_bound(&Sy[1],&Sy[ty+1],p[i].y)-Sy;
sort(&p[1],&p[n+1]);
for(int i=1,j;i<=n;i=j+1)
{
j=i;while(j<n&&p[i].y==p[j+1].y)++j;
X[++tot]=(Line){p[i].x,p[j].y,1};
X[++tot]=(Line){p[j].x+1,p[j].y,-1};
}
sort(&p[1],&p[n+1],cmp);sort(&X[1],&X[tot+1]);
for(int i=1,j,pos=1;i<=n;i=j+1)
{
j=i;while(j<n&&p[i].x==p[j+1].x)++j;
int l=p[i].y,r=p[j].y,x=p[i].x;
while(pos<=tot&&X[pos].x<=x)
{
int xx=X[pos].y;v[xx]+=X[pos].v;
if(!v[xx])add(X[pos].y,-1);
else if(v[xx]==1)add(X[pos].y,1);
++pos;
}
ans+=getsum(r)-getsum(l-1);
for(int k=i;k<=j;++k)if(v[p[k].y])ans-=1;
}
printf("%d\n",ans);
return 0;
}
【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)的更多相关文章
- B1818 [Cqoi2010]内部白点 树状数组
这个题的想法很好想,就是进行排序之后直接检查每个点的上下左右是否有黑点就行.但是直接枚举显然不行,那怎么办呢?我们就用树状数组维护扫描线,把每排左右点看成一条线覆盖,然后从下往上扫,遇到下加一,遇到上 ...
- BZOJ 1818: [Cqoi2010]内部白点(树状数组)
传送门 解题思路 首先一定不可能有\(-1\)的情况,因为新产生的黑点不会造成任何贡献,它的各个方面都是不优的.那么只需要统计一遍答案,首先要将横坐标相同的两个点看成一条竖线,纵坐标相同的点看成一条横 ...
- Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)
[题目链接] http://codeforces.com/contest/786/problem/C [题目大意] 给出一个数列,问对于不同的k,将区间划分为几个, 每个区间出现不同元素个数不超过k时 ...
- Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化
1818: [Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 704 Solved: 344[Submit][Status] ...
- bzoj1818 [Cqoi2010]内部白点
Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变黑,直到不存在内部白点为止.你的任务是统计最后网格 ...
- Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
[题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...
- bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】
参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...
- [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)
这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...
- Codeforces 1139F(树状数组+扫描线)
题目传送 做法 对于每个人,inc为x,pref为y:对于每道菜,p和s为x,b为y 于是根据题意有\[p[i]<=x<=s[i]\]\[p[i]+b[i]<=x+y\]\[p[i] ...
- luogu2154 [SDOI2009] 虔诚的墓主人 离散化 树状数组 扫描线
题目大意 公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地.一块墓地的虔诚度是指以这块墓地为中心的十字架的数目,一个十字架可以看成中间是墓地,墓地的正上.正 ...
随机推荐
- JavaFx之不通过全局静态变量进行窗体通信
百度了n多窗体通信,,,总是通过定义全局静态变量进行传值通信..我个人不喜欢一个controller里写满所有的布局(这样显得臃肿,但是组件传值方便).有没有另外的办法进行模块化并且可以传值呢.. 肯 ...
- SpringMVC之单/多文件上传
1.准备jar包(图标所指必备包,其他按情况导入) 2.项目结构 3.SingleController.java(控制器代码单文件和多文件) package com.wt.uplaod; import ...
- CYJian的水题大赛
实在没忍住就去打比赛了然后一耗就是一天 最后Rank19还是挺好的(要不是乐多赛不然炸飞),这是唯一一套在Luogu上号称水题大赛的而实际上真的是水题大赛的比赛 好了我们开始看题 T1 八百标兵奔北坡 ...
- EZ 2018 06 10 NOIP2018 模拟赛(十八)
好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...
- 【LGR-047】洛谷5月月赛
这次我期待了很久的Luogu月赛崩掉了 传说中的Luogu神机就这样被卡爆了 然后我过了20min才登上Luogu的网站,30min后才看到题目 然后交T1TM的不给我测!!!然后又交了一次机子就炸了 ...
- [Spark][Python]DataFrame select 操作例子II
[Spark][Python]DataFrame中取出有限个记录的 继续 In [4]: peopleDF.select("age","name") In ...
- 面试3——java集合类总结(List)
1.集合类 数组:可以存储对象,也可以存储基本数据类型,但是一次只能存储一种类型,且长度一定,不可改变. 集合:只能存储对象,长度可变,可以存储不同类型的对象.Java集合类主要有三种:set,lis ...
- Codeforces 996E Leaving the Bar (随机化)
题目连接:Leaving the Bar 题意:给你n个向量,你可以加这个向量或减这个向量,使得这些向量之和的长度小于1.5e6. 题解: 按照正常的贪心方法,最后的结果有可能大于1.5e6 .这里我 ...
- xmlSpy套件(Altova MissionKit 2016)的Ollydbg调试过程及破解
最近工作需要用到XML处理软件,网上找到Altova MissionKit 2016( 包含了XmlSpy.MapForce.StyleVision.UModel.DatabaseSpy等工具),用了 ...
- 1017 B. The Bits
链接 [http://codeforces.com/contest/1017/problem/B] 题意 给你两个长度为n,包含0和1的字符串a和b,有一种操作swap a中的任意两个字符使得a&am ...