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[ ...
随机推荐
- linux-文件系统-5
cat /proc/partions cat /proc/mounts mount [options] -o [option] -t 文件类型 设备 挂载目录 设备: (1)设备文件:例如/dev/s ...
- js dom 添加类
var sheng = document.getElementById("sheng"); ; sheng.onclick = function() { if(this.paren ...
- 牛客网 Chess ( 博弈 && 奇异局势 )
题目链接 分析 : 发现如果一开始就在边界或者位于对角线的位置上肯定是必胜态 从终点逆推,画出胜负表格,填一填,就会发现和奇异局势的前几项一样 然后打个奇异局势的表就能 AC 了 #include&l ...
- strcat()与strcpy()用法
1.strcpy (1)原型 extern char *strcpy(char *dest,char *src); (2)用法 #include <cstring> (3)功能 把src所 ...
- [BZOJ2839]:集合计数(组合数学+容斥)
题目传送门 题目描述 .(是质数喔~) 输入格式 一行两个整数N,K. 输出格式 一行为答案. 样例 样例输入: 3 2 样例输出: 样例说明 假设原集合为{A,B,C} 则满足条件的方案为:{AB, ...
- yum install ntp 报错:Error: Package: ntp-4.2.6p5-25.el7.centos.2.x86_64 (base)
redhat7 在安装ntp时报如下错误 Error: Package: ntp-4.2.6p5-25.el7.centos.2.x86_64 (base) Requires: ntpdate = 4 ...
- C# DataTable 增加行与列
亲测有用的方法 DataTable AllInfos = new DataTable();//生成一个表格 DataColumn typeColumn = new DataColumn();//建一个 ...
- C# 读取Excel中的数据到DataTable中
原文地址:http://www.open-open.com/code/view/1420029490093 public DataTable ExcelToDS(string Path) { stri ...
- douyu danmu test c#
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.Regul ...
- EDM案例讲解:Mouth foods的EDM邮件营销
你可能没有听说过Mouth foods,它是一个美味产品的在线市场.作为一个日益增长的企业,他们知道电子邮件的重要性,因为在此之前他们通过电子邮件真正找到了企业品牌中的自我,这就是为什么他们认为电子邮 ...