HDU - 6601 Keen On Everything But Triangle 主席树
Keen On Everything But Triangle
感觉最近多校好多主席树的亚子,但是本人菜得很,还没学过主席树,看着队友写题就只能划水,\(WA\)了还不能帮忙\(debug\),所以深思熟虑之后决定学习一下主席树。
题意
问在\([l,r]\)区间内取三个数字构成三角形,问能构成的三角形最大的周长是多少?如果不能构成三角形输出\(“-1”\)。
思路
- 三角形构成的条件: - 三条边
- 两边之和大于第三边
 
- 然后呢,我们要找最大的周长,那么我们很容易想到取最大的三条边,如果不行就顺延往下。 
- 我们发现询问很多,暴力肯定不行。那么其实我们会发现,不能构成三角形的条件是两边之和小于等于第三边,那么可以想到斐波那契数列是前两项之和大于第三边,那么如果一直都不符合条件,那么我们也只会找大约\(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 主席树的更多相关文章
- 杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解
		题意: 有\(n\)根长度不一的棍子,q次询问,求\([L,R]\)区间的棍子所能组成的周长最长的三角形.棍长\(\in [1, 1e9]\),n\(\in [1, 1e5]\). 思路: 由于不构成 ... 
- hdu多校第二场1011 (hdu6601) Keen On Everything But Triangle 主席树
		题意: 给定一个数列,每次询问一个区间,问这个区间中的值可组成的周长最大的三角形的周长. 题解: 定理1:给定一些值,这些值中组成边长最大的三角形的三条边的大小排名一定是连续的. 证明:假如第k大,第 ... 
- HDU 4729 An Easy Problem for Elfness 主席树
		题意: 给出一棵树,每条边有一个容量. 有若干次询问:\(S \, T \, K \, A \, B\),求路径\(S \to T\)的最大流量. 有两种方法可以增大流量: 花费\(A\)可以新修一条 ... 
- HDU 6621"K-th Closest Distance"(二分+主席树)
		传送门 •题意 有 $m$ 次询问,每次询问求 $n$ 个数中, $[L,R]$ 区间距 $p$ 第 $k$ 近的数与 $p$ 差值的绝对值: •题解 二分答案,假设当前二分的答案为 $x$,那么如何 ... 
- 2019 Multi-University Training Contest 2 - 1011 - Keen On Everything But Triangle - 线段树
		http://acm.hdu.edu.cn/showproblem.php?pid=6601 首先要贪心地想,题目要最长的边长,那么要怎么构造呢?在一段连续的区间里面,一定是拿出最长的三根出来比,这样 ... 
- 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 ... 
- 【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| ... 
- 【HDOJ6601】Keen On Everything But Triangle(主席树)
		题意:给定一个长为n的序列,有q次询问,每次询问[l,r]这段区间内挑三个数,能组成的三角形的最大周长,无解输出-1 n,q<=1e5,a[i]<=1e9 思路:题解写法和我的不太一样 先 ... 
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
		Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ... 
随机推荐
- .Net-WCF-图书:《WCF编程》
			ylbtech-.Net-WCF-图书:<WCF编程> <WCF编程>是2008年1月机械工业出版社出版的图书,作者是Juval Lowy.Clemens Vasters. 1 ... 
- poj1182食物链(三类并查集)
			动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种 ... 
- List带索引的常用方法,以及集合的三种遍历
			package cn.learn.collection.List; import com.sun.source.tree.NewArrayTree; import java.util.ArrayLis ... 
- 《JAVA设计模式》之适配器模式(Adapter)
			在阎宏博士的<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能 ... 
- [Linux] 027 RPM 包与 源码包的区别
			1. 区别 安装之前的区别: 概念上的区别 安装之后的区别: 安装位置不同 2. RPM 包安装位置 安装在默认位置中 RPM 包默认安装路径 明细 /ect 配置文件安装目录 /usr/bin/ 可 ... 
- [Linux] 008 文件处理命令
			1. 文件处理命令:touch 命令名称:touch 命令所在路径:/bin/touch 执行权限:所有用户 语法:touch [文件名] 功能描述:创建空文件 范例: 文件名不包含空格 touch ... 
- 1、引言(Introduction)
			1.1 欢迎 在生活中用到的机器学习算法: (1)打开谷歌.必应搜索到你需要的内容,正是因为他们有良好的学习算法 (2)每次您阅读您的电子邮件垃圾邮件筛选器,可以帮你过滤大量的垃圾邮件 机器学习为什么 ... 
- python学习第三十二天函数的闭包
			python函数中嵌套另外一个函数,另外一个函数形成一个封闭的环境,里面的那个函数叫做函数的闭包,函数的闭包好处可以保护函数里面的变量,下面讲述函数闭包的实例和用法 1,函数闭包的实例 a='cat' ... 
- bzoj1897. tank 坦克游戏(决策单调性分治)
			题目描述 有这样一款新的坦克游戏.在游戏中,你将操纵一辆坦克,在一个N×M的区域中完成一项任务.在此的区域中,将会有许多可攻击的目标,而你每摧毁这样的一个目标,就将获得与目标价值相等的分数.只有获得了 ... 
- CentOS7安装MySQL5.7.20
			参考1:https://www.cnblogs.com/technology-huangyan/p/10484838.html 参考1:https://blog.csdn.net/aiyowei110 ... 
