hdu 6601 区间条件极值 - 区间 最大 三角形周长
题目传送门//res tp hdu
目的
对长度为n的区间,给定q个子区间,求其元素能构成三角形的最大周长。有多组测试。
n 1e5
q 1e5
ai [1,1e9] (i∈[1,n]);
数据结构
划分树
分析
需在不超过O(logn)的时间内完成一次查询
若一个数列不能构成三角形,则其为斐波那契数列。斐列不超过50项即可达到1e9,故每次只需查询区间的前k大即可,不超过50次询问,即可得到该数列是否能构成三角形
划分树的单次询问第k小/大为logn
#include<iostream>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
const int MAXN = 100000+50;
const int DEEP = 20;
ll tree[DEEP][MAXN];
int cnt[DEEP][MAXN];
ll sorted[MAXN];
void build(int deep,int lft,int rht)
{
if(lft == rht) return;
int mid = (lft + rht)>>1;
int scnt = mid - lft + 1;
ll M = sorted[mid];
for(int i = lft;i<=rht;++i){
if(tree[deep][i] < M) scnt--;
}
int p = lft, r = mid + 1;
for(int i = lft,cnt_in_left = 0;i<=rht;++i){
ll num = tree[deep][i];
if(num < M || (num == M && scnt)){
if(num == M) scnt--;
cnt_in_left++;
tree[deep + 1][p++] = num;
}
else tree[deep + 1][r++] = num;
cnt[deep][i] = cnt_in_left;
}
build(deep + 1,lft,mid);
build(deep + 1,mid + 1,rht);
}
ll query(int deep, int lft, int rht, int qlft, int qrht, int k){
if(lft == rht) return tree[deep][lft];
int mid = (lft + rht)>>1;
int left = 0,sum_in_left = cnt[deep][qrht];
if(qlft != lft){
left = cnt[deep][qlft-1];
sum_in_left-=left;
}
if(sum_in_left >= k){
int new_qlft = lft + left;
int new_qrht = new_qlft + sum_in_left - 1;
return query(deep + 1,lft,mid,new_qlft,new_qrht,k);
}
else{
int a = qlft - lft - left;
int b = qrht - qlft - sum_in_left;
int new_qlft = (mid + 1) + a;
int new_qrht = new_qlft + b;
return query(deep+1,mid+1,rht,new_qlft,new_qrht,k - sum_in_left);
}
}
int main()
{
int n,q,l,r;
while(scanf(" %d %d",&n,&q)!=EOF){
for(int i = 1;i<=n;++i) {
scanf(" %lld",&sorted[i]);
tree[0][i] = sorted[i];
}
sort(sorted+1,sorted+1+n);
build(0,1,n);
while(q--){
scanf(" %d %d",&l,&r);
if(r - l + 1 < 3) printf("-1\n");
else{
int len = r - l + 1;
long long a,b,c,ans = -1;
a = query(0,1,n,l,r,len);
b = query(0,1,n,l,r,len-1);
for(int i = len-2;i>=1;--i){
c = query(0,1,n,l,r,i);
if(b + c > a){
ans = a + b + c;break;
}
a= b;b = c;
}
printf("%lld\n",ans);
}
}
}
}
hdu 6601 区间条件极值 - 区间 最大 三角形周长的更多相关文章
- hdu 3473 区间条件极值 - 区间 差的绝对值 之和的最小
题目传送门//res tp hdu 目的 对长度为n的区间,给定q个子区间,求一x,使得区间内所有元素与x的差的绝对值之和最小. 多测. n 1e5 q 1e5 ai [1,1e9] (i∈[1,n] ...
- hdu 5919 主席树(区间不同数的个数 + 区间第k大)
Sequence II Time Limit: 9000/4500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- HDU.1689 Just a Hook (线段树 区间替换 区间总和)
HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...
- HDU 3397 Sequence operation(区间合并 + 区间更新)
题目链接:pid=3397">http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给定n个数,由0,1构成.共同拥有5种操作. 每一个操 ...
- hdu 1698 线段树 区间更新 区间求和
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu6070(分数规划/二分+线段树区间更新,区间最值)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 给出一个题目提交序列, 从中选出一个正确率最小的子串. 选中的子串中每个题目当且仅当最 ...
- 整数区间及区间集合(C#实现)
/// <summary> /// 整数区间类 /// </summary> private class Interval { , _end = ; public int St ...
- HDU 5224 Tom and paper(最小周长)
HDU 5224 Tom and paper(最小周长) Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d &a ...
- [用CDQ分治解决区间加&区间求和]【习作】
[前言] 作为一个什么数据结构都不会只会CDQ分治和分块的蒟蒻,面对区间加&区间求和这么难的问题,怎么可能会写线段树呢 于是,用CDQ分治解决区间加&区间求和这篇习作应运而生 [Par ...
随机推荐
- 8.5 JavaScript的BOM(二)
8.5 JavaScript的BOM 即 浏览器对象模型(Browser Object Model) 浏览器对象包括 一.Window(窗口) 如果需要打开一个新的网站,应该通过超级链接等方式让用户主 ...
- tomcat在浏览器输入用户名和密码后报错Tomcat Manager App--403 Access Denied You are not authorized to view this page
报错截图:Tomcat Manager App--403 Access Denied You are not authorized to view this page 解决办法: 1.关闭Tomcat ...
- js怎么动态加载js文件(JavaScript性能优化篇)
下面介绍一种JS代码优化的一个小技巧,通过动态加载引入js外部文件来提高网页加载速度 [基本优化] 将所有需要的<script>标签都放在</body>之前,确保脚本执行之前完 ...
- QT中为程序加入超级管理员权限
QT的一些文件操作,注册表的操作等,有些操作会无效,主要是因为没有对C盘的相关权限. 解决方法: 1. mingw编译器 在pro工程文件中加入 RC_FILE=main.rc rc文件,之前一篇博客 ...
- Java-LockSupport
LockSupport 和 CAS 是 Java 并发包中很多并发工具控制机制的基础,它们底层其实都是依赖 Unsafe 实现. LockSupport 提供 park() 和 unpark() 方法 ...
- dubbo异常filter
dubbo请求调用过程分析 https://blog.csdn.net/javahongxi/article/details/72876694 浅谈dubbo的ExceptionFilter异常处理 ...
- Mac下持续集成-查看占用的端口及kill
(base) localhost:~ ligaijiang$ lsof -i tcp:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Q ...
- 数据库 | SQL语法优化方法及实例详解
使用复合索引 如果经常执行如上查询,那么建立三个单独索引不如建立一个复合索引,因为三个单独索引通常数据库每次执行只能使用其中一个,虽然这样比不使用索引而进行全表扫描提高了很多效率,但使用复合索引因为索 ...
- P1241 括号序列
P1241 括号序列 题解 谁解释下标签递推是个什么鬼,应该是暴力 数据比较小直接跑暴力 但是注意题目描述 也就是说: [ ( ] ) 是不合法的 补全应该是 [ ] ( [ ] ) 举个栗子: 比如 ...
- Android通讯-webSocket
概述 上一篇简单的认识了Socket以及他的使用,在学习过程中看到了WebSocket的身影,于是乎百度了一把,这货也可以做全双工的网络通讯,而且是html5提出来的新东西!程序员嘛!就是要对新的东西 ...