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[ ...
随机推荐
- UML——用例视图
用例视图中交互功能部分被称为用例. 参与者 作为外部用户与系统发生交互作用,这是参与者的特征. 在系统的实际运作中,一个实际用户可能对应系统的多个参与者.不同的用户也可以只对应于一个参与者,从 ...
- C++中string常用函数用法总结
string(s小写)是C++标准库中的类,纯C中没有,使用时需要包含头文件#include<string>,注意不是<string.h>,下面记录一下string中比较常用的 ...
- Mybatis学习笔记之---多表查询(2)
Mybatis多表查询(2) (一)举例 用户和角色 一个用户可以有多个角色,一个角色可以赋予多个用户 (二)步骤 1.建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系.需要使用中间表,中 ...
- Android使用SDKManager下载SDK速度慢 容易丢包和异常的解决办法
第一步, SDK Manager启动之后,会先解析一些google的xml文件,会在Log里面打印出一些日志信息. 解析完之后,把日志全部拷贝到一个记事本里(这一步是因为日志窗口不支持查找),在里面查 ...
- Android网络技术之WebView常用方法
public class WebViewTest extends Activity { private WebView wv; private EditText et; ...
- vue 路由懒加载 resolve vue-router配置
使用方法 component:resolve => require(['@/pages/About'],resolve) //"@"相当于".." 懒加载 ...
- Python爬取中文页面的时候出现的乱码问题
一.读取返回的页面数据 在浏览器打开的时候查看源代码,如果在头部信息中指定了UTF-8 那么再python代码中读取页面信息的时候,就需要指定读取的编码方式: response.read().deco ...
- idea中查看一个类的调用用和被调用用关系
- 一、基础篇--1.1Java基础-String、StringBuilder、StringBuffer
String.StringBuilder.StringBuffer 主要区别在两点上: 速度效率上对比:StringBuilder>StringBuffer>String 线程安全上来说: ...
- 怎么用jira写bug
工具/原料 有网的电脑 方法/步骤1: 打开公司给的访问JIRA的链接,输入公司给你注册的账号和密码,点击登录 方法/步骤2: 点击JIRA主菜单上的“创建”,进入编辑bug界面 方法/步骤3: 项目 ...