Keen On Everything But Triangle

感觉最近多校好多主席树的亚子,但是本人菜得很,还没学过主席树,看着队友写题就只能划水,\(WA\)了还不能帮忙\(debug\),所以深思熟虑之后决定学习一下主席树。

题意

问在\([l,r]\)区间内取三个数字构成三角形,问能构成的三角形最大的周长是多少?如果不能构成三角形输出\(“-1”\)。

思路

  • 三角形构成的条件:

    1. 三条边
    2. 两边之和大于第三边
  • 然后呢,我们要找最大的周长,那么我们很容易想到取最大的三条边,如果不行就顺延往下。

  • 我们发现询问很多,暴力肯定不行。那么其实我们会发现,不能构成三角形的条件是两边之和小于等于第三边,那么可以想到斐波那契数列是前两项之和大于第三边,那么如果一直都不符合条件,那么我们也只会找大约\(44\)次第\(k\)大的值,肯定不超时。

  • 然后想明白只后我们就开始暴力了。其实就是用主席树来维护数列,在\(\log{n}\)的时间里找到第\(k\)大的值,那强行用主席树找最大、第二大...,然后暴力找出最长周长就\(ok\)了。

AC代码

#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pii pair<int, int> typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 1e5 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std; struct Node{
int l, r, cnt;
}node[maxn*40];
int w[maxn];
int n, m;
int cas, tol, T;
vector<int> vv;
int a[maxn]; void update(int l, int r, int &x, int y, int pos){
tol++;
x = tol;
node[x] = node[y];
node[x].cnt++;
if(l == r) return;
int mid = l+r>>1;
if(pos <= mid)
update(l, mid, node[x].l, node[y].l, pos);
else
update(mid+1, r, node[x].r, node[y].r, pos);
} int query(int l, int r, int x, int y, int k){
if(l == r)
return l;
int mid = l+r>>1;
int cnt = node[node[y].l].cnt - node[node[x].l].cnt;
if(cnt >= k)
return query(l, mid, node[x].l, node[y].l, k);
else
return query(mid+1, r, node[x].r, node[y].r, k-cnt);
} int getid(int x){
return lower_bound(vv.begin(), vv.end(), x) - vv.begin()+1;
} int main() {
while(~scanf("%d%d", &n, &m)){
vv.clear();
tol = 0;
mes(w, 0);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
vv.push_back(a[i]);
}
sort(vv.begin(), vv.end());
vv.erase(unique(vv.begin(), vv.end()), vv.end());
for(int i = 1; i <= n;i++){
int pos = getid(a[i]);
update(1, n, w[i], w[i-1], pos);
}
while(m--){
int l, r;
scanf("%d%d", &l, &r);
int b[4], flag = 0;
if(r - l + 1 < 3){
printf("-1\n");
continue;
}
b[1] = query(1, n, w[l-1], w[r], r-l+1)-1;
b[2] = query(1, n, w[l-1], w[r], r-l)-1;
for(int k = r-l-1; k >= 1; k--){
b[3] = query(1, n, w[l-1], w[r], k)-1;
if(vv[b[1]] < vv[b[2]]+vv[b[3]]){
printf("%lld\n", 1ll*vv[b[1]]+vv[b[2]]+vv[b[3]]); flag = 1;
break;
}
for(int i = 1; i <= 2; i++)
b[i] = b[i+1];
}
if(!flag)
printf("-1\n");
}
}
return 0;
}

HDU - 6601 Keen On Everything But Triangle 主席树的更多相关文章

  1. 杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解

    题意: 有\(n\)根长度不一的棍子,q次询问,求\([L,R]\)区间的棍子所能组成的周长最长的三角形.棍长\(\in [1, 1e9]\),n\(\in [1, 1e5]\). 思路: 由于不构成 ...

  2. hdu多校第二场1011 (hdu6601) Keen On Everything But Triangle 主席树

    题意: 给定一个数列,每次询问一个区间,问这个区间中的值可组成的周长最大的三角形的周长. 题解: 定理1:给定一些值,这些值中组成边长最大的三角形的三条边的大小排名一定是连续的. 证明:假如第k大,第 ...

  3. HDU 4729 An Easy Problem for Elfness 主席树

    题意: 给出一棵树,每条边有一个容量. 有若干次询问:\(S \, T \, K \, A \, B\),求路径\(S \to T\)的最大流量. 有两种方法可以增大流量: 花费\(A\)可以新修一条 ...

  4. HDU 6621"K-th Closest Distance"(二分+主席树)

    传送门 •题意 有 $m$ 次询问,每次询问求 $n$ 个数中, $[L,R]$ 区间距 $p$ 第 $k$ 近的数与 $p$ 差值的绝对值: •题解 二分答案,假设当前二分的答案为 $x$,那么如何 ...

  5. 2019 Multi-University Training Contest 2 - 1011 - Keen On Everything But Triangle - 线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=6601 首先要贪心地想,题目要最长的边长,那么要怎么构造呢?在一段连续的区间里面,一定是拿出最长的三根出来比,这样 ...

  6. HDU 4251 The Famous ICPC Team Again 主席树

    The Famous ICPC Team Again Problem Description   When Mr. B, Mr. G and Mr. M were preparing for the ...

  7. 【HDU - 4348】To the moon(主席树在线区间更新)

    BUPT2017 wintertraining(15) #8G 题意 给一个数组a,有n个数,m次操作.\(N, M ≤ 10^5, |A i| ≤ 10^9, 1 ≤ l ≤ r ≤ N, |d| ...

  8. 【HDOJ6601】Keen On Everything But Triangle(主席树)

    题意:给定一个长为n的序列,有q次询问,每次询问[l,r]这段区间内挑三个数,能组成的三角形的最大周长,无解输出-1 n,q<=1e5,a[i]<=1e9 思路:题解写法和我的不太一样 先 ...

  9. 2019杭电多校第二场hdu6601 Keen On Everything But Triangle

    Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...

随机推荐

  1. 常用的Android关键词定位方法

    1字符串,特征字 根据程序运行中出现的特征字词进行搜索,从而获取定位到程序的相关位置之中.以前用 得比较多,不过现在一般难以找到想要的关键词.有时候需要对特征字进行拆分来进行搜索.才 能获得一点提示. ...

  2. Oracle创建dblink进行跨数据库操作

    创建dblink:create public database link link_to_test connect to 用户名 IDENTIFIED by "密码大写" usin ...

  3. Ubuntu查看端口使用情况,使用netstat命令:

    https://www.cnblogs.com/fly-book/p/9827128.html

  4. 【HANA系列】SAP HANA的特点总结

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA的特点总结   ...

  5. hdu2182Frog(动态规划)

    Problem Description A little frog named Fog is on his way home. The path's length is N (1 <= N &l ...

  6. Arrays -数组工具类,数组转化字符串,数组排序等

    package cn.learn.basic; import java.util.Arrays; /* java.util.Arrays是一个与数组相关的工具类,含有大量静态方法,用来实现数组常见的操 ...

  7. 《JAVA设计模式》之观察者模式(Observer)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述观察者(Observer)模式的: 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Mo ...

  8. hive环境

    一.hive安装部署 1.hive安装及配置 (1)解压apache-hive-1.2.1-bin.tar.gz到/opt/module/目录下面 tar -zxvf apache-hive-1.2. ...

  9. JS原型链详解

    最近面试被问到了就决定好好深入理解原型链 对象 要清楚原型链,首先要弄清楚对象: 普通对象 最普通的对象:有__proto__属性(指向其原型链),没有prototype属性. 原型对象(person ...

  10. Linux删除自带的openjdk,安装jdk1.8

    第一步:查看有哪些安装包 [root@localhost ~]# rpm -qa | grep javatzdata-java-2016g-2.el7.noarchpython-javapackage ...