bzoj 2957: 楼房重建【线段树】
总之就是找前面所有点的斜率都严格小于这个点的这样的点的个数
不管是询问还是修改都非常线段树啊,而且相当眼熟是不是和hotel有点像啊,大概就是区间内记一个len一个max,分别是当前区间答案和区间最大斜率,然后合并区间的时候用右区间递归,分情况讨论更新左区间
这样是两个log……
#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int n,m;
double a[N];
struct qwe
{
int l,r,len;
double mx;
}t[N<<2];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void build(int ro,int l,int r)
{
t[ro].l=l,t[ro].r=r;
if(l==r)
return;
int mid=(l+r)>>1;
build(ro<<1,l,mid);
build(ro<<1|1,mid+1,r);
}
int ques(int ro,double p)
{
if(t[ro].l==t[ro].r)
return p<t[ro].mx;
int mid=(t[ro].l+t[ro].r)>>1;
if(p>=t[ro<<1].mx)
return ques(ro<<1|1,p);
else
return t[ro].len-t[ro<<1].len+ques(ro<<1,p);
}
void update(int ro,double p,int w)
{
if(t[ro].l==t[ro].r)
{
t[ro].len=1,t[ro].mx=p;
return;
}
int mid=(t[ro].l+t[ro].r)>>1;
if(w<=mid)
update(ro<<1,p,w);
else
update(ro<<1|1,p,w);
t[ro].mx=max(t[ro<<1].mx,t[ro<<1|1].mx);
t[ro].len=t[ro<<1].len+ques(ro<<1|1,t[ro<<1].mx);
}
int main()
{
n=read(),m=read();
if(n<=2000&&m<=2000)
{
while(m--)
{
int x=read(),y=read(),ans=0;
a[x]=y;
double mx=0;
for(int i=1;i<=n;i++)
{
if(i>1&&mx<=1e9)
mx=i*mx/(i-1);//cerr<<mx<<" ";
if(a[i]>mx)
ans++;
mx=max(mx,a[i]);
}//cerr<<endl;
printf("%d\n",ans);
}
return 0;
}
build(1,1,n);
while(m--)
{
double x=read(),y=read();
update(1,y/x,(int)x);
printf("%d\n",t[1].len);
}
return 0;
}
bzoj 2957: 楼房重建【线段树】的更多相关文章
- bzoj 2957: 楼房重建 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
- bzoj 2957 楼房重建 (线段树+思路)
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2957 思路: 用分块可以很简单的过掉,但是这道题也可以用线段树写. 分类讨论左区间最大值对 ...
- bzoj 2957: 楼房重建 ——线段树
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- BZOJ 2957 楼房重建(线段树区间合并)
一个显而易见的结论是,这种数字的值是单调递增的.我们修改一个数只会对这个数后面的数造成影响.考虑线段树划分出来的若干线段. 这里有两种情况: 1.某个线段中的最大值小于等于修改的数,那么这个线段的贡献 ...
- BZOJ 2957: 楼房重建 [线段树 信息合并]
传送门 题意:转换成斜率然后维护区间的上升序列(从区间第一个数开始的单调上升序列) 区间保存这个区间的最长序列的长度$ls$和最大值$mx$ 如何合并两个区间信息? 左区间一定选择,右区间递归寻找第一 ...
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- [BZOJ29957] 楼房重建 - 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3294 Solved: 1554[Submit][Status][Discus ...
- [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...
- BZOJ 2957 楼房重建 (线段树)
题目链接 楼房重建 解题思路:我们可以把楼房的最高点的斜率计算出来.那么问题就转化成了实时查询x的个数,满足数列x的左边没有大于等于x的数. 我们可以用线段树维护 设t[i]为如果只看这个区间,可以 ...
随机推荐
- 【计算几何+极角排序+爆ll】E. Convex
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E [题意] 给定n个点的坐标,可以选择其中的四个点构造凸四边形,问最多能构造多少 ...
- [K/3Cloud] 如何设置设置单据分录中的整列的精度
有时,你可能想设置整列的精度,可以在插件中完成. 设置方法如下 : this.View.GetFieldEditor<DecimalFieldEditor>("FAmount&q ...
- HDU 4416 (后缀自动机)
HDU 4416 Good Article Good sentence Problem : 给一个串S,和一些串T,询问S中有多少个子串没有在T中出现. Solution :首先对所有的T串建立后缀自 ...
- Ubuntu 12.04 之 LAMP
搭建LAMP环境 (1)更新软件列表: sudo apt-get update 结果报错: W: 无法下载 bzip2:/var/lib/apt/lists/partial/cn.archive.ub ...
- P1028 数的计算 洛谷
https://www.luogu.org/problem/show?pid=1028 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000), ...
- codevs——1031 质数环
1031 质数环 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个大小为N(N<=17 ...
- Servlet CDI 例子分析
@WebServlet("/cdiservlet") //以@WebServlet注释开头,注释指定相对于上下文根的URL模式,即在根目录下使用/cdiservlet来访问 pub ...
- MongoDB小结15 - find【查询条件$ne】
$ne表示不相等 db.user.find({"name":{"$ne":"william"}})
- 赵雅智_Android的getResources()资源引用
今天做一个Android的刮刮乐项目.里面用到非常多的地方用到了getResources. <span style="font-size:12px;"> // 获得图片 ...
- 010 ACL
Router>en Router#config t Enter configuration commands, one per line. End with CNTL/Z. Router(co ...