bzoj 1818 Cqoi2010 内部白点 扫描线
[Cqoi2010]内部白点
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1126 Solved: 530
[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
发现第一秒变完后就没了,不可能为-1
然后就是扫描线求交点了。
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio> #define N 100001
#define M 1000001
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,cnt,ans,hash[N],tr[N];
struct point{int x,y;}a[N];
struct seg{int k,x,y,r;}s[M]; inline bool cmp1(point a,point b){if(a.x==b.x){return a.y<b.y;}return a.x<b.x;}
inline bool cmp2(point a,point b){if(a.y==b.y){return a.x<b.x;}return a.y<b.y;}
inline bool cmp3(seg a,seg b)
{
if(a.y==b.y)return a.k<b.k;
return a.y<b.y;
}
int find(int x)
{
int l=,r=n,mid;
while(l<=r)
{
int mid=(l+r)>>;
if(hash[mid]<x)l=mid+;
else if(hash[mid]>x)r=mid-;
else return mid;
}
}
void insert(int k,int l,int r,int t)//0横线,1竖线
{
if(!k){s[++cnt].x=find(l);s[cnt].r=find(r);s[cnt].y=t;}
else{
s[++cnt].x=find(t);s[cnt].y=l;s[cnt].k=;
s[++cnt].x=find(t);s[cnt].y=r;s[cnt].k=-;
}
}
void build()
{
sort(a+,a+n+,cmp1);
for(int i=;i<=n;i++)
if(a[i].x==a[i-].x)
insert(,a[i-].y,a[i].y,a[i].x);
sort(a+,a+n+,cmp2);
for(int i=;i<=n;i++)
if(a[i].y==a[i-].y)
insert(,a[i-].x,a[i].x,a[i].y);
}
int lowbit(int x){return x&(-x);}
void update(int x,int y)
{
while(x<=n)
{
tr[x]+=y;
x+=lowbit(x);
}
}
int ask(int x)
{
int s=;
while(x)
{
s+=tr[x];
x-=lowbit(x);
}
return s;
}
void work()
{
for(int i=;i<=cnt;i++)
{
if(!s[i].k)ans+=ask(s[i].r-)-ask(s[i].x);
else update(s[i].x,s[i].k);
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
hash[i]=a[i].x;
}
sort(hash+,hash+n+);
build();
sort(s+,s+cnt+,cmp3);
work();
printf("%d",ans+n);
}
bzoj 1818 Cqoi2010 内部白点 扫描线的更多相关文章
- 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]内部白点
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...
- BZOJ 1818: [Cqoi2010]内部白点(树状数组)
传送门 解题思路 首先一定不可能有\(-1\)的情况,因为新产生的黑点不会造成任何贡献,它的各个方面都是不优的.那么只需要统计一遍答案,首先要将横坐标相同的两个点看成一条竖线,纵坐标相同的点看成一条横 ...
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- 【BZOJ】1818: [Cqoi2010]内部白点(树状数组+离散+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1818 这一题一开始我就看错了,bzoj的那个绝对值109简直坑人,应该是10^9,我直接写了个暴力. ...
- 1818: [Cqoi2010]内部白点
Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1394 Solved: 625 [Submit][Status][Discuss] Descriptio ...
- 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\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...
随机推荐
- iterator与iterable
用Iterator模式实现遍历集合Iterator模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构.例如,如果没有使用Iterato ...
- SSave ALAsset image to disk fast on iOS
I am using ALAsset to retrieve images like that: [[asset defaultRepresentation] fullResolutionImage] ...
- C++类型强制转换<转>
转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...
- [BZOJ4899]:记忆的轮廓(概率DP)
题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...
- 设置tableview的滚动范围--iOS开发系列---项目中成长的知识三
设置tableview的滚动范围 有时候tableview的footerview上的内容需要向上拖动界面一定距离才能够看见, 项目中因为我需要在footerviw上添加一个按钮,而这个按钮又因为这个原 ...
- Sass基本数据类型和各类型的原生方法
数据类型: 数字:1,2,3,11,10px (可以带单位) 字符串:"asd",'asd',asd (有引号和无引号都是字符串类型) 如 $name : zhang san ; ...
- ES6变量解构赋值的用法
一.数组赋值(从数组中提取值,按照对应位置,对变量赋值) 1. 完全解构(变量与值数目相等) let arr = [1, 2, 3]; let [a,b,c] = arr; console.log(a ...
- Git学习——提交BUG
git stash 可以把当前工作区的修改存储起来,此时可以查看工作区是干净的.这时可以切换到别的分支去处理BUG.等BUG处理好之后,回到该分支,恢复工作区.通过: git stash list 查 ...
- break、continue、exit、return的区别和对比
break.continue.exit.return的区别和对比 一:说明 break.continue在条件循环语句及循环语句(for.while.if等)中用于控制程序的走向:而exit则用于种植 ...
- CM3中数据传输对齐/非对齐方式
在CM3中,非对齐的数据传输只发生在常规的数据传送指令中,如LDR.LDRH.LDRSH.其他指令则不支持,包括: 1.多个数据的加载.存储(LDM/STM). 2.堆栈操作PUSH.POP. 3.互 ...