题目链接:传送门

思路:

  分析到处理节点时的吃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+贪心+博弈)的更多相关文章

  1. 线段树+dp+贪心 Codeforces Round #353 (Div. 2) E

    http://codeforces.com/contest/675/problem/E 题目大意:有n个车站,每个车站只能买一张票,这张票能从i+1到a[i].定义p[i][j]为从i到j所需要买的最 ...

  2. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  3. Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)

    [题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...

  4. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  5. 【arc073e】Ball Coloring(线段树,贪心)

    [arc073e]Ball Coloring(线段树,贪心) 题面 AtCoder 洛谷 题解 大型翻车现场,菊队完美压中男神的模拟题 首先钦定全局最小值为红色,剩下的袋子按照其中较大值排序. 枚举前 ...

  6. 【agc028E】High Elements(动态规划,线段树,贪心)

    [agc028E]High Elements(动态规划,线段树,贪心) 题面 AtCoder 你有一个\([1,N]\)的排列\(P\). 一个长度为\(N\)的字符串\(S\)是好的,当且仅当: 两 ...

  7. POJ.1769.Minimizing maximizer(线段树 DP)

    题目链接 /* 题意:有m个区间,问最少要多少个区间能覆盖[1,n] 注:区间要按原区间的顺序,不能用排序贪心做 设dp[i]表示最右端端点为i时的最小值 dp[e[i]]=min{dp[s[i]]~ ...

  8. 【BZOJ】1664: [Usaco2006 Open]County Fair Events 参加节日庆祝(线段树+dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1664 和之前的那题一样啊.. 只不过权值变为了1.. 同样用线段树维护区间,然后在区间范围内dp. ...

  9. POJ1769(线段树+DP)

    飞翔 题意 : 给定一个区间长度 n ,接下来给出 m 个子区间,要求最少选出多少个区间才能使得 1~n 这个区间被所选的所有子区间覆盖 分析: 首先是动态规划,dp[i]表示把最大值从1位置搞到第i ...

随机推荐

  1. spring cloud config svn仓库配置

    之前快速入门了一下spring cloud config 但是仓库用的别人博客上的git仓库,公司用的是svn项目管理中心,下面这个自己配置的时候出现的错误 You need to configure ...

  2. 带你领略Linux系统发展及版本更迭

    Linux的出现是在1991年,Linus Torvalds的学生开发的,最初的Linux是类似Unix操作系统,可用于386,486或奔腾处理器的计算机上.Linus Torvalds是一个伟人,他 ...

  3. dataset数据来源方式两种,页面展示

    这两种方式都能获取到报表类别数据. <%--ds 数据源来自JavaBean--%><model:dataset id="ds"> <model:re ...

  4. ORACLE,DECODE函数和排名函数DENSE_RANK函数的使用

    这几天写一个报表的页面,从很恶心的数据结构中做一个聚合函数的查询,结构大概是这个样子的: 所以有:对数据group by t.id,t.name.t.course 这样三层排序,然后用函数去取值. d ...

  5. 开发一个简单的chrome插件-解析本地markdown文件

    准备软件环境 1. 软件环境 首先,需要使用到的软件和工具环境如下: 一个最新的chrome浏览器 编辑器vscode 2. 使用的js库 代码高亮库:prismjs https://prismjs. ...

  6. git常用命令学习笔记

    安装好git之后即可使用git来管理项目了,鼠标右键点击 git bash出现命令黑窗口,接下来执行git指令即可. https://git-scm.com/book/zh/v2 以下整理了git常用 ...

  7. redis应用--HyperLogLog

    如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现? 如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器 ...

  8. flink基础教程读书笔记

    数据架构设计领域发生了重大的变化,基于流的处理是变化的核心. 分布式文件系统用来存储不经常更新的数据,他们也是大规模批量计算所以来的数据存储方式. 批处理架构(lambda架构)实现计数的方式:持续摄 ...

  9. 字符串及其操作,字符的Unicode编码

    plainText=input('message:') for c in plainText: print(chr(ord(c)-3),end='') plainText=input('message ...

  10. int 跟 Integer 的关系

    Integer是对象 Int是类型 比如 boolean 和Boolean就也不一样,long和Long等等 作为参数传递时要注意 要进行转换如下 int到Integer: int a=3; Inte ...