Luogu4198 楼房重建
https://zybuluo.com/ysner/note/1124880
题面
带修改的区间维护最大斜率。
题面
解析
用线段树区间维护斜率。
考虑如何向上合并。
左半段一定有贡献。
如果左半段的最大斜率大于右半段,右半段无贡献。
否则,如果在右半段中,
左边大于左半段,则直接加上右边符合条件的(总\(-\)左,因为右边现有的是大于左边的),递归考虑左边;
否则,递归右边。
这个玩意好像不能自然想出来。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=1e5+100;
int n,m,x,y;
struct seg
{
double mk;int s;
}t[N<<2];
il int gi()
{
re int x=0,t=1;
re char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il int Query(re int now,re int l,re int r,re double k)
{
if(t[now].mk<=k) return 0;
if(l==r) return 1;
re int mid=l+r>>1;
if(t[now<<1].mk>=k) return Query(now<<1,l,mid,k)+t[now].s-t[now<<1].s;
else return Query(now<<1|1,mid+1,r,k);
}
il void Modify(re int now,re int l,re int r,re int x,re int z)
{
if(l==r)
{
t[now].mk=1.0*z/x;t[now].s=1;return;
}
re int mid=l+r>>1;
if(x<=mid) Modify(now<<1,l,mid,x,z);
else Modify(now<<1|1,mid+1,r,x,z);
t[now].mk=max(t[now<<1].mk,t[now<<1|1].mk);
t[now].s=t[now<<1].s+Query(now<<1|1,mid+1,r,t[now<<1].mk);
}
int main()
{
n=gi();m=gi();
fp(i,1,m)
{
x=gi();y=gi();
Modify(1,1,n,x,y);
printf("%d\n",t[1].s);
}
return 0;
}
Luogu4198 楼房重建的更多相关文章
- bzoj 2957: 楼房重建 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
- P4198 楼房重建
P4198 楼房重建 集中写博客= = 首先把高度变成斜率 然后就比较玄学了,首先用线段树维护一个区间的斜率最大值,和只看这个区间时能看见的楼房个数ans 然后更新时先更新max,再处理神奇的ans ...
- 【BZOJ2957】楼房重建(线段树)
[BZOJ2957]楼房重建(线段树) 题面 BZOJ 题解 对于整个区间维护最大斜率以及只考虑这个区间的答案 考虑如何向上合并. 首先左半段的答案是一定存在的 所以,现在的问题就是右半段能够贡献的答 ...
- 【BZOJ2957】楼房重建 分块
[BZOJ2957]楼房重建 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子 ...
- BZOJ2957: 楼房重建(线段树&LIS)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3727 Solved: 1793[Submit][Status][Discus ...
- 【BZOJ 2957】 2957: 楼房重建 (线段树)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1753 Solved: 841 Description 小A的楼房外有一大片施 ...
- bzoj 2957 楼房重建 分块
楼房重建 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=29 ...
- 洛谷P4198 楼房重建 (分块)
洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
随机推荐
- java Object类中方法介绍
- Eigen库笔记整理(二)
Eigen/Geometry 模块提供了各种旋转和平移的表示 旋转矩阵直接使用 Matrix3d 或 Matrix3f Eigen::Matrix3d rotation_matrix = Eigen: ...
- https报错注销源文件内容
open -a pycharm /Users/vivi/Library/Python/3.6/lib/python/site-packages/requests/packages/urllib3/co ...
- js之循环语句
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PAT 1134 Vertex Cover
A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at le ...
- clipboard.js兼容ios
再使用clipboard.js做项目时,项目需求是在非input,button等可以点击的标签(span,p,div)上实现点击来复制内容,在PC端和移动端android没问题,但是到了ios毫无反应 ...
- 自己写一个HashMap
package cn.aresoft; /** * HashMap原理 * * @author develp * HashMap是一种以键值对存储数据的数据结构,简单的来说是这样.内部怎么实现的呢?实 ...
- RabbitMQ-rabbitMq各个特性的使用(三)
准备 1.引入客户端和配置文件依赖类 <dependency> <groupId>com.rabbitmq</groupId> <artifactId> ...
- hdu 2602 简单0-1背包模板题
#include<stdio.h> #include<string.h> #define N 1100 int dp[N]; int main() { int n,t,m,a[ ...
- 【BZOJ4514】数字配对(费用流)
题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci× ...