题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601

题意是说用给定区间内的数字组成周长最大的三角形。

大致做法就是求区间第1大,第2大和第3大然后判断是否满足,不满足再求第4大,第5大....。

原本以为复杂度爆炸,结果想想发现最坏的情况只是斐波那契的样子,每个区间也不会很大。

求区间第i大就套了个主席树

 #include <algorithm>
#include<iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + ;
int a[maxn], b[maxn];
int root[maxn], ls[maxn * ], rs[maxn * ], cnt;
ll val[maxn * ];
void build(int l, int r, int &i) {
i = ++cnt;
val[i] = 0ll;
if (l == r)
return;
int mid = l + r >> ;
build(l, mid, ls[i]);
build(mid + , r, rs[i]);
}
void update(int k, int l, int r, int &i) {
ls[++cnt] = ls[i], rs[cnt] = rs[i], val[cnt] = val[i] + ;
i = cnt;
if (l == r)
return;
int mid = l + r >> ;
if (k <= mid)
update(k, l, mid, ls[i]);
else
update(k, mid + , r, rs[i]);
}
ll query(int u, int v, int k, int l, int r) {
if (l == r)
return l;
int x = val[ls[v]] - val[ls[u]];
int mid = l + r >> ;
if (k <= x)
return query(ls[u], ls[v], k, l, mid);
else
return query(rs[u], rs[v], k - x, mid + , r);
}
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
cnt = ;
for (int i = ; i <= n; i++)
scanf("%d", &a[i]), b[i] = a[i];
sort(b + , b + + n);
int k = unique(b + , b + + n) - b - ;
build(, k, root[]);
for (int i = ; i <= n; i++) {
int t = lower_bound(b + , b + + k, a[i]) - b - ;
t++;
root[i] = root[i - ];
update(t, , k, root[i]);
}
for (int i = ; i <= m; i++) {
int l, r;
scanf("%d%d", &l, &r);
int len = r - l + ;
if (len < ) {
printf("-1\n");
continue;
}
ll ans = -;
ll x = b[query(root[l - ], root[r], len, , k)];
ll y = b[query(root[l - ], root[r], len - , , k)];
for (int i = ; i <= len; i++) {
ll z = b[query(root[l - ], root[r], len - i + , , k)];
if (x < y + z) {
ans = x + y + z;
break;
}
else {
x = y;
y = z;
}
}
printf("%lld\n", ans);
}
} }

[2019杭电多校第二场][hdu6601]Keen On Everything But Triangle的更多相关文章

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

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

  2. 2019杭电多校第二场hdu6602 Longest Subarray(线段树)

    Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...

  3. [2019杭电多校第二场][hdu6602]Longest Subarray(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602 题目大意为求最长的区间,满足C种数字在区间内要么不出现,要么出现的次数都不小于K. 大致的分析一 ...

  4. [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机&&hash)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 题目大意为求字符串S有多少个子串S[l,r]满足回文串的定义,并且S[l,(l+r)/2]也满足 ...

  5. [2019杭电多校第二场][hdu6598]Harmonious Army(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6598 题意是说一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息 ...

  6. 2019年杭电多校第二场 1008题Harmonious Army(HDU6598+最小割+建图)

    题目链接 传送门 题意 有\(n\)个士兵,要你给他们分配职业.有\(m\)对关系,对于某一对关系\(u,v\),如果同为勇士则总能力增加\(a\),同法师则增加\(c\),一个勇士一个法师增加\(\ ...

  7. 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)

    题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...

  8. 2019年杭电多校第二场 1002题Beauty Of Unimodal Sequence(LIS+单调栈)

    题目链接 传送门 思路 首先我们对\(a\)正反各跑一边\(LIS\),记录每个位置在前一半的\(LIS\)中应该放的位置\(ans1[i]\),后一半的位置\(ans2[i]\). 对于字典序最小的 ...

  9. 2018 Multi-University Training Contest 2 杭电多校第二场

    开始逐渐习惯被多校虐orz  菜是原罪 1004  Game    (hdoj 6312) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312 虽然披着 ...

随机推荐

  1. BAT面试必问题系列:深入详解JVM 内存区域及内存溢出分析

    前言 在JVM的管控下,Java程序员不再需要管理内存的分配与释放,这和在C和C++的世界是完全不一样的.所以,在JVM的帮助下,Java程序员很少会关注内存泄露和内存溢出的问题.但是,一旦JVM发生 ...

  2. 【SaltStack官方版】—— Events&Reactor系统—BEACONS

    Events&Reactor系统—BEACONS Beacons let you use the Salt event system to monitor non-Salt processes ...

  3. NOIP模拟赛(by hzwer) T2 小奇的序列

    [题目背景] 小奇总是在数学课上思考奇怪的问题. [问题描述] 给定一个长度为 n 的数列,以及 m 次询问,每次给出三个数 l,r 和 P, 询问 (a[l'] + a[l'+1] + ... + ...

  4. 【leetcode】1169. Invalid Transactions

    题目如下: A transaction is possibly invalid if: the amount exceeds $1000, or; if it occurs within (and i ...

  5. adb打开系统设置的命令

    adb命令打开手机设置页面 设置主页面adb shell am start com.android.settings/com.android.settings.Settings 安全adb shell ...

  6. Ubuntu 16.04下使用docker部署MySQL主从复制

    (以下docker相关的命令,需要在root用户环境下或通过sudo提升权限来进行操作.) 首先更新 软件源 https://mirrors.tuna.tsinghua.edu.cn/help/ubu ...

  7. 几种Android混淆和逆向工具介绍

    针对Android面临的安全风险,一些防止逆向的方法应运而生.代码混淆在X86架构上曾经被广泛研究,他被用于保护软件的只是产权,但是恶意软件也常常使用他来对抗杀毒软件或者对抗逆向分析者,代码混淆可以给 ...

  8. LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)

    传送门 解题思路 不难想一个\(O(n^3)\)的\(dp\),设\(f_{i,j}\)表示第\(i\)天,手上有\(j\)股的最大收益,因为这个\(dp\)具有单调性,所以\(f_i\)可以贪心的直 ...

  9. lunwenzhunbei

    1,android sensors introduction http://developer.android.com/guide/topics/sensors/sensors_overview.ht ...

  10. 谷歌 AXURE RP EXTENSION拓展问题

    我们打开某种文件页面是 会提示我们下载 AXURE RP EXTENSION 拓展. 其实我们可以直接用ie浏览器打开即可,不用下载