[CCC2019] Tourism题解
我们先考虑一下拿部分分:
subtask1
考虑因为 \(n < 2k\) ,那么我们的划分一定是从中间某个地方裁开,且满足 \(k\) 的条件的,我们发现当划分点在 \([n\ mod\ k,k]\)时满足条件,那么我们只需要维护一个前缀最大值和后缀最大值就好了。
for(int i = 1;i <= n;++i)
pre[i] = std::max(pre[i - 1],a[i]);
for(int i = n;i >= 1;--i)
s[i] = std::max(s[i + 1],a[i]);
ll ans = 0;
for(int i = n % k ;i <= k;++i)
ans = std::max(ans,1ll * pre[i] + s[i + 1]);
std::cout<<ans<<std::endl;
subtask2
我们发现这一档的分的关键是 \(k\) 很小,那么我们先轻松就能想到一个朴素的 \(dp\) ,我们设 \(f_i\) 为以 \(i\) 处为结尾的划分的答案最大值。为了满足转移次数最小,我们每次转移都要附上一个较大的代价 \(INF\) 。
所以转移方程为 \(f_i = max_{j = max(0,i - k + 1)}(f_j + p(j + 1,i)) - INF,p(x,y) = max_{i = x} ^ y a_i\) 。
最后我们发现转移次数我们是可以计算出来的,我们为 \(f_n\) 加上 \(\lfloor\frac{n}{k}\rfloor + [n \ mod\ k > 0] * INF\) 就好了。
for(int i = 1;i <= n;++i)
f[i] = -9e18;
// std::cout<<f[0]<<std::endl;
for(int i = 1;i <= n;++i){
ll ma = a[i];
ll m = std::max((ll)0,i - k + 1);
f[0] = 0;
for(int j = i;j >= m;--j){
ma = std::max(a[j],ma);
f[i] = std::max(1ll * f[j - 1] + ma - INF,f[i]);
}
// std::cout<<f[i] + (i / k + (i % k > 0)) * INF<<std::endl;
}
std::cout<<1ll * f[n] + 1ll * (n / k + (n % k > 0)) * INF<<std::endl;
all subtask
我们考虑 \(p(x,y)\) 是一个较难处理的点,我们可以使用单调栈来处理他。
即我们依次向右扩展当前节点,并维护最大值的阶段。
我们需要一个可以处理区间修改,区间查询最大值的数据结构,线段树。
但是要注意一个最大值区间所对应的贡献区间要向左移一位。
// Problem: P6647 [CCC 2019] Tourism
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6647
// Memory Limit: 128 MB
// Time Limit: 4000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define N 1000005
const ll INF = 1e12;
ll n,k;
int a[N];
ll f[N];
struct seg{int l,r;ll v,tag;}t[N * 6];
ll st[N],tp;
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define mid ((l + r) >> 1)
inline void build(int u,int l,int r){
t[u].l = l;
t[u].r = r;
if(l == r)
return ;
build(ls(u),l,mid);
build(rs(u),mid + 1,r);
}
inline void up(int u){
t[u].v = std::max(t[ls(u)].v,t[rs(u)].v);
}
inline void push_down(int u){
if(t[u].tag){
t[ls(u)].tag += t[u].tag;
t[ls(u)].v += t[u].tag;
t[rs(u)].tag += t[u].tag;
t[rs(u)].v += t[u].tag;
t[u].tag = 0;
}
}
inline void md(int u,int tl,int tr,ll p){
// std::cout<<u<<" "<<t[u].l<<" "<<t[u].r<<" "<<tl<<" "<<tr<<" "<<p<<std::endl;
ll l = t[u].l,r = t[u].r;
if(tl <= l && r <= tr){
t[u].v += p;
t[u].tag += p;
return ;
}
push_down(u);
if(tl <= mid)
md(ls(u),tl,tr,p);
if(tr > mid)
md(rs(u),tl,tr,p);
up(u);
}
inline ll find(int u,int tl,int tr){
ll ans = -9e18;
push_down(u);
int l = t[u].l,r = t[u].r;
if(tl <= l && r <= tr)
return t[u].v;
if(tl <= mid)
ans = std::max(find(ls(u),tl,tr),ans);
if(tr > mid)
ans = std::max(find(rs(u),tl,tr),ans);
return ans;
}
int main(){
scanf("%lld%lld",&n,&k);
for(int i = 1;i <= n;++i)
scanf("%lld",&a[i]);
build(1,0,n);
for(int i = 1;i <= n;++i){
while(tp && a[st[tp]] <= a[i]){
if(a[st[tp]] == a[i]){--tp;continue;}
md(1,st[tp - 1],st[tp] - 1,a[i] - a[st[tp]]);//[st[tp] + 1,st[tp + 1]]向左移一位
--tp;
}
st[++tp] = i;
md(1,i - 1,i - 1,f[i - 1] + a[i]);
ll ans = find(1,std::max(i - k,(ll)0),i - 1);
f[i] = ans - 1ll * INF;
}
// for(int i = 1;i <= n;++i)
// std::cout<<f[i] + (i - 1 + k) / k * INF<<std::endl;
std::cout<<f[n] + (n - 1 + k) / k * INF;
}
[CCC2019] Tourism题解的更多相关文章
- EOJ Monthly 2019.2 题解(B、D、F)
EOJ Monthly 2019.2 题解(B.D.F) 官方题解:https://acm.ecnu.edu.cn/blog/entry/320/ B. 解题 单测试点时限: 2.0 秒 内存限制: ...
- 「ZJOI2019」&「十二省联考 2019」题解索引
「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...
- AtCoder ExaWizards 2019 简要题解
AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...
- [题解][Codeforces]Good Bye 2019 简要题解
构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...
- Atcoder Yahoo Programming Contest 2019 简要题解
A-C 直接放代码吧. A int n,k; int main() { n=read();k=read(); puts(k<=(n+1)/2?"YES":"NO&q ...
- CSP-S 2019 简要题解
从这里开始 又考炸了,sad.....明年应该在准备高考了,考完把坑填了好了. 一半题都被卡常,qswl.[我汤姆要报警.jpg] dfs 怎么这么慢呀,sad..... i7 牛逼! 写的比较混乱, ...
- CF round 623 Div.1D Tourism 题解
题目链接:https://codeforces.com/contest/1314/problem/D 大意: \(n\) 个顶点的有向图,顶点编号为 \(1\) 到 \(n\),任意两个不同的顶点 \ ...
- P5290 [十二省联考2019]春节十二响
题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...
- HNOI2019 简要题解
HNOI 2019 简要题解 没想到自己竟也能有机会写下这篇题解呢. LOJ Luogu Day1T1 鱼 枚举\(AD\)两点后发现\(BC\)与\(EF\)相对独立,因此只需要计算合法的\(BC\ ...
随机推荐
- 【二食堂】Beta - 发布声明
Beta - 发布声明 新功能 在Beta阶段,图谱方面的新功能有:自定义关系的添加与删除.实体查找.实体名称的修改.实体之间关系的修改.新增了项目创建与删除功能,此外还增加了好友系统,可以实现好友的 ...
- 回应:Alpha深度评测
零.说明 本篇博客是针对博客沉舟侧畔千帆过,病树前头万木春--对[题士]产品的深度测评与解析的回应,用以说明『题士』开发团队的观点.改进计划等 感谢HansBug.CookieLau助教及各位老师.测 ...
- BUAA2020软工作业(四)——结对项目
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力,团队协作能力 这个作业在哪 ...
- 设计的MOS管三极管简单开关电路驱动能力不够1
您需要 登录 才可以下载或查看,没有帐号?注册 x . ?& P' U5 r/ ~& `: B 用AOD409设计的开关电路为什么驱动能力不够,请大家帮忙分析一下原因啊.这个电路作用就 ...
- 超级好用的轻量级JSON处理命令jq
1 简介 jq是一个轻量级的命令行工具,让你可以非常方便地处理JSON数据,如切分.过滤.映射.转化等,就像sed.awk.grep文本处理三剑客一样.jq是用C写的,没有运行时依赖,你可以直接下载可 ...
- 2021 CCPC女生赛
newbie,A了五题铜牌收工 比赛时和队友悠哉游哉做题,想着干饭,最后幸好没滚出铜尾. 贴一下比赛过的代码 A题 签到 队友A的,判断正反方向序列是否符合要求 /*** * @Author: _Kr ...
- HTML+CSS基础(HTML篇)
引言 在日常开发Android中,很多时候会遇到和WebView打交道,对CSS HTML JS不是很清楚的话是完不成一些功能的,本篇开始学习HTML,文章的主要内容是总结了慕课网中,HTML+CSS ...
- hdu 5185 Equation(分析+DP)
题意: Gorwin is very interested in equations. Nowadays she gets an equation like thisx1+x2+x3+⋯+xn=n, ...
- ELK集群之grafana(8)
Grafana的安装和读取ES数据 模拟es数据产生sjgtest.py import time import datetime from elasticsearch import Elasticse ...
- 攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup
攻防世界 WEB 高手进阶区 csaw-ctf-2016-quals mfw Writeup 题目介绍 题目考点 PHP代码审计 git源码泄露 Writeup 进入题目,点击一番,发现可能出现git ...