http://acm.hdu.edu.cn/showproblem.php?pid=6601

首先要贪心地想,题目要最长的边长,那么要怎么构造呢?在一段连续的区间里面,一定是拿出最长的三根出来比,这样一定是最大的(废话)。而且假如组成三角形失败的话最长的那根这次就没有用了。

考虑临界情况,也就是刚刚好不能组成三角形的时候,要在1e9内尽可能地安排多的棒子,那就不妨设为:1,1,2,3,5,8……也就是斐波那契数列。可以打出来发现在43项左右的时候已经接近1e9了。

也就是每个区间真正有用的只是最长的50根。

考虑对每个区间建立线段树,线段树里面就存当前区间最长的至多50根。

要动态管理这些区间vector实现的版本的确非常方便。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXM = 100000;
int a[MAXM + 5];
vector<int> st[(MAXM << 2) + 5]; void build(int o, int l, int r) {
if(l == r) {
st[o].resize(r - l + 1);
st[o][0] = a[l];
} else {
int m = (l + r) >> 1;
build(o << 1, l, m);
build(o << 1 | 1, m + 1, r);
st[o].resize(min(100,r - l + 1));
merge(st[o << 1].begin(), st[o << 1] .end(),
st[o << 1 | 1].begin(), st[o << 1 | 1] .end(),
st[o].begin(), greater<int>());
st[o].resize(min(50, r - l + 1));
}
} int used[MAXM], usedtop, it[MAXM]; void query(int o, int l, int r, int a, int b) {
if(a <= l && r <= b) {
used[++usedtop] = o, it[usedtop] = 0;
} else {
int m = (l + r) >> 1;
if(a <= m)
query(o << 1, l, m, a, b);
if(b >= m + 1)
query(o << 1 | 1, m + 1, r, a, b);
}
} int val[MAXM], valtop; ll answer() {
valtop = 0;
bool fail = 0;
int t = 50;
while(t-- && !fail) {
fail = 1;
int maxval = 0, maxid = 0;
for(int i = 1; i <= usedtop; ++i) {
if(it[i] < st[used[i]].size()) {
if(st[used[i]][it[i]] > maxval) {
maxval = st[used[i]][it[i]];
maxid = i;
}
fail = 0;
}
}
if(!fail) {
val[++valtop] = maxval;
++it[maxid];
}
}
for(int i = 1; i + 2 <= valtop; ++i)
if(val[i + 1] + val[i + 2] > val[i])
return (ll)val[i] + val[i + 1] + val[i + 2];
return -1;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int n, q;
while(~scanf("%d%d", &n, &q)) {
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
build(1, 1, n);
for(int i = 1; i <= q; ++i) {
int l, r;
scanf("%d%d", &l, &r);
usedtop = 0;
query(1, 1, n, l, r);
printf("%lld\n", answer());
}
}
return 0;
}

不用vector的又慢又卡内存???或许跟手动的merge有关,把这个换成STL做对照可能会更快。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int MAXM = 100000;
int a[MAXM + 5], st[(MAXM << 2) + 5][50 + 5], sttop[(MAXM << 2) + 5]; int _merge(int a[], int as, int b[], int bs, int c[]) {
int i = 1, j = 1, k = 1;
while((k <= 50) && (i <= as || j <= bs)) {
if(i > as) {
c[k] = b[j];
++j;
++k;
} else if(j > bs) {
c[k] = a[i];
++i;
++k;
} else if(a[i] >= b[j]) {
c[k] = a[i];
++i;
++k;
} else {
c[k] = b[j];
++j;
++k;
}
}
return k;
} void build(int o, int l, int r) {
if(l == r) {
sttop[o] = 1;
st[o][1] = a[l];
} else {
int m = (l + r) >> 1;
build(o << 1, l, m);
build(o << 1 | 1, m + 1, r);
sttop[o] = _merge(st[o << 1], sttop[o << 1],
st[o << 1 | 1], sttop[o << 1 | 1],
st[o]);
// printf("[%d,%d]\n", l, r);
// for(int i = 1; i <= sttop[o]; ++i) {
// printf(" %d", st[o][i]);
// }
// printf("\n\n");
}
} int used[MAXM], usedtop, it[MAXM]; void query(int o, int l, int r, int a, int b) {
if(a <= l && r <= b) {
used[++usedtop] = o, it[usedtop] = 1;
} else {
int m = (l + r) >> 1;
if(a <= m)
query(o << 1, l, m, a, b);
if(b >= m + 1)
query(o << 1 | 1, m + 1, r, a, b);
}
} int val[MAXM], valtop; ll answer() {
valtop = 0;
bool fail = 0;
int t = 50;
while(t-- && !fail) {
fail = 1;
int maxval = 0, maxid = 0;
for(int i = 1; i <= usedtop; ++i) {
if(it[i] <= sttop[used[i]]) {
if(st[used[i]][it[i]] > maxval) {
maxval = st[used[i]][it[i]];
maxid = i;
}
fail = 0;
}
}
if(!fail) {
val[++valtop] = maxval;
++it[maxid];
}
}
for(int i = 1; i + 2 <= valtop; ++i)
if(val[i + 1] + val[i + 2] > val[i])
return (ll)val[i] + val[i + 1] + val[i + 2];
return -1;
} int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int n, q;
while(~scanf("%d%d", &n, &q)) {
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
build(1, 1, n);
for(int i = 1; i <= q; ++i) {
int l, r;
scanf("%d%d", &l, &r);
usedtop = 0;
query(1, 1, n, l, r);
printf("%lld\n", answer());
}
}
return 0;
}

草,更慢,更浪费内存。让我对vector刮目相看。看来预先resize的vector是速度足够惊人的。

2019 Multi-University Training Contest 2 - 1011 - Keen On Everything But Triangle - 线段树的更多相关文章

  1. 2019牛客多校第一场 I Points Division(动态规划+线段树)

    2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...

  2. AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图

    AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...

  3. HDU - 6601 Keen On Everything But Triangle 主席树

    Keen On Everything But Triangle 感觉最近多校好多主席树的亚子,但是本人菜得很,还没学过主席树,看着队友写题就只能划水,\(WA\)了还不能帮忙\(debug\),所以深 ...

  4. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  5. 2019 Multi-University Training Contest 1 - 1011 - Function - 数论

    http://acm.hdu.edu.cn/showproblem.php?pid=6588 新学到了一个求n以内与m的gcd的和的快速求法.也就是下面的S1. ①求: $ \sum\limits_{ ...

  6. 2016 Multi-University Training Contest 5 1011 Two DP

    http://acm.hdu.edu.cn/showproblem.php?pid=5791 HDU5791 Two 题意 :两个数组,多少个不连续子串相等 思路: dp[i][j] :a串i结尾,b ...

  7. HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)

    6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...

  8. 2016 Multi-University Training Contest 3 1011【鸽巢原理】

    题解: 坐标(0,m)的话,闭区间,可能一共有多少曼哈顿距离? 2m 但是给一个n,可能存在n(n+1)/2个曼哈顿距离 所以可以用抽屉原理了 当n比抽屉的数量大,直接输出yes 不用计算 那...N ...

  9. 2019 Nowcoder Multi-University Training Contest 4 E Explorer

    线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...

随机推荐

  1. word和画图

    文档和画图收费文档:edu.51cto.com/course/course_id-4992.htmledu.51cto.com/course/course_id-4991.html

  2. python3:csv的读写

    前言快要毕业那会儿,在下编写了一个招聘网站招聘岗位的爬虫提供给前女神参考,最开始我是存到mysql中,然后在到处一份csv文件给前女神.到了参加工作后,由于经常使用excel绘制图表(谁叫公司做报表全 ...

  3. Oracle开发:常用的数据库字段类型[转]

    Oracle常用的数据库字段类型如下: 字段类型 中文说明 限制条件 其它说明 CHAR 固定长度字符串 最大长度2000 bytes VARCHAR2 可变长度的字符串 最大长度4000 bytes ...

  4. 国内4G频段划分

    国内4G频段划分 2015年   4G网络建设如火如荼地进行,换手机大家几乎都买的4G手机,那么看到如下参数怎么知道手机所支持的网络呢? SIM 1:4G TDD-LTE:TD38/39/40/41: ...

  5. windows server 2008 r2 配置ftp (FileZilla Server )

    1.需要个ftp 2.在华为云内部,用IIS,配置后如果用主动模式,客户端需要配置后客户端需要做配置才能访问,去掉√,见下图. 3.华为云的教程,配被动需要把1024以上的端口都放开,不安全! 但客户 ...

  6. ffmpeg转码指南

    Windows下面的安装: 浏览器打开https://ffmpeg.zeranoe.com/builds/ 选择好版本,位数如果不确定的话就下载32bit的,然后选择static,然后下载 下载完成后 ...

  7. leetcode-mid-sorting and searching-34 Search for a Range

    mycode   63.98% class Solution(object): def searchRange(self, nums, target): """ :typ ...

  8. sed扩展命令使用

    [root@b ~]# cat f.txt inet addr:192.168.0.110 Bcast:192.168.0.255 Mask:255.255.255.0[root@b ~]# cat ...

  9. leetcode 240搜索二维矩阵

    /** 正常的二维搜索估计要超时,本题沿着对角线搜索,然后找到第一个大于目标数字的坐标(x,y)然后搜索(>x,<y)(<x,>y)子区域: 矩阵size() 为m,n:当i& ...

  10. Selenium学习之==>ActionChainsApi接口详解

    ActionChains UI自动化测试过程中,经常遇到那种,需要鼠标悬浮后,要操作的才会元素出现的这种场景,那么我们就要模拟鼠标悬浮到某一个位置,做一系列的连贯操作,Selenium给我们提供了Ac ...