2019 Multi-University Training Contest 2 - 1011 - Keen On Everything But Triangle - 线段树
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 - 线段树的更多相关文章
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- HDU - 6601 Keen On Everything But Triangle 主席树
Keen On Everything But Triangle 感觉最近多校好多主席树的亚子,但是本人菜得很,还没学过主席树,看着队友写题就只能划水,\(WA\)了还不能帮忙\(debug\),所以深 ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 2019 Multi-University Training Contest 1 - 1011 - Function - 数论
http://acm.hdu.edu.cn/showproblem.php?pid=6588 新学到了一个求n以内与m的gcd的和的快速求法.也就是下面的S1. ①求: $ \sum\limits_{ ...
- 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 ...
- HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)
6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...
- 2016 Multi-University Training Contest 3 1011【鸽巢原理】
题解: 坐标(0,m)的话,闭区间,可能一共有多少曼哈顿距离? 2m 但是给一个n,可能存在n(n+1)/2个曼哈顿距离 所以可以用抽屉原理了 当n比抽屉的数量大,直接输出yes 不用计算 那...N ...
- 2019 Nowcoder Multi-University Training Contest 4 E Explorer
线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...
随机推荐
- UVa 213 信息解码 (模拟 && 二进制)
题意 :对于下面这个字符串 0,00,01,10,000,001,010,011……. 首先是长度为1的串,然后是长度为2的串,以此类推.不存在全为1的串. 你的任务是编写一个程序.首先输入一个代码头 ...
- ex1.c 补
表达式和符号运用生疏 经常少符号
- 【spring boot 学习笔记】日志相关
1. 如何启用日志? maven依赖中添加:spring-boot-starter-logging <dependency> <groupId>org.springframew ...
- 使用mysql以及连接数据库
MySQL Table of Contents 1. 安装与配置 2. 数据库与账户 3. 用户跟权限 4. 常用命令 5. 表的创建 6. 数据类型 7. 主键约束 8. 表的修改 9. 引擎(En ...
- PTA编程总结一
7-1 币值转换 (20 分) 输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式.如23108元,转换后变成“贰万叁仟壹百零捌”元.为了简化输出,用小写英文字 ...
- C# 读取Excel中的数据到DataTable中
原文地址:http://www.open-open.com/code/view/1420029490093 public DataTable ExcelToDS(string Path) { stri ...
- jquery.fileupload-image-editor.js
jquery.fileupload-image-editor.js中 _initEventHandlers: function () { this._super(); var handlers = { ...
- php curl http digest
php用curl访问有http digest验证的网址时,不能直接加在URL上,例如: http://user:pass@xxx.xxx.xxx.xxx/index.php?a=1&b=2 这 ...
- Ubuntu C/C++的编译环境
Ubuntu缺省情况下,并没有提供C/C++的编译环境,因此还需要手动安装.但是如果单独安装gcc以及g++比较麻烦,幸运的是,Ubuntu提供了一个build-essential软件包.查看该软件包 ...
- C# 截获某个域中未捕获的异常 CLR20R3 程序终止的几种解决方案
AppDomain.UnhandledException可以获的异常,却截不下来,求解 AppDomain.CurrentDomain.UnhandledException += CurrentDom ...