2019 东北四省赛 A. Apple Business

link

简要题意:给一颗\(n\)个点的二叉树,par[i]=i/2,每个点有\(a[i]\)个果实,有\(m\)次操作,每次在\(u\to v\)(保证\(u\)是\(v\)的祖先)中取不超过\(c\)个果实,每取一个贡献\(w\)的收益

首先可以暴力建边然后费用流。考虑优化,有一种显然的贪心策略:按照\(w\)从大到小依次尽量选最多,判断可以二分加二分图匹配。

考虑霍尔定理,相当于对于任意子集的并,\(\sum _{i \in S} a[i] \ge \sum _{u_i\in S \& v_i\in S} c_i\)。

显然我们只需要考虑这个并是一个联通块的情况。考虑\(dp\)出以\(i\)为根的最小子树。

因为确定了根,我们可以把\(c_i\)赋值到\(v_i\)上。

转移是
\[
f[i][j] = \min (f[i*2][j],0)+\min (f[i*2+1][j],0-0) + val[i][j]
\]
预处理\(n\log n\),插入一条链以及算包含一条链的最小联通块复杂度\(n\log ^2n\)。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
typedef long long ll;
long long f[20][N<<1],g[20][N<<1];
int dep[N],a[N];
int n,m;
ll ans=0;
struct Line{
    int u,v,cap,w;
    bool operator < (const Line b)const{return w < b.w;}
    void read(){scanf("%d%d%d%d",&u,&v,&cap,&w);}
}l[N];

void Main(){
    ans=0;
    cin >> n >> m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++){
        dep[i]=dep[i>>1]+1;
        for(int j=dep[i];j;j--)g[j][i]=a[i];
    }
    for(int i=1;i<=dep[n];i++){
        for(int j=n;j;j--)f[i][j]=min(0ll,f[i][j<<1|1])+min(0ll,f[i][j<<1])+g[i][j];
    }
    for(int i=1;i<=m;i++)l[i].read();
    sort(l+1,l+m+1);
    for(int i=m;i;i--){
        int hed=l[i].u;ll Mn=l[i].cap;
        for(;hed;hed>>=1){
            int d=dep[hed],nxt=l[i].v,lst=0;ll ths=0;
            while(nxt!=(hed>>1)){
                ths+=min(0ll,(nxt<<1|1)==lst?0ll:f[d][nxt<<1|1])+min(0ll,(nxt<<1)==lst?0ll:f[d][nxt<<1])+g[d][nxt];
                lst=nxt;nxt>>=1;
            }
            Mn=min(Mn, ths);
        }
        ans+=l[i].w*Mn;
        hed=l[i].u;
        for(;hed;hed>>=1){
            int nxt=l[i].v,d=dep[hed];
            g[d][nxt]-=Mn;
            for(;nxt;nxt>>=1){
                f[d][nxt]=min(0ll,f[d][nxt<<1])+min(0ll,f[d][nxt<<1|1])+g[d][nxt];
            }
        }
    }
    for(int d=1;d<=dep[n];d++)for(int i=1;i<=n;i++)f[d][i]=g[d][i]=0;
    cout << ans << endl;
}

int main()
{
    int T;cin >> T;
    while(T--){
        Main();
    }
    return 0;
}

原文地址:https://www.cnblogs.com/weiyanpeng/p/11366600.html

时间: 2024-11-09 04:43:01

2019 东北四省赛 A. Apple Business的相关文章

2019年东北四省赛感想

打完东北四省赛之后一直都没空,然后到了放假的时候才有空闲下来,写了这篇感想. 今年的东北四省赛的地点在吉林省的吉林市 ,在东北电力大学,不得不说东北电力大学的伙食还可以,量很足.今年东北四省赛的出题人是杭电的大佬,出了一堆数据不好处理的题,今年的题,比去年的题还要难,1道题手速快点就是铜了,2道题稳铜,4道题手速快是银牌.今年的牌做的挺大的.比赛过程中完全被榜给带偏了,有一道简单题,我们都没有看,有时候跟榜害死人啊,比赛过程中,签到题,8分钟就过了,然后就一直在处理有一道题的数据,那一道题的数据

2014东北四省赛

这次运气真好...要是区域赛也有这样的运气就好了. 怎么说呢,这次比赛事实上有非常多不尽人意的地方,比方不给发气球,不给判题,判错题,题目描写叙述有问题,题目数据有问题,和不给判题等等.. 热身赛,上来提前发了题目,然后发现pc^2上不去...这尼玛,深深的恶意啊,赶快边敲题目边叫来志愿者.还好搞了搞就能连上了. 热身赛果然是用来热身的啊.队友C题仅仅看了两个单词就发现是原题.然后就交了..后来就顺着把题目A掉了.简直的二分专场啊,除了签到题和两道原题,剩下的两道题都是二分...凭借两道原题,热

18年第十二届东北四省赛

18年第十二届东北四省赛 5.19晚上的东北四省赛的热身赛老师说不用参加,当时白天打了一场之后,也确实脑壳疼QAQ: 5.20很吉利的日期啊,9.30-2.30,还是一样的分工读题,外加看榜,然后很幸运,两道水题,一道A,一道K,队友直接听我们的上去敲,然后交的时候比较谨慎,0罚时,连A两题,然后挂机4小时40分钟?!然后我们讨论了B,然后就一直B....当时觉得B转换为二进制没问题,后来WA,发现有个地方爆Long long,然后又发现有个地方爆Long long,然后把乘法改成除法感觉不会爆

【2016东北四省赛】

HDU5927 题意:给出一个根节点为1的树(n <= 100000),树中的结点分为重要结点与不重要结点. 有q个询问,每次询问给出一个不重要结点的集合(m <= 100000), 统计一类点(它是重要结点 或者 它是两个重要结点的最近公共祖先) 的总数. 题解:维护一个set集合表示以该结点为根的子树不含重要结点,set集合初始即为m个点.按 后序遍历 将集合中的点排序后(ra表示结点后序遍历中的排名),对每个点,查找子结点点,若至少有两个子结点不在set里,则该点是可行点,同时将其从集合

2019东北四省B,G,H,J 2018宁夏 A,F

The 13th Chinese Northeast Collegiate Programming Contest B. Balanced Diet #include<bits/stdc++.h> #define il inline #define pb push_back #define fi first #define se second #define ms(_data,v) memset(_data,v,sizeof(_data)) #define sc(n) scanf("

2019 ICPC 南昌网络赛

2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 // 史上排名最高一次,开场不到两小时队友各A一题加水题共四题,排名瞬间升至三四十名 // 然后后三小时就自闭了,一题都没有突破...最后排名211 hhhh ? ? B. Fire-Fighting Hero 题意 队友做的,待补. ? AC代码 #include<cstdio> #includ

2016 CCPC 东北地区重现赛

1. 2016 CCPC 东北地区重现赛 2.总结:弱渣,只做出01.03.05水题 08   HDU5929 Basic Data Structure    模拟,双端队列 1.题意:模拟一个栈的操作,并在每次询问时,计算栈项到栈底元素nand位运算的值. 2.总结:思路就是看距离栈底最近的0的后面1的个数的奇偶.试了好多种办法,最后还是双端队列简便.总之,贼恶心的题.. #include<iostream> #include<cstring> #include<cmath

2019第四次课程设计实验报告

2019第四次课程设计实验报告 一. 实验项目名称: 快乐小鸟 二. 实验项目功能描述: 该游戏设置音乐循环播放,设置了小鸟,挡板障碍,按一下空格小鸟向上一格,若通过挡板则加一分,若没有通过则游戏结束,随着分数的增多小鸟的速度增快,得分高的记录下最高分. 三.项目模块介绍: 四.界面展示 五.代码托管链接: https://gitee.com/hxy2017826779/huang_hahas_warehouse/blob/master/%E5%BF%AB%E4%B9%90%E5%B0%8F%E

2019.11.30训练赛总结

2019.11.30训练赛总结 Codeforces Round #499 (Div. 2) 总的来说是一场很不愉快的比赛.漏洞百出. 对于A题,其实没有什么技术含量,只是写的时候忘记了边界的情况,导致出现错误. B题,一定程度上考验了思维,既然从正面做不行,那么我可以反着来,既然求不可以正向求出答案,那我可以把答案枚举带进去看是否符合条件啊,如果数据范围再大点的话还可以二分. D题,也反应出了自己的一个漏洞,就是懒得一步一步去推数据,代数据进去.当出现bug的时候,最直接,最有效的办法,就是把