洛谷 P4198 楼房重建 题解
时间:2019-11-03
本文章向大家介绍洛谷 P4198 楼房重建 题解,主要包括洛谷 P4198 楼房重建 题解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
首先你要知道题问的是什么:
使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度;
怎么做?线段树!
我们在线段树上维护两个东西:1.这个区间内斜率的最大值 2.从这段区间开头可以看到的区间内的所有楼房
初始化:
对于每一个叶子节点,从这段区间头可以看到的楼房数量一定为1,区间斜率最大值一定为该点的斜率;
在合并时:
1.我们可以先查找右区间的左区间的最大值,如果右区间的左区间的最大值比左区间的最大值小,那么右区间的左区间的所有答案一定看不到,所以我们就可以递归查找右区间的右区间
2.如果右区间的左区间的最大值比左区间的最大值大,那么原来被右区间的左区间挡住的现在一样会被挡住,我们就可以加上右区间的右区间的答案,所以我们可以递归查找右区间的左区间
时间复杂度是O(nlog^2n);
#include <bits/stdc++.h> #define inc(i,a,b) for(register int i=a;i<=b;i++) using namespace std; class segment{ public: class node{ public: double maxn; int tot; }tree[2000010]; int query(int k,int l,int r,double goal){ if(tree[k].maxn<=goal){ return 0; } if(l==r){ return tree[k].maxn>goal; } int mid=(l+r)/2; if(tree[k<<1].maxn<=goal){ return query(k<<1|1,mid+1,r,goal); } else{ return query(k<<1,l,mid,goal)+tree[k].tot-tree[k<<1].tot; } } void change(int k,int l,int r,int goal,double value){ if(l==goal&&r==goal){ tree[k].maxn=value; tree[k].tot=1; return; } int mid=(l+r)/2; if(goal<=mid) change(k<<1,l,mid,goal,value); else change(k<<1|1,mid+1,r,goal,value); tree[k].maxn=max(tree[k<<1].maxn,tree[k<<1|1].maxn); tree[k].tot=tree[k<<1].tot+query(k<<1|1,mid+1,r,tree[k<<1].maxn); } }SEG; int n,m; template<class nT> inline void read(nT& x){ char c; while(c=getchar(),!isdigit(c)); x=c^48; while(c=getchar(),isdigit(c)) x=x*10+c-48; } int main() { read(n); read(m); inc(i,1,m){ int x,y; read(x); read(y); SEG.change(1,1,n,x,(double)y/x); printf("%d\n",SEG.tree[1].tot); } }
原文地址:https://www.cnblogs.com/kamimxr/p/11789131.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP基础之输出缓冲区基本概念、原理分析
- 基于python实现删除指定文件类型
- sync-player:使用websocket实现异地同步播放视频
- CentOS7.0下安装PHP5.6.30服务的教程详解
- PHP实现微信提现功能
- PHP实现SMTP邮件的发送实例
- php实现有序数组旋转后寻找最小值办法
- PHP APP微信提现接口代码
- ThinkPHP5 的简单搭建和使用详解
- php中怎么执行linux命令详解
- phpMyAdmin通过密码漏洞留后门文件
- php 调用百度sms来发送短信的实现示例
- MySQL 8.0 新特性:快速加列
- php判断电子邮件是否正确办法
- 用Laravel Sms实现laravel短信验证码的发送的实现