CF980-Div2-D
题意
从 \(1\) 开始决策,若选当前数,则累计贡献 \(a[i]\) 并跳到 \(j\) 位置,\(j\) 是 \(\lt i\) 且没有决策过(包括选了和没选)的最大位置(操作 \(1\))。若不选当前数,则跳转到 \(j\) 位置,\(j\) 是 \(\le b[i]\) 且没有决策过(包括选了和没选)的最大位置(操作 \(2\))。求最大得分。
思路
看到的第一眼以为是动态规划,想了一下觉得dp顺序太难搞了,好像也会有后效性。(但据说dp能做?)
考场上猜了一个结论:应该可以找一个拐点,到达之后就一直用操作 \(1\)。下来一看这个结论是对的。
感性理解一下,就是用操作 \(2\) 一定是为了能拿更远处的数,当操作 \(2\) 不再优后,我们只用操作 \(1\) 就是最优的。
设我们用操作 \(2\) 放弃了 \(p_1,p_2,\dots,p_m\),最后拐点是 \(i\)。(也是最远点,因为不是最远点的话肯定不优)
所以答案就是 \(\max_{1 \le i \le n} presum[i] - \sum_{1 \le j \le m}a[p_j]\)。
现在问题转化成了对于每个 \(i\),我们要最小化 \(\sum_{1 \le j \le m}a[p_j]\),即 “放弃贡献”。
这些点并不是按编号大小依次放弃的,也存在顺序问题,考虑构图。
我们连边 \((i \to i - 1, 0), (i \to b[i], a[i])\)。最后得到一张带权有向图。
用 \(dijkstra\) 跑一遍,\(dis[i]\) 就是最小的 “放弃贡献”。
#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=(r);++i)
#define G(i,r,l) for(int i(r);i>=(l);--i)
#define int ll
using namespace std;
using ll = long long;
const int N = 4e5 + 5;
const int inf = 0x3f3f3f3f3f3f3f3f;
struct node{
int v, w, ne;
}e[N << 1];
int T, n, idx = 0;
int a[N], b[N], dis[N], sm[N], first[N];
bool vis[N];
void add(int x, int y, int z){
e[++ idx] = (node){y, z, first[x]};
first[x] = idx;
}
priority_queue<pair<int, int> > q;
int solve(){
cin >> n;
F(i, 1, n) first[i] = vis[i] = 0, dis[i] = inf;
dis[1] = idx = 0;
F(i, 1, n) cin >> a[i], sm[i] = sm[i - 1] + a[i];
F(i, 1, n) cin >> b[i], add(i, b[i], a[i]);
F(i, 2, n) add(i, i - 1, 0);
q.push({0, 1});
while(q.size()){
int u = q.top().second;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = first[u]; i; i = e[i].ne){
int v = e[i].v, w = e[i].w;
if(dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
q.push({-dis[v], v});
}
}
}
int mx = 0;
F(i, 1, n) mx = max(mx, sm[i] - dis[i]);
return mx;
}
signed main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> T;
while(T --){
cout << solve() << '\n';
}
return fflush(0), 0;
}
总结
首先是要大胆猜结论,好验证的话就拿小样例验证一下,更重要的是利用这个性质做进一步的处理。
对于转移顺序没有明显规律,视具体数据的题,考虑构图。
遇到最大化问题,尝试转成最小化问题,或许就会有更多发挥空间,比如用 dijkstra 跑最短路,二分之类的。
参考博客
Codeforces Round #980 Editorial - Codeforces
Codeforces Round 980 div2 个人题解(A~D) - ExtractStars - 博客园
CF980-Div2-D的更多相关文章
- bc#54 div2
用小号做的div2 A:竟然看错了排序顺序...白白WA了两发 注意读入一整行(包括空格):getline(cin,st) [gets也是资瓷的 #include<iostream> us ...
- $('div a') 与$('div>a'),.div+.div2与.div~.div2
$('div a'):div标签下所有层次a元素的jquery对象 $('div>a'):div标签下子元素层次a元素的jquery对象 <body> <div class=' ...
- SRM 657 DIV2
-------一直想打SRM,但是感觉Topcoder用起来太麻烦了.题目还是英文,不过没什么事干还是来打一打好了.但是刚注册的号只能打DIV2,反正我这么弱也只适合DIV2了.. T1: 题目大意: ...
- CodeForces Round 192 Div2
This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...
- Codeforce Round #211 Div2
真的是b到不行啊! 尼玛C题一个这么简单的题目没出 aabbccddee 正确的是aabccdee 我的是 aabcdee 硬是TM的不够用,想半天还以为自己的是对的... A:题... B:题. ...
- Topcoder srm 632 div2
脑洞太大,简单东西就是想复杂,活该一直DIV2; A:水,基本判断A[I]<=A[I-1],ANS++; B:不知道别人怎么做的,我的是100*N*N;没办法想的太多了,忘记是连续的数列 我们枚 ...
- TopCoder 603 div1 & div2
div2 250pts MiddleCode 题意:s串长度为奇数时,将中间字符取掉并添加到t末尾:长度为偶数时,将中间两个较小的字符取掉并添加到末尾. 分析:直接做,学习了一下substr(s, p ...
- TopCoder 649 div1 & div2
最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实 ...
- 220 DIV2 B. Inna and Nine
220 DIV2 B. Inna and Nine input 369727 output 2 input 123456789987654321 output 1 题意:比如例子1:369727--& ...
- Codeforces #245(div2)
A:A. Points and Segments (easy) 题目看了n久,開始认为尼玛这是div2的题目么,题目还标明了easy.. 意思是给你一n个点,m个区间,在n个点上放蓝球或者红球,然后让 ...
随机推荐
- Maven经验分享(五)Maven拷贝资源
上一章介绍使用ant拷贝资源,这里介绍maven拷贝资源,使用maven-resources-plugin插件. <plugin> <groupId>org.apache.ma ...
- inline,static inline
https://blog.csdn.net/A_BCDEF_/article/details/89485894 inline 函数被调用时,需要出栈入栈.当函数频繁被调用时,则不断地有函数出栈入栈,会 ...
- DMS:直接可微的网络搜索方法,最快仅需单卡10分钟 | ICML 2024
Differentiable Model Scaling(DMS)以直接.完全可微的方式对宽度和深度进行建模,是一种高效且多功能的模型缩放方法.与先前的NAS方法相比具有三个优点:1)DMS在搜索方面 ...
- check Str's Character appearence frequence is ge 1
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; import java.util.*; public class HackerRa ...
- 线性dp:LeetCode674. 最长连续递增序列
LeetCode674. 最长连续递增序列 阅读本文之前,需要先了解"动态规划方法论",这在我的文章以前有讲过 链接:动态规划方法论 本文之前也讲过一篇文章:最长递增子序列,这道题 ...
- mybatis-plus批量增加、批量修改样例+建表语句+postman接口
使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是"新增"和"修改"方法是对一条数据进行处理的,如果有一万条数据就会和数据库 ...
- mysql事务隔离级别及MVCC 原理
一.事务的隔离级别 为了保证事务与事务之间的修改操作不会互相影响,innodb希望不同的事务是隔离的执行的,互不干扰. 两个并发的事务在执行过程中有 读读.读写(一个事务在读某条数据的同时另一个事务在 ...
- 详解JVM 内存结构与实战调优总结
详解JVM 内存结构与实战调优总结 GC优化案例做个总结: 1在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间.我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过GC优化 ...
- 在 windows 上部署 django
环境 Django 4.1.7 python 3.11.2 Apache 2.4.46 1:安装配置 Apache 1.1:下载 Apache Apache官方下载链接 按照系统版本选择对应的,以下是 ...
- 合合信息旗下启信宝与鹏城实验室达成数据托管合作,“AI靶场”让数据管理更精准
合合信息旗下启信宝与鹏城实验室达成数据托管合作,"AI靶场"让数据管理更精准 数字经济时代,数据已成为新型生产要素.通过"数据托管"等形式对数据进行集中管理 ...