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 ...
随机推荐
- RESTful设计
RESTful架构: (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层: (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化& ...
- python之路-----django 自定义cookie签名
1.默认自定义cookie 在使用扩展签名时,会根据settings 配置中的 SIGNING_BACKEND 来运行加密方法,默认使用 django.core.signing.TimestampS ...
- UML介绍
UML是什么 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所 ...
- conda的使用(附带远程文件传输命令)
1 环境管理 1.1查看当前系统下的环境 conda info -e 创建新的环境 # 指定python版本为3.6,注意至少需要指定python版本或者要安装的包 conda create -n m ...
- 6 python高级数据处理和可视化
6.2. pyplot作图 1.折线图和散点图 t = np.arange(0,4,0.1) plt.plot(t,t,'o',t,t+2,t,t**2,'o') plt.show() 2.柱线图 p ...
- Linux磁盘故障案例
原因:由于另外一块磁盘不存在,但是配置文件/etc/fstab中又有挂载的配置,挂载出问题就导致这样的故障. 输入root密码进去 编辑/etc/fstab文件把箭头指向的这一行注释掉或者删除掉.然后 ...
- AsyncTask 进行耗时操作和UI 更新
相信各位对 AsyncTask 不会陌生,虽然它有如下弊端: 1. 如果在activiy内部new 一个AsyncTask, 横竖屏切换生成一个新的activity,等结果返回时,处理不好容易出现NP ...
- Note of Jieba
Note of Jieba jieba库是python 一个重要的第三方中文分词函数库,但需要用户自行安装. 一.jieba 库简介 (1) jieba 库的分词原理是利用一个中文词库,将待分词的内容 ...
- jmeter的学习路线
- Mac下安装mongdb
使用 homebrew 安装 MongoDB :brew install mongodb 这时 MongoDB 将被安装在 /usr/local/Cellar/mongodb/4.0.3_1 (我的 ...