Codeforces1099F. Cookies(线段树+dp+贪心+博弈)
题目链接:传送门
思路:
分析到处理节点时的吃cookie的顺序了,然鹅不会用线段树维护前缀和。技术门槛QAQ。。。
很容易想到可以从root开始搜索,每次深入消耗时间2*边权w。
然后对于深入到点u开始返回的话,想要尽量多地吃cookie,就要贪心地选择用时短的cookie,也就是:
当前节点为u,剩余时间为val时,最多能在1-u这条链上吃到多少个cookie。
一共有1e6个节点,所以这个贪心策略的实现复杂度要压到log级别。。。好难不会。
思路参考:Dream_maker_yk的博客
线段树维护前缀和。
首先我们以时间ti为坐标向线段树中插入节点。保存两个值,把子树吃光所用的总时间sum,子树中的cookie总数cnt。
然后根据剩余时间val查询,如果左子树的sum比val小,那么说明左子树可以吃光,那么查询结果就是:
cnt左子树 + 对右子树查询val - sum左子树
这样我们就可以用logn的时间实现贪心策略了。
然后考虑到Vasya会干扰我们,所以应题目要求,我们要求在Vasya干扰得最好的情况下,能吃到的最大的cookie数量。
最差的情况就是Vasya每次深入后都把最好的子树f1给办掉了,那么我们只能选次好的子树f2。
因为每个节点都可能返回,所以回溯当前节点的最多cookie数ans。而当前节点的最多cookie数可能是吃到当前节点为止,也可能是吃到当前节点的子树,所以ans = max(ans,f2)。
特别地,因为Mitya是先手,所以root的子树不会被办,ans = max(ans,f1)。
代码:
#include <bits/stdc++.h>
#define lson (pos << 1)
#define rson (pos << 1 | 1) using namespace std;
typedef long long ll;
const int MAX_N = 1e6 + ; struct Edge{
int v;
ll w;
};
ll x[MAX_N], t[MAX_N];
vector <Edge> g[MAX_N]; ll sum[MAX_N<<], cnt[MAX_N<<]; void update(int pos, int l, int r, ll xi, ll ti) {
sum[pos] += xi*ti;
cnt[pos] += xi;
if (l == r)
return;
int mid = (l + r) >> ;
if (ti <= mid)
update(lson, l, mid, xi, ti);
else
update(rson, mid+, r, xi, ti);
} ll query(int pos, int l, int r, ll val) {
if (l == r)
return min(cnt[pos], val/l);
int mid = (l + r) >> ;
if (sum[lson] <= val)
return cnt[lson] + query(rson, mid+, r, val - sum[lson]);
else
return query(lson, l, mid, val);
} ll dfs(int u, ll res) {
update(, , 1e6, x[u], t[u]);
ll ans = query(, , 1e6, res);
ll f1 = , f2 = ;
for (const auto &tmp : g[u]) {
int v = tmp.v;
ll w = tmp.w;
if (res < *w)
continue;
ll f = dfs(v, res - *w);
if (f > f1)
f2 = f1, f1 = f;
else if (f > f2)
f2 = f;
}
update(, , 1e6, -x[u], t[u]);
if (u == )
return max(ans, f1);
else
return max(ans, f2);
} int main()
{
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
ll T;
cin >> n >> T;
for (int i = ; i <= n; i++)
cin >> x[i];
for (int i = ; i <= n; i++)
cin >> t[i];
for (int u = ; u <= n; u++) {
int v;
ll w;
cin >> v >> w;
g[v].push_back((Edge){u, w});
} ll ans = dfs(, T); cout << ans << endl;
return ;
}
Codeforces1099F. Cookies(线段树+dp+贪心+博弈)的更多相关文章
- 线段树+dp+贪心 Codeforces Round #353 (Div. 2) E
http://codeforces.com/contest/675/problem/E 题目大意:有n个车站,每个车站只能买一张票,这张票能从i+1到a[i].定义p[i][j]为从i到j所需要买的最 ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- 【arc073e】Ball Coloring(线段树,贪心)
[arc073e]Ball Coloring(线段树,贪心) 题面 AtCoder 洛谷 题解 大型翻车现场,菊队完美压中男神的模拟题 首先钦定全局最小值为红色,剩下的袋子按照其中较大值排序. 枚举前 ...
- 【agc028E】High Elements(动态规划,线段树,贪心)
[agc028E]High Elements(动态规划,线段树,贪心) 题面 AtCoder 你有一个\([1,N]\)的排列\(P\). 一个长度为\(N\)的字符串\(S\)是好的,当且仅当: 两 ...
- POJ.1769.Minimizing maximizer(线段树 DP)
题目链接 /* 题意:有m个区间,问最少要多少个区间能覆盖[1,n] 注:区间要按原区间的顺序,不能用排序贪心做 设dp[i]表示最右端端点为i时的最小值 dp[e[i]]=min{dp[s[i]]~ ...
- 【BZOJ】1664: [Usaco2006 Open]County Fair Events 参加节日庆祝(线段树+dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1664 和之前的那题一样啊.. 只不过权值变为了1.. 同样用线段树维护区间,然后在区间范围内dp. ...
- POJ1769(线段树+DP)
飞翔 题意 : 给定一个区间长度 n ,接下来给出 m 个子区间,要求最少选出多少个区间才能使得 1~n 这个区间被所选的所有子区间覆盖 分析: 首先是动态规划,dp[i]表示把最大值从1位置搞到第i ...
随机推荐
- spring cloud config svn仓库配置
之前快速入门了一下spring cloud config 但是仓库用的别人博客上的git仓库,公司用的是svn项目管理中心,下面这个自己配置的时候出现的错误 You need to configure ...
- 带你领略Linux系统发展及版本更迭
Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...
- dataset数据来源方式两种,页面展示
这两种方式都能获取到报表类别数据. <%--ds 数据源来自JavaBean--%><model:dataset id="ds"> <model:re ...
- ORACLE,DECODE函数和排名函数DENSE_RANK函数的使用
这几天写一个报表的页面,从很恶心的数据结构中做一个聚合函数的查询,结构大概是这个样子的: 所以有:对数据group by t.id,t.name.t.course 这样三层排序,然后用函数去取值. d ...
- 开发一个简单的chrome插件-解析本地markdown文件
准备软件环境 1. 软件环境 首先,需要使用到的软件和工具环境如下: 一个最新的chrome浏览器 编辑器vscode 2. 使用的js库 代码高亮库:prismjs https://prismjs. ...
- git常用命令学习笔记
安装好git之后即可使用git来管理项目了,鼠标右键点击 git bash出现命令黑窗口,接下来执行git指令即可. https://git-scm.com/book/zh/v2 以下整理了git常用 ...
- redis应用--HyperLogLog
如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现? 如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器 ...
- flink基础教程读书笔记
数据架构设计领域发生了重大的变化,基于流的处理是变化的核心. 分布式文件系统用来存储不经常更新的数据,他们也是大规模批量计算所以来的数据存储方式. 批处理架构(lambda架构)实现计数的方式:持续摄 ...
- 字符串及其操作,字符的Unicode编码
plainText=input('message:') for c in plainText: print(chr(ord(c)-3),end='') plainText=input('message ...
- int 跟 Integer 的关系
Integer是对象 Int是类型 比如 boolean 和Boolean就也不一样,long和Long等等 作为参数传递时要注意 要进行转换如下 int到Integer: int a=3; Inte ...