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[ ...
随机推荐
- 部署jumpserver
参考:https://jumpserver.readthedocs.io/zh/master/setup_by_centos7.html yum update -y systemctl start f ...
- 一张图解释Linux文件系统中硬链接和软链接的区别
如图所示,硬链接与原始文件共用一个inode,但inode是不跨文件系统的(Ext3.Ext4),每个文件系统都有自己的inode列表.因此,硬链接是没办法跨文件系统的 而软链接不同,软链接相当于重新 ...
- msyql 优化之五不要
1.尽量不要有空判断的语句,因为空判断将导致全表扫描,而不是索引扫描. 对于空判断这种情况,可以考虑对这个列创建数据库默认值 //空判断将导致全表扫描 select small_id from sma ...
- Python爬虫十六式 - 第三式:Requests的用法
Requests: 让 HTTP 服务人类 学习一时爽,一直学习一直爽 Hello,大家好,我是Connor,一个从无到有的技术小白.今天我们继续来说我们的 Python 爬虫,上一次我们说到了 ...
- JPA学习(一、JPA_Hello World)
框架学习之JPA(一) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...
- [ZOJ3649]Social Net 题解
前言 这道题目珂以说是很毒瘤了. 题解 首先克鲁斯卡尔求最大生成树,输出边权和. 倍增维护四个值: 链上最大值/最小值 链向上/向下最大差值 当然祖先是肯定要维护的. 然后把一条链经LCA分成 ...
- 把网站从 http 转换成 https
基础准备: 一台服务器,一个主域名或多级域名,本次申请的免费 本次环境使用 centos6.5 + nginx1.8 + jdk1.8 + tomcat8 如果需要收费的请参考: 云盾证书服务(包年) ...
- 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)
目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...
- 编译Chrome详细步骤
编译Chrome详细步骤 文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.or ...
- 四十一、python面向对象二
A.成员: 1.字段:静态字段(每个对象都有同一字段),普通字典(每个对象都有不同的数据) 2.方法:静态方法(无需使用对象的内容),类方法,普通方法(使用对象中的数据) 3.特性:普通特性(将方法伪 ...