首页 > 其他分享 >2019 ICPC Asia-East Continent Final

2019 ICPC Asia-East Continent Final

时间:2023-03-14 17:44:56浏览次数:42  
标签:f1 f2 min int Asia Final 2019 Continent

D

考虑树形DP,记\(f[u],g[u]\)分别为最终回到u/停在子树中的最晚第一次到达u的时间。原本以为在枚举了最后一个的情况下,遍历子树的顺序是以f升序的,(因为只有最后一个不对后面产生影响);但实际上很假,因为在去掉最后一个后,倒数第二个也成了最后一个,那么针对最后一个的特殊情况也同样会出现。
这时候应该用经典的贪心不等式,列出最简化的情况的式子(只有两个子树):
\(min(f1,f2-2*sz1)\ge min(f2,f1-2*sz2)\)
然后分讨,发现第二个min如果取f1必然不成立,然后取另一个就可以得到:
\(f1-2*sz1 \le f2-2*sz2\)
然后经过一些经典的证明可以推广到整个序列,所以按照这个排序即可。

点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5,inf=2e9+5+N;
void Min(int& x,int y){
    if(y<x) x=y;
}
void Max(int& x,int y){
    if(y>x) x=y;
}
int hd[N],to[N<<1],nx[N<<1],tt;
void add(int u,int v){
    nx[++tt]=hd[u];
    to[hd[u]=tt]=v;
}
int n,k,a[N],f[N],g[N],sz[N],sn[N],h[N],Mn[N],su[N];
bool cmp(int x,int y){
    return f[x]+2*sz[x]<f[y]+2*sz[y];
}
void dfs(int u,int fa){
    sz[u]=1;
    for(int e=hd[u];e;e=nx[e]) if(to[e]!=fa){
        int v=to[e];
        dfs(v,u);
        sz[u]+=sz[v];
    }
    int m=0;
    for(int e=hd[u];e;e=nx[e]) if(to[e]!=fa) sn[++m]=to[e];
    if(!m){
        f[u]=min(a[u],a[u]+k-2*(sz[u]));
        g[u]=a[u];
        return;
    }
    sort(sn+1,sn+m+1,cmp);
    f[u]=g[u]=-inf;
    for(int i=1;i<=m;i++) su[i]=su[i-1]+sz[sn[i]],h[i]=f[sn[i]]-2*su[i-1]-1;
    Mn[m+1]=inf;
    for(int i=m;i;i--) Mn[i]=min(Mn[i+1],h[i]);
    int mn=inf;
    for(int i=1;i<=m;i++){
        Max( f[u],min(h[i]-(su[m]-su[i])*2,min(Mn[i+1]+sz[sn[i]]*2,mn)) );
        Max(g[u],min( min(a[u]+k-2*(sz[u]-sz[sn[i]]),g[sn[i]]-2*(sz[u]-sz[sn[i]]-1)-1),min(Mn[i+1]+sz[sn[i]]*2,mn) ) );
        Min(mn,h[i]);
    }
    Min(f[u],min(a[u],a[u]+k-2*(sz[u])) );
    Min(g[u],a[u]);
    //printf("u=%d f=%d g=%d\n",u,f[u],g[u]);
}
int main()
{
    cin>>n>>k;
    for(int u,v,i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    dfs(1,0);
    if(g[1]<0) puts("-1");
    else cout<<g[1]<<endl;
    return 0;
}

标签:f1,f2,min,int,Asia,Final,2019,Continent
From: https://www.cnblogs.com/szsz/p/17215732.html

相关文章

  • P8680 [蓝桥杯 2019 省 B] 特别数的和
    P8680[蓝桥杯2019省B]特别数的和[蓝桥杯2019省B]特别数的和题目描述小明对数位中含有2、0、1、9的数字很感兴趣(不包括前导0),在1到40中这样的数包括1、2......
  • WindowsServers2019摄像头不可用的解决方案
    1、系统服务开启启动管理员命令提示符,执行下列命令scconfigAudiosrvstart=autoscconfigAudioEndpointBuilderstart=autoscconfigstisvcstart=autoscconfigWPD......
  • 【编辑器】常用编程环境使用感受20190804
    一、编辑器1、Vim/Emase又被称之为神器:编辑器之神vs神之编辑器学习使用成本高and定义所有功能2、Sublime/Vscode/Atom现在编辑器,有以下特点:跨平台,颜值高,性能佳3、Note......
  • 2019百度之星程序设计大赛 1005 Seq
    ProblemDescription度度熊有一个递推式a_{n}=(\sum_{i=1}^{n-1}a_{i}*i)%na​n​​=(∑​i=1​n−1​​a​i​​∗i)%n其中a_1=1a​1​​=1。现给......
  • [蓝桥杯 2019 省 A] 修改数组 ———并查集练习(大学复健)
    本题拿到第一反应桶排序思想似乎可以水过,但是很明显出问题了。#include<bits/stdc++.h>usingnamespacestd;intN;inlineintkd(){ intx=0,f=1;charch=getchar......
  • 2019GPLT
    2019GPLT7-26翻了从左到右扫描输入的句子:如果句子中有超过3个连续的6,则将这串连续的6替换成9;但如果有超过9个连续的6,则将这串连续的6替换成27。其他内容不......
  • 安装oracle 11g odbc驱动,安装visual studio 2019 2022支持ef的工具 entityframework
    安装oracleodbc驱动1.安装Oracle-Client-for-Microsoft-Tools.exe2.下载instantclient-basic-windows.x64-11.2.0.4.0.zip3.下载 instantclient-odbc-windows.x64-1......
  • 解决 IntelliJ IDEA 2019.2.3 java 工程运行中文乱码问题
    前言java语言的语法类似于C++,目前接触的开发环境:eclipse与IntelliJIDEA,AndroidStudio应该跟IntelliJIDEA很类似虽然之前改改AndroidAPK,了解了一些java开发相关的东......
  • [SDOI2019] 移动金币 题解
    首先考虑一个状态什么时候是合法的。不难把游戏过程抽象为阶梯Nim博弈。根据阶梯Nim博弈的结论,先手必胜当且仅当奇数位上的异或和不为0。考虑将本题中每个棋子后面......
  • P5322 [BJOI2019] 排兵布阵
     小C正在玩一款排兵布阵的游戏。在游戏中有nn座城堡,每局对战由两名玩家来争夺这些城堡。每名玩家有m名士兵,可以向第ii座城堡派遣ai名士兵去争夺这个城堡,使得总......