首页 > 其他分享 >洛谷 P4198 楼房重建(线段树上二分)

洛谷 P4198 楼房重建(线段树上二分)

时间:2024-02-25 11:44:55浏览次数:28  
标签:洛谷 int 线段 mid len P4198 区间 include id

传送门

解题思路

动态维护区间里面单调递增斜率的长度

需要维护两个信息:上述长度,和区间最大值(合并时需要)

难点在于两个子区间的合并。

左区间的楼房一定都能看见(没有遮挡),所以要在右区间二分,找到左面最大值 lmax 在右区间的位置,然后进行合并。

复杂度两个log。

AC代码

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<ctime>
#include<stack>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(!(c>='0'&&c<='9')) {if(c=='-') f=-1;c=getchar();}
	while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
	return x*f;
}
const int maxn=100005;
double a[maxn],d[maxn*4];
int len[maxn*4],n,m;
int getans(int id,int l,int r,double x){
	if(l==r) return a[l]>x;
	if(d[id]<=x) return 0;
	int mid=(l+r)/2;
	if(d[id*2]>x) return len[id]-len[id*2]+getans(id*2,l,mid,x);
	else return getans(id*2+1,mid+1,r,x);
}
void pushup(int id,int l,int r){
	d[id]=max(d[id*2],d[id*2+1]);
	int mid=(l+r)/2;
	len[id]=len[id*2]+getans(id*2+1,mid+1,r,d[id*2]);
}
void add(int id,int l,int r,int x,double v){
	if(l==r){
		d[id]=v;
		len[id]=1;
		return;
	}
	int mid=(l+r)/2;
	if(x<=mid) add(id*2,l,mid,x,v);
	else add(id*2+1,mid+1,r,x,v);
	pushup(id,l,r);
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<=m;i++){	
		int x=read(),y=read();
		a[x]=1.0*y/x;
		add(1,1,n,x,a[x]);
		printf("%d\n",len[1]);
	}
    return 0;
}

标签:洛谷,int,线段,mid,len,P4198,区间,include,id
From: https://www.cnblogs.com/yinyuqin/p/18032208

相关文章

  • POJ--3468 A Simple Problem with Integers(线段树/树状数组)
    记录11:032024-2-25http://poj.org/problem?id=1961线段树树状数组把区间增加转变为单点增加,利用两个树状数组\(c_0和c_1\)将”Clrd"转化为在树状数组\(c_0\)中,把位置l上的数加d在树状数组\(c_0\)中,把位置r+1上的数减d在树状数组\(c_1\)中,把位置l上的数......
  • 洛谷题单指南-贪心-P1208 [USACO1.3] 混合牛奶 Mixing Milk
    原题链接:https://www.luogu.com.cn/problem/P1208题意解读:就是一个部分背包问题,贪心模版题。解题思路:优先选择单价低的牛奶即可。100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=5005;structfarmer{intprice,count;}f[N];boolcmp(fa......
  • 洛谷题单指南-贪心-P5019 [NOIP2018 提高组] 铺设道路
    原题链接:https://www.luogu.com.cn/problem/P5019题意解读:最短时间内填满道路,连在一起的不为0的坑可以一起填解题思路:方法1:分治法对于一段连续不同深度的坑,可以最多连续填的天数是最小深度在填满最小深度之后,分别针对其左边和右边的区域再进行填充,这就是此题分治法的理论基......
  • 洛谷【算法1-3】暴力枚举
    P2241统计方形(数据加强版)-洛谷|计算机科学教育新生态(luogu.com.cn)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintINF=0x3f3f3f3f;lln,m,z,c;signedmain(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin......
  • 这就是我们的李超线段树啊,你们有没有这样的李超线段树啊?
    沟槽的公式,真是公公又式式啊。考虑一个线段树节点维护一个线段(但一条线段可以被多个线段树节点维护),需要保证该节点被线段完全覆盖。每次添加一个线段的时候:如果当前节点没有被这个线段完全覆盖,那么直接递归左右儿子修改。如果当前节点的线段比新线段严格劣(也就是对于每一......
  • 线段树分治&cdq分治&整体二分
    preface感觉三种分治算法容易搞混并不容易区分它们使用的场景和题目(虽然有些题目根据性质可以使用多种分治),所以还是要归纳一下线段树分治Part1主要是处理一类带有撤回的问题,也就是一次修改只对一段区间生效(这里的区间指的是时间)即区间修改,单点查询流程大致是把区间修改挂在......
  • 线段树乱搞大法
    线段树乱搞大法Part1普通线段树简单的区间或单点问题,支持四则运算(可以扩展成可合并的信息,如hash)权值线段树每个节点维护值域为\([l,r]\)的个数,可以维护全局第k大(线段树二分),zkw线段树...Part2懒标记区间操作,历史版本最值/和标记永久化区间操作,单点修改要求:操作顺序不......
  • UOJ228/HDU5828 基础数据结构练习题/Rikka with Sequence 题解(势能线段树)
    势能线段树。如果线段树上一个节点的\(\max-\min\ge2\),我们称其为关键节点,考虑定义势能\(\phi\)为线段树上关键节点的个数。对于每次开方操作,如果当前节点为关键节点,则暴力递归左右儿子修改,否则:如果当前节点\(\max=\min\)或\(\max=\min+1\)且\(\max\)不是完全平方数,......
  • 洛谷题单指南-贪心-P1478 陶陶摘苹果(升级版)
    原题链接:https://www.luogu.com.cn/problem/P1478题意解读:题目的本质是任务安排问题,有n件任务,每件任务耗时不同,在一定的时间内,如何安排任务使得完成的任务越多越好。解题思路:对于这类问题,贪心策略是优先完成容易的。回到摘苹果问题,要优先摘耗费力气小的,如果高度够不着,就跳过,......
  • 洛谷题单指南-贪心-P1106 删数问题
    原题链接:https://www.luogu.com.cn/problem/P1106题意解读:如何删数,让剩下的数最小,贪心选择问题。解题思路:先看样例:1754384第1次遍历:删掉7,剩下15438第2次遍历:删掉5,剩下1438第3次遍历:删掉4,剩下138第4次遍历:删掉8,剩下13,即为结果所以,贪心策略如下:1、遍历每一个数,如果前一......