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

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

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

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

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

 1 #include <algorithm>
 2 #include<iostream>
 3 #include <cstdio>
 4 #include <vector>
 5 #include <cstring>
 6 #include<queue>
 7 using namespace std;
 8 typedef long long ll;
 9 const int maxn = 2e5 + 3;
10 int a[maxn], b[maxn];
11 int root[maxn], ls[maxn * 20], rs[maxn * 20], cnt;
12 ll  val[maxn * 20];
13 void build(int l, int r, int &i) {
14     i = ++cnt;
15     val[i] = 0ll;
16     if (l == r)
17         return;
18     int mid = l + r >> 1;
19     build(l, mid, ls[i]);
20     build(mid + 1, r, rs[i]);
21 }
22 void update(int k, int l, int r, int &i) {
23     ls[++cnt] = ls[i], rs[cnt] = rs[i], val[cnt] = val[i] + 1;
24     i = cnt;
25     if (l == r)
26         return;
27     int mid = l + r >> 1;
28     if (k <= mid)
29         update(k, l, mid, ls[i]);
30     else
31         update(k, mid + 1, r, rs[i]);
32 }
33 ll query(int u, int v, int k, int l, int r) {
34     if (l == r)
35         return l;
36     int x = val[ls[v]] - val[ls[u]];
37     int mid = l + r >> 1;
38     if (k <= x)
39         return query(ls[u], ls[v], k, l, mid);
40     else
41         return query(rs[u], rs[v], k - x, mid + 1, r);
42 }
43 int main() {
44     int n, m;
45     while (scanf("%d%d", &n, &m) != EOF) {
46         cnt = 0;
47         for (int i = 1; i <= n; i++)
48             scanf("%d", &a[i]), b[i] = a[i];
49         sort(b + 1, b + 1 + n);
50         int k = unique(b + 1, b + 1 + n) - b - 1;
51         build(1, k, root[0]);
52         for (int i = 1; i <= n; i++) {
53             int t = lower_bound(b + 1, b + 1 + k, a[i]) - b - 1;
54             t++;
55             root[i] = root[i - 1];
56             update(t, 1, k, root[i]);
57         }
58         for (int i = 1; i <= m; i++) {
59             int l, r;
60             scanf("%d%d", &l, &r);
61             int len = r - l + 1;
62             if (len < 3) {
63                 printf("-1\n");
64                 continue;
65             }
66             ll ans = -1;
67             ll x = b[query(root[l - 1], root[r], len, 1, k)];
68             ll y = b[query(root[l - 1], root[r], len - 1, 1, k)];
69             for (int i = 3; i <= len; i++) {
70                 ll z = b[query(root[l - 1], root[r], len - i + 1, 1, k)];
71                 if (x < y + z) {
72                     ans = x + y + z;
73                     break;
74                 }
75                 else {
76                     x = y;
77                     y = z;
78                 }
79             }
80             printf("%lld\n", ans);
81         }
82     }
83
84 }

转载于:https://www.cnblogs.com/sainsist/p/11328824.html

[2019杭电多校第二场][hdu6601]Keen On Everything But Triangle相关推荐

  1. 2019杭电多校第二场1009 HDU6599:求本质不同的回文串长度及数量

    hdu6599:求本质不同的回文串长度及数量 hdu6599题意: manacher+后缀自动机+倍增 $O(nlog(n))$ manacher+后缀数组+二分 $O(nlog(n))$ 回文树(回 ...

  2. 2022“杭电杯”中国大学生算法设计超级联赛 (2) 杭电多校第二场

    题目 1001 Static Query on Tree AC代码 1002 C++ to Python AC代码 1003 Copy AC代码 1005 Slayers Come AC代码 1007 ...

  3. 20190724杭电多校第二场

    没有补题..倒是又想到了1002的二分做法,比原来好写了不少,也快了不少. #include<bits/stdc++.h> using namespace std; #define p_b ...

  4. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

  5. 2018杭电多校第二场1006(容斥原理,组合数学)

    有能力时再回来解决吧= ̄ω ̄= 转载于:https://www.cnblogs.com/ldudxy/p/9521721.html

  6. 2019杭电多校第一场 Operation HDU - 6579

    题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...

  7. 2019杭电多校第九场 Rikka with Cake (hdu6681)

    题意:给出一个n * m的蛋糕,切 k 刀,每次从一个点(x,y)向 上下左右的一个方向切,问最后蛋糕被切成了几块 题解:显然,蛋糕的块数就是那么多线段的交点数 + 1.先离散,考虑向左切和向上切的, ...

  8. 2019杭电多校第一场 HDU 6599

    题解 枚举所有的回文串 注意,本质不同的回文串最多只有∣S∣|S|∣S∣个 在这些回文串中,有一些是满足要求的,我们对这些串打上标记 首先跑一个ManacherManacherManacher,然后枚 ...

  9. 2022杭电多校第二场

    1001 Static Query on Tree 题意:树上有A,B,C三个集合,求有多少个点在A某个点到C某个点的路径与A某个点到C某个点的路径的交上 把1到A集合中所有点的路径打上标记1,把1到 ...

  10. 2020杭电多校第二场 Lead of Wisdom(爆搜)

    Problem Description In an online game, "Lead of Wisdom" is a place where the lucky player ...

最新文章

  1. 微软麻将AI Suphx或引入“凤凰房”,与其他AI对打
  2. Exception in thread main java.lang.IncompatibleClassChangeError: net/sf/cglib/core/DebuggingClassW
  3. decose oracle_oracle 内存与进程
  4. spring源码分析之spring-core asm概述
  5. 珠宝管理系统java,基于jsp的珠宝首饰进销存管理系统-JavaEE实现珠宝首饰进销存管理系统 - java项目源码...
  6. k8s的网络优化(metallb)
  7. Asp.Net 4.0 SEO增强之UrlRouting
  8. plSql读取Oracle数据库中文乱码
  9. (转)动态规划和贪心算法的区别
  10. Go语言学习笔记——Go语言数据类型
  11. Windows7 USB/DVD Download Tool – U盘安装Win7工具
  12. Springboot+Vue+EasyExcel实现web页面的excel下载
  13. 快速西门子PLC入门(零基础心得版)
  14. thinkphp5.1和5.0下的中文分词
  15. 你好 同样在努力的陌生人
  16. 用计算机弹歌曲fade,抖音短视频踢脚舞是什么歌 Faded歌曲分享
  17. 使用 KubeSphere 和极狐GitLab 打造云原生持续交付系统
  18. 使用easypoi导出excel实现动态列
  19. 下载python的步骤ios_python苹果安装教程,ipad上怎么安装python?
  20. 数学建模——差分算法(求解偏微分方程)

热门文章

  1. 修改数据表DataTable某一列的类型和记录值
  2. 组合索引怎么应该怎么选取引导列?
  3. 动态生成实物文件思路
  4. `ifdef、`else、`endif 用法
  5. 牛客小白月赛3 I 排名【结构体排序/较复杂/细节】
  6. WPF 获取控件模板中的控件
  7. 站立会议07(第二次冲刺)
  8. 第八章、面向对象设计
  9. 在GridView列中动态创建几个CheckBox
  10. 跟燕十八学习PHP-第二十八天-union用法深入讲解