题目地址:CF1099F Cookies

树形dp套树形数据结构

对每个节点 \(i\) ,分两步进行:

1.令 \(f_i\) 为Mitya在节点 \(i\) 停止游戏最多可以吃到多少块饼干

我们可以进行一次dfs,用一个树形数据结构(树状数组、线段树、平衡树)来维护从树根节点 \(1\) 到节点 \(i\) 经过的路径上所有节点的“属性二元组”—— \((t_i,x_i)\) ,为了吃到更多块饼干,应该尽量吃 \(t_i\) 小的饼干。

以树状数组为例。由于 \(1≤t_i≤10^6\) ,直接在值域上建立两个树状数组(当然可以先用 \(O(n\ log\ n)\) 的时间离散化,不过此题不必要),一个记录时间 \(ct\) ,一个记录个数 \(cx\) 。dfs到节点 \(i\) 时,首先执行add操作,在 \(ct\) 的位置 \(t_i\) 上加 \(t_ix_i\) ,同时在 \(cx\) 的位置 \(t_i\) 上加 \(x_i\) 。在 \(ct\) 上二分查找 \(ask_{ct}(k)≤T-2S\) 的最大值,其中 \(S\) 为从树根节点 \(1\) 到节点 \(i\) 所需的时间,一来一回所以需要两倍的 \(S\) 。那么 \(f_i\) 的值为在 \(cx\) 上 \(ask_{cx}(k)\) 与剩下时间 \(T-2S-ask_{ct}(k)\) 除以后一个吃单块饼干的时间 \(k+1\) 向下取整后的值之和(当然若 \(k=m\) 则不需要加上后面的部分)。dfs回溯的时候进行类似操作即可。

2.考虑Vasya的干扰,由于Vasya可以删除节点 \(i\) 与 \(i\) 的子节点之间的边,为了删除的有意义,就必须要删掉节点 \(i\) 的所有子节点中结果最大的节点。

因此,令 \(m1_i,m2_i\) 分别为在以节点 \(i\) 为根的子树中除节点 \(i\) 自己外结果的最大值和非严格次大值,特别的,若不存在次大值, \(m2_i=0\)

令 \(dp_i\) 为按照游戏规则在以节点 \(i\) 为根的子树中,Mitya在某一个节点停止游戏可以吃到的饼干数的最大值

显然,若节点 \(i\) 为根节点 \(1\) ,由于Mitya先进行操作,因此 \(dp_i=max(f_i,m1_i)\)

否则,\(dp_i=max(f_i,m2_i)\)

\(dp_1\) 即为所求

时间复杂度 \(O(n\ log^2\ maxT)\)

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 100006, M = 1000006;
ll n, m, T, x[N], t[N], f[N], ct[M], cx[M], m1[N], m2[N], dp[N];
vector<pair<int, ll> > e[N];

void addct(int a, ll k) {
    while (a <= m) {
        ct[a] += k;
        a += a & -a;
    }
}

ll askct(int a) {
    ll ans = 0;
    while (a) {
        ans += ct[a];
        a -= a & -a;
    }
    return ans;
}

void addcx(int a, ll k) {
    while (a <= m) {
        cx[a] += k;
        a += a & -a;
    }
}

ll askcx(int a) {
    ll ans = 0;
    while (a) {
        ans += cx[a];
        a -= a & -a;
    }
    return ans;
}

void dfs(int a, ll S) {
    addct(t[a], t[a] * x[a]);
    addcx(t[a], x[a]);
    int l = 1, r = m + 1;
    while (l < r) {
        int mid = (l + r) >> 1;
        if (askct(mid) <= T - (S << 1)) l = mid + 1;
        else r = mid;
    }
    int k = l - 1;
    f[a] = askcx(k);
    if (k != m) f[a] += (T - (S << 1) - askct(k)) / (k + 1);
    for (unsigned int i = 0; i < e[a].size(); i++)
        dfs(e[a][i].first, S + e[a][i].second);
    addct(t[a], -t[a] * x[a]);
    addcx(t[a], -x[a]);
}

void dfs(int a) {
    for (unsigned int i = 0; i < e[a].size(); i++) {
        int y = e[a][i].first;
        dfs(y);
        if (dp[y] >= m1[a]) {
            m2[a] = m1[a];
            m1[a] = dp[y];
        } else if (dp[y] >= m2[a]) m2[a] = dp[y];
    }
    if (a == 1) dp[a] = max(f[a], m1[a]);
    else dp[a] = max(f[a], m2[a]);
}

int main() {
    cin >> n >> T;
    for (int i = 1; i <= n; i++) scanf("%lld", &x[i]);
    for (int i = 1; i <= n; i++) {
        scanf("%lld", &t[i]);
        m = max(m, t[i]);
    }
    for (int i = 2; i <= n; i++) {
        int p;
        ll l;
        scanf("%d %lld", &p, &l);
        e[p].push_back(make_pair(i, l));
    }
    dfs(1, 0);
    dfs(1);
    cout << dp[1] << endl;
    return 0;
}

CF1099F Cookies的更多相关文章

  1. scrapy cookies:将cookies保存到文件以及从文件加载cookies

    我在使用scrapy模拟登录新浪微博时,想将登录成功后的cookies保存到本地,下次加载它实现直接登录,省去中间一系列的请求和POST等.关于如何从本次请求中获取并在下次请求中附带上cookies的 ...

  2. ASP.Net MVC Session和Cookies的简单使用

    目标:用Session和Cookies实现登陆信息保存和展现 Cookies实现: Controller: //把登陆用户名存到cookies中 HttpCookie cook = new HttpC ...

  3. Webform(六)——登录状态保持(Cookies内置对象)

    用户用浏览器访问一个网站,由于采用的http的特性,Web服务器并不能知道是哪一个用户正在访问,但一些网站,希望能够知道访问者的一些信息,例如是不是第一次访问,访问者上次访问时是否有未做完的工作,这次 ...

  4. [LeetCode] Assign Cookies 分点心

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  5. jquery缓存使用jquery.cookies.2.2.0.min.js

    $.cookies.set(key, obj, { hoursToLive: 2}); key标识的键 , obj存入的值可以缓存json对象, hoursToLive 缓存小时数 $.cookies ...

  6. C# HttpWebRequest获取COOKIES

    C# HttpWebRequest获取COOKIES byte[] bytes = Encoding.Default.GetBytes(_post); CookieContainer myCookie ...

  7. HTML5-本地存储与cookies

    一.H5的几种存储形式 1.本地存储(localstorage和sessionstorage) 存储形式:key-->value 过期策略:localstorage永久存储,不过期,除非手动删除 ...

  8. scrapy加载cookies登陆

    import scrapy from xxxx.items import XXXXItem from scrapy.http.request import Request class ZndsSpid ...

  9. ASP.NET知识总结(9.使用Cookies实现购物车)

    ListInfo.aspx向购物车的添加商品的方法 private void GouWu(string name, double price, string id) { //往购物车中添加商品 Htt ...

随机推荐

  1. Nginx入门篇-基础知识与linux下安装操作

    我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...

  2. 【优秀的设计绘图软件】Affinity Designer Beta for Mac 1.7

        [简介] Affinity Designer 1.7 beta 中文版本,具有全新的UI界面和功能,支持最新的 macOS Mojave 10.14 系统,Affinity Designer是 ...

  3. awk统计文件大小

    在Linux系统中,经常会遇到某个目录下文件很多,要统计这些文件的空间大小.可以采用awk来实现.如下是实现这个功能的例子. vim sum.sh #!/bin/bash# sum.shcd //ba ...

  4. 2017-12-15python全栈9期第二天第四节之格式化输出%s和个人简介模板

    #!/user/bin/python# -*- coding:utf-8 -*-msg = '''-----------info of zd----------------Name:zdage:24h ...

  5. 2017-12-15python全栈9期第二天第三节之使用while循环输出0到10

    #!/user/bin/python# -*- coding:utf-8 -*-count = 0while count < 10: count += 1 print(count)

  6. git lg 使用 转

    命令: git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yello ...

  7. hibernate关联关系映射之配置文件

    词汇解释 关系:事物之间相互作用.相互联系的状态.范围最大. 联系:在关系数据库中表示实体与实体之间的联系,1:1,1:n,m:n. 关联:表示对象之间的关系,既有数量性,又有方向性:动词:将对象之间 ...

  8. Hadoop记录-hdfs转载

    Hadoop 存档 每个文件均按块存储,每个块的元数据存储在namenode的内存中,因此hadoop存储小文件会非常低效.因为大量的小文件会耗尽namenode中的大部分内存.但注意,存储小文件所需 ...

  9. C#设计模式(3)——抽象工厂模式

    1.抽象工厂模式介绍 上一篇我们了解了工厂模式,知道工厂模式可以解决简单工厂的缺陷(简单工厂添加新产品时要修改工厂类,不符合开闭原则),但是简单工厂和工厂模式都是只生产一种产品(前边的简单工厂和工厂都 ...

  10. Hadoop完全分布式安装

    一.软件版本 Hadoop版本号:hadoop-2.6.0.tar: VMWare版本号:VMware-workstation-full-11.0.0-2305329 Ubuntu版本号:ubuntu ...