杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解
题意:
有\(n\)根长度不一的棍子,q次询问,求\([L,R]\)区间的棍子所能组成的周长最长的三角形。棍长\(\in [1, 1e9]\),n\(\in [1, 1e5]\)。
思路:
由于不构成三角形的数组为菲波那切数列,所以当棍数超过44时,长度超过1e9,所以从最大开始数最多不超过45次就能找到构成三角形。所以直接主席树查询区间第k大。复杂度\(O(45 * q * logn)\)。
代码:
#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<stack>
#include<ctime>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
using namespace std;
int n, q, tot;
int root[maxn];
ll a[maxn];
vector<ll> vv;
int getId(ll x){
    return lower_bound(vv.begin(), vv.end(),x) - vv.begin() + 1;
}
struct node{
    int lson, rson;
    int sum;
}T[maxn * 40];
void update(int l, int r, int &now, int pre, int v, int pos){
    T[++tot] = T[pre], T[tot].sum += v, now = tot;
    if(l == r) return;
    int m = (l + r) >> 1;
    if(m >= pos)
        update(l, m, T[now].lson, T[pre].lson, v, pos);
    else
        update(m + 1, r, T[now].rson, T[pre].rson, v, pos);
}
int query(int l, int r, int pre, int now, int k){
    if(l == r) return l;
    int m = (l + r) >> 1;
    int sum = T[T[now].lson].sum - T[T[pre].lson].sum;
    if(sum >= k)
        return query(l, m, T[pre].lson, T[now].lson, k);
    else
        return query(m + 1, r, T[pre].rson, T[now].rson, k - sum);
}
void init(){
    memset(T, 0, sizeof(T));
    tot = 0;
    vv.clear();
}
int main(){
    while(~scanf("%d%d", &n, &q)){
        init();
        for(int i = 1; i <= n; i++){
            scanf("%lld", &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++){
            update(1, vv.size(), root[i], root[i - 1], 1, getId(a[i]));
        }
        while(q--){
            int l, r;
            scanf("%d%d", &l, &r);
            int num = 0;
            ll ans = -1;
            ll a1, a2, a3;
            for(int i = r - l + 1; i >= 1; i--){
                if(num == 0){
                    a3 = query(1, vv.size(), root[l - 1], root[r], i);
                    num++;
                }
                else if(num == 1){
                    a2 = query(1, vv.size(), root[l - 1], root[r], i);
                    num++;
                }
                else if(num == 2){
                    a1 = query(1, vv.size(), root[l - 1], root[r], i);
                    num++;
                }
                else{
                    a3 = a2, a2 = a1;
                    a1 = query(1, vv.size(), root[l - 1], root[r], i);
                }
                if(num == 3 && vv[a1 - 1] + vv[a2 - 1] > vv[a3 - 1]){
                    ans = vv[a1 - 1] + vv[a2 - 1] + vv[a3 - 1];
                    break;
                }
            }
            printf("%lld\n", ans);
        }
    }
    return 0;
}
												
											杭电多校HDU 6601 Keen On Everything But Triangle(主席树)题解的更多相关文章
- HDU - 6601 Keen On Everything But Triangle 主席树
		
Keen On Everything But Triangle 感觉最近多校好多主席树的亚子,但是本人菜得很,还没学过主席树,看着队友写题就只能划水,\(WA\)了还不能帮忙\(debug\),所以深 ...
 - 杭电多校HDU 6579 Operation (线性基 区间最大)题解
		
题意: 强制在线,求\(LR\)区间最大子集异或和 思路: 求线性基的时候,记录一个\(pos[i]\)表示某个\(d[i]\)是在某个位置更新进入的.如果插入时\(d[i]\)的\(pos[i]\) ...
 - 杭电多校HDU 6656 Kejin Player(概率DP)题解
		
题意: 最低等级\(level\ 1\),已知在\(level\ i\)操作一次需花费\(a_i\),有概率\(p_i\)升级到\(level\ i+1\),有\(1 - p_i\)掉级到\(x_i( ...
 - 杭电多校HDU 6599 I Love Palindrome String (回文树)题解
		
题意: 定义一个串为\(super\)回文串为: \(\bullet\) 串s为主串str的一个子串,即\(s = str_lstr_{l + 1} \cdots str_r\) \(\bullet\ ...
 - 杭电多校HDU 6586 String(预处理 + 贪心)题解
		
题意: 给你一个串,现需要你给出一个子序列,满足26个约束条件,\(len(A_i) >= L_i\) 且 \(len(A_i) <= R_i\), \(A_i\)为从a到z的26个字母. ...
 - [2019杭电多校第三场][hdu6609]Find the answer(线段树)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6609 大致题意是求出每个位置i最小需要将几个位置j变为0(j<i),使得$\sum_{j=1}^ ...
 - [2019杭电多校第三场][hdu6606]Distribution of books(线段树&&dp)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 题意为在n个数中选m(自选)个数,然后把m个数分成k块,使得每块数字之和最大的最小. 求数字和最 ...
 - 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)
		
题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...
 - 2019杭电多校第三场hdu6609 Find the answer(线段树)
		
Find the answer 题目传送门 解题思路 要想变0的个数最少,显然是优先把大的变成0.所以离散化,建立一颗权值线段树,维护区间和与区间元素数量,假设至少减去k才能满足条件,查询大于等于k的 ...
 
随机推荐
- 【工具篇】Mysql的安装和使用
			
[导读]Mysql是数据分析师入门级的技能之一,对于很多小白同学来说,可能还没有机会接触SQL知识.那么我们如何熟悉和练习SQL呢,今天教大家安装两个软件:MySQL和Navicat.后续我们会推出S ...
 - 上海某小公司面试题:synchronized锁原理
			
synchronized锁是Java面试的过程中比较常考的知识点了,从偏向锁->轻量级锁->重量级锁都可以聊 CAS在这篇没有讲述,因为在上一篇已经写了,有兴趣的同学可以翻翻开 目前已经连 ...
 - 代码托管从业者 Git 指南
			
本文作者:李博文 - CODING 后端开发工程师 前言 六七年前,我机缘巧合进入了代码托管行业,做过基于 Git 支持 SVN 客户端接入.Git 代码托管平台分布式.Git 代码托管读写分离.Gi ...
 - PB 级大规模 Elasticsearch 集群运维与调优实践
			
PB 级大规模 Elasticsearch 集群运维与调优实践 https://mp.weixin.qq.com/s/PDyHT9IuRij20JBgbPTjFA | 导语 腾讯云 Elasticse ...
 - B-tree  R-tree B+-tree  indexes  索引顺序存取方法 ISAM  MySQL实现拓展ISAM为MyISAM
			
High Performance MySQL, Third Edition by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko http://d ...
 - (Oracle)DDL及其数据泵导入导出(impdp/expdp)
			
create tablespace ybp_dev datafile 'G:\app\Administrator\oradata\health\ybp_dev1.dbf' size 10m autoe ...
 - 20201103gryz模拟赛解题报告
			
写在前面 昨天忘写了来补上 T1位运算乱搞一会没搞出来, 打完T4floyd暴力分之后发现T2树状数组可以骗点分 打完T3暴力手模了一遍样例之后发现T3就是个线段树板子 最后就非常愉快的拿到175pt ...
 - 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定
			
前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...
 - (十五)整合 Drools规则引擎,实现高效的业务规则
			
整合 Drools规则引擎,实现高效的业务规则 1.Drools引擎简介 1.1 规则语法 2.SpringBoot整合Drools 2.1 项目结构 2.2 核心依赖 2.3 配置文件 3.演示案例 ...
 - 使用Docker部署监控系统,Prometheus,Grafana,监控服务器信息及Mysql
			
使用Docker部署监控系统,Prometheus,Grafana,监控服务器信息及Mysql 一.docker部署prometheus监控系统 1.1 配置安装环境 1.1.1 安装promethe ...