Keen On Everything But Triangle

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

题意

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

思路

  • 三角形构成的条件:

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

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

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

AC代码

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <ctime>
  5. #include <cmath>
  6. #include <stack>
  7. #include <queue>
  8. #include <cfloat>
  9. #include <string>
  10. #include <vector>
  11. #include <cstdio>
  12. #include <bitset>
  13. #include <cstdlib>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <algorithm>
  17. #define lowbit(x) x & (-x)
  18. #define mes(a, b) memset(a, b, sizeof a)
  19. #define fi first
  20. #define se second
  21. #define pii pair<int, int>
  22. typedef unsigned long long int ull;
  23. typedef long long int ll;
  24. const int maxn = 1e5 + 10;
  25. const int maxm = 1e5 + 10;
  26. const ll mod = 1e9 + 7;
  27. const ll INF = 1e18 + 100;
  28. const int inf = 0x3f3f3f3f;
  29. const double pi = acos(-1.0);
  30. const double eps = 1e-8;
  31. using namespace std;
  32. struct Node{
  33. int l, r, cnt;
  34. }node[maxn*40];
  35. int w[maxn];
  36. int n, m;
  37. int cas, tol, T;
  38. vector<int> vv;
  39. int a[maxn];
  40. void update(int l, int r, int &x, int y, int pos){
  41. tol++;
  42. x = tol;
  43. node[x] = node[y];
  44. node[x].cnt++;
  45. if(l == r) return;
  46. int mid = l+r>>1;
  47. if(pos <= mid)
  48. update(l, mid, node[x].l, node[y].l, pos);
  49. else
  50. update(mid+1, r, node[x].r, node[y].r, pos);
  51. }
  52. int query(int l, int r, int x, int y, int k){
  53. if(l == r)
  54. return l;
  55. int mid = l+r>>1;
  56. int cnt = node[node[y].l].cnt - node[node[x].l].cnt;
  57. if(cnt >= k)
  58. return query(l, mid, node[x].l, node[y].l, k);
  59. else
  60. return query(mid+1, r, node[x].r, node[y].r, k-cnt);
  61. }
  62. int getid(int x){
  63. return lower_bound(vv.begin(), vv.end(), x) - vv.begin()+1;
  64. }
  65. int main() {
  66. while(~scanf("%d%d", &n, &m)){
  67. vv.clear();
  68. tol = 0;
  69. mes(w, 0);
  70. for(int i = 1; i <= n; i++){
  71. scanf("%d",&a[i]);
  72. vv.push_back(a[i]);
  73. }
  74. sort(vv.begin(), vv.end());
  75. vv.erase(unique(vv.begin(), vv.end()), vv.end());
  76. for(int i = 1; i <= n;i++){
  77. int pos = getid(a[i]);
  78. update(1, n, w[i], w[i-1], pos);
  79. }
  80. while(m--){
  81. int l, r;
  82. scanf("%d%d", &l, &r);
  83. int b[4], flag = 0;
  84. if(r - l + 1 < 3){
  85. printf("-1\n");
  86. continue;
  87. }
  88. b[1] = query(1, n, w[l-1], w[r], r-l+1)-1;
  89. b[2] = query(1, n, w[l-1], w[r], r-l)-1;
  90. for(int k = r-l-1; k >= 1; k--){
  91. b[3] = query(1, n, w[l-1], w[r], k)-1;
  92. if(vv[b[1]] < vv[b[2]]+vv[b[3]]){
  93. printf("%lld\n", 1ll*vv[b[1]]+vv[b[2]]+vv[b[3]]);
  94. flag = 1;
  95. break;
  96. }
  97. for(int i = 1; i <= 2; i++)
  98. b[i] = b[i+1];
  99. }
  100. if(!flag)
  101. printf("-1\n");
  102. }
  103. }
  104. return 0;
  105. }

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. pve三种操作方式

    pve三种操作方式 ==========================================================api方式 https://192.168.1.4:8006/p ...

  2. 实验1 C语言开发环境...

    #include<stdio.h> int main(){ int days; printf("输入一个整数:\n") ; scanf("%d",& ...

  3. Vue过滤器:全局过滤器

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化. 过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持). 过滤器应该被添加在 JavaScr ...

  4. 【ABAP系列】SAP ABAP实现LOG显示的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP实现LOG显示的 ...

  5. Convolutional Neural Networks(4):Feature map size,Padding and Stride

    在CNN(1)中,我们用到下图来说明卷积之后feature maps尺寸和深度的变化.这一节中,我们讨论feature map size, padding and stride. 首先,在Layer1 ...

  6. mooc-IDEA 关联Spring&DB --011

    Local history寻找修改轨迹 右击项目->local history->show history 显示修改了哪些东西,可通过对比文件,查看修改点. put lable...类似于 ...

  7. ELK日志分析系统之logstash7.x最新版安装与配置

    2 .Logstash的简介 2.1 logstash 介绍 LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上.不同于分离的代 ...

  8. Phone-java标准类

    //project-module-package //.代表包的目录层次 package cn.learn.day01.demo01; /* 1.类是一组相关属性(成员变量)与行为(方法)的集合,对象 ...

  9. Go错误处理机制及自定义错误

    错误处理机制: 先看一段代码:看看输出什么? package mainimport "fmt" func test() { num1 := 10 num2 := 0 res := ...

  10. forEach究竟能不能改变数组的值

    forEach究竟能不能改变数组的值 :https://blog.csdn.net/ZhengKehang/article/details/81281563 初学者每次提到Array对象的时候有些烦人 ...