bzoj2957分块或线段树
来源:互联网 发布:淘宝招牌图片素材尺寸 编辑:程序博客网 时间:2024/06/03 22:49
2957: 楼房重建
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2460 Solved: 1178
[Submit][Status][Discuss]
Description
小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。
为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线段相交,那么这栋楼房就被认为是可见的。
施工队的建造总共进行了M天。初始时,所有楼房都还没有开始建造,它们的高度均为0。在第i天,建筑队将会将横坐标为Xi的房屋的高度变为Yi(高度可以比原来大---修建,也可以比原来小---拆除,甚至可以保持不变---建筑队这天什么事也没做)。请你帮小A数数每天在建筑队完工之后,他能看到多少栋楼房?
Input
第一行两个正整数N,M
接下来M行,每行两个正整数Xi,Yi
Output
M行,第i行一个整数表示第i天过后小A能看到的楼房有多少栋
Sample Input
3 4
2 4
3 6
1 1000000000
1 1
Sample Output
1
1
1
2
数据约定
对于所有的数据1<=Xi<=N,1<=Yi<=10^9
分块:
#include<bits/stdc++.h>using namespace std;const int N=2050;double h[100011];int belong[100011],size,blocks;struct Block{ double val[N]; int top,s,e; void keep() { double now=0; top=0; for(int i=s;i<=e;i++) if(h[i]>now) val[++top]=now=h[i]; } int ask(double now=0) { int pos=(upper_bound(val+1,val+top+1,now+1e-10)-val); return top-pos+1; }};Block block[N];int main(){ int n,m; scanf("%d%d",&n,&m); size=sqrt(n); for(int i=1;i<=n;i++) { belong[i]=(i-1)/size+1; if(!block[belong[i]].s)block[belong[i]].s=i; block[belong[i]].e=i; } blocks=belong[n]; while(m--) { int a,b; scanf("%d%d",&a,&b); h[a]=(double)b/a; block[belong[a]].keep(); int ans=0; double now=0; for(int i=1;i<=blocks;i++) { ans+=block[i].ask(now); now=max(block[i].val[block[i].top],now); } printf("%d\n",ans); } return 0;}
线段树:
#include<bits/stdc++.h>using namespace std;const int N=100011;struct node{ int l,r; double mx; int n;};node num[N*4];void build(int n,int l,int r){ num[n].l=l;num[n].r=r; if(l==r)return ; int m=(l+r)>>1; build(n<<1,l,m); build(n<<1|1,m+1,r); return ;}int cal(int n,double val){ int l=num[n].l,r=num[n].r; if(l==r) return num[n].mx>val; if(num[n<<1].mx<=val) return cal(n<<1|1,val); else return num[n].n-num[n<<1].n+cal(n<<1,val);}void change(int n,int pos,double val){ int l=num[n].l,r=num[n].r; if(l==r) { num[n].mx=val; num[n].n=1; return ; } int m=(l+r)>>1; if(pos<=m) change(n<<1,pos,val); else change(n<<1|1,pos,val); num[n].mx=max(num[n<<1].mx,num[n<<1|1].mx); num[n].n=num[n<<1].n+cal(n<<1|1,num[n<<1].mx); return ;}int main(){ int n,m; scanf("%d%d",&n,&m); build(1,1,n); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); change(1,a,(double)b/a); printf("%d\n",num[1].n); } return 0;}
阅读全文
0 0
- bzoj2957分块或线段树
- bzoj2957 楼房重建 分块 || 线段树
- bzoj2957(线段树应用)
- bzoj2957 -- 线段树
- [bzoj2957]楼房重建 线段树
- bzoj2957 楼房重建 线段树
- 【bzoj2957】楼房重建 (线段树)
- BZOJ2957 楼房重建(线段树)
- 【线段树】BZOJ2957 楼房重建
- [线段树] BZOJ2957: 楼房重建
- [BZOJ2957]楼房重建-线段树
- bzoj2957楼房重建(线段树)
- 线段树 bzoj2957 楼房重建
- 【线段树】bzoj2957:楼房重建
- [bzoj2957][线段树]楼房重建
- [BZOJ2957] 楼房重建 分块
- BZOJ2957 楼房重建(线段树)
- 【bzoj2957】【楼房重建】【线段树+dp】
- 【Python】抓取人人都是产品经理的文章
- Python学习笔记:python3中的range()函数的返回对象类型
- CSS选择器-属性选择器
- ProxySG对ECDHE协议的支持
- base64乱码
- bzoj2957分块或线段树
- 高斯噪声与高斯滤波
- Python Numpy入门
- 光纤跳线电信级和网络级相关知识
- 国密SM2算法的java和nodejs实现
- 我喜欢培根
- 理解RESTful架构
- C#--WinForm项目核心模块 --用DataTable绑定下拉框的数据源
- maven项目中找不到Maven Dependencies解决办法