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 ...
随机推荐
- 跟随我在oracle学习php(16)
数据库的增删改查 增:create database [if not exists ] 数据库名 [charset 字符集] [collate 字符排序规则]: 说明: 1,if n ...
- SharePoint CU、Hotfix和SP版本的区别
1.Hotfix:通常是对一个特殊问题的修复包 2.CU(Cumulative Update):Hotfix的集合,包含从上一个SP(Service Pack)版本以来所有的Hotfix 3.SP(S ...
- checkbox和radio元素的样式设置(简易版)
html代码 //html <div> <p style="font-size:18px;margin-top:30px;color:rgba(0,0,0,0.44)&qu ...
- this的学习
面试经常被问到this的问题,每次回答都感觉回答的不尽人意,今天周六就在家好好研究this的问题 1.function定义的时候this的指向是无法确定的,执行function的时候才知道this的指 ...
- HashMap 的put方法
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] ta ...
- spring Ioc容器之使用XML配置Bean
1.项目截图 2.创建xml文件 3.打印机接口 package com.example.demo.computerTest; public interface Printer { void init ...
- 信息技术手册可视化进度报告 基于jieba的关键字提取技术
在这一篇博客之前,我已经将word文件中的内容通过爬虫的方式整理到数据库中了,但是为了前台展示的需要,还必须提取出关键字,用于检索. 我用的是jieba分词,GitHub地址:https://gith ...
- java虚拟机——垃圾回收机制
问题1:什么是垃圾回收机制? 在java的虚拟机当中,在我们进行实例化的时候,堆会给我们开辟新的空间存放实例.而由于堆,方法区是线程公有,不会像栈区(线程私有)一样随着线程的销毁而销毁.因此在java ...
- 基于springboot构建dubbo的入门demo
之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...
- python3读取MySQL-Front的MYSQL密码
python3读取MySQL-Front的MYSQL密码 python3 mysql 密码 MySQL-Front 前言 同样的套路又来了,继续尝试从配置文件中读取敏感的信息,这次轮到的是MySQL- ...