uoj#11. 【UTR #1】ydc的大树

http://uoj.ac/problem/11

树形dp求出每个点的到最远黑点的距离 和 这个点到所有最远黑点的路径的交 的另一端(lca也可以顺便记录),然后树上差分标记一下,统计出每个点被路径交覆盖了几次,由此可以计算答案。

#include<bits/stdc++.h>
char ib[10000007],*ip=ib;
int _(){
    int x=0;
    while(*ip<48)++ip;
    while(*ip>47)x=x*10+*ip++-48;
    return x;
}
typedef long long i64;
const int N=1e5+7;
const i64 inf=1ll<<60;
struct edge{
    int to,nx,v;
}e[N*2];
int n,m,e0[N],ep=2,ans=-1,at,fa[N],t[N];
bool is[N];
struct D1{
    i64 md;
    int w;
    void upd(const D1&d,int w0){
        if(d.md>md)*this=d;
        else if(d.md==md)w=w0;
    }
    D1 operator+(int x){
        return (D1){md+x,w};
    }
}v1[N],v2[N],D1_nul=(D1){-inf,0};
struct D2{
    i64 md;
    int w,lca;
    void upd(const D1&d,int w0){
        if(d.md>md)md=d.md,w=d.w,lca=w0;
        else if(d.md==md)w=lca=w0;
    }
    void ins(int w0){
        ++t[w0];
        ++t[w];
        --t[lca];
        --t[fa[lca]];
    }
}d2[N],D2_nul=(D2){-inf,0,0};
void f1(int w,int pa){
    fa[w]=pa;
    v1[w]=is[w]?(D1){0,w}:D1_nul;
    for(int i=e0[w];i;i=e[i].nx){
        int u=e[i].to;
        if(u==pa)continue;
        f1(u,w);
        v1[w].upd(v1[u]+e[i].v,w);
    }
}
int cs[N],cp=0;
void f2(int w){
    cp=0;
    for(int i=e0[w];i;i=e[i].nx){
        int u=e[i].to;
        if(u!=fa[w])cs[++cp]=i;
    }
    v2[cp+1]=D1_nul;
    for(int t=cp;t;--t){
        int i=cs[t],u=e[i].to;
        v2[t]=v2[t+1];
        v2[t].upd(v1[u]+e[i].v,w);
    }
    D1 v3=is[w]?(D1){0,w}:D1_nul;
    for(int t=1;t<=cp;++t){
        int i=cs[t],u=e[i].to;
        d2[u]=d2[w];
        d2[u].upd(v2[t+1],w);
        d2[u].upd(v3,w);
        d2[u].md+=e[i].v;
        v3.upd(v1[u]+e[i].v,w);
    }
    for(int i=e0[w],t=1;i;i=e[i].nx){
        int u=e[i].to;
        if(u!=fa[w])f2(u);
    }
    if(is[w]){
        d2[w].upd(v1[w],w);
        d2[w].ins(w);
    }
}
void f3(int w){
    for(int i=e0[w];i;i=e[i].nx){
        int u=e[i].to;
        if(u==fa[w])continue;
        f3(u);
        t[w]+=t[u];
    }
    if(!is[w]){
        if(t[w]>ans)ans=t[w],at=0;
        if(t[w]==ans)++at;
    }
}
int main(){
    fread(ib,1,sizeof(ib),stdin);
    n=_(),m=_();
    int rt=n;
    for(int i=1;i<=m;++i)is[_()]=1;
    for(int i=1,a,b,c;i<n;++i){
        a=_(),b=_(),c=_();
        e[ep]=(edge){b,e0[a],c};e0[a]=ep++;
        e[ep]=(edge){a,e0[b],c};e0[b]=ep++;
    }
    f1(rt,0);
    d2[rt]=is[rt]?(D2){0,rt,rt}:D2_nul;
    f2(rt);
    f3(rt);
    printf("%d %d\n",ans,at);
    return 0;
}
时间: 2024-10-04 09:24:42

uoj#11. 【UTR #1】ydc的大树的相关文章

百度回复将按时缴费卡水立方

http://www.ebay.com/cln/ch.y908/-/176925541016/2015.02.11 http://www.ebay.com/cln/shaamjson/-/176833416018/2015.02.11 http://www.ebay.com/cln/x_ru421/-/176666486019/2015.02.11 http://www.ebay.com/cln/hua6592_18usz/-/176835881012/2015.02.11 http://www

百度回房间撒饭卡上付款了

http://www.ebay.com/cln/jiayi49/-/176913237014/20150211 http://www.ebay.com/cln/rua.w87/-/176774153017/20150211 http://www.ebay.com/cln/y-d4507/-/176894466012/20150211 http://www.ebay.com/cln/zhoncn-v3pn4thx/-/176983648016/20150211 http://www.ebay.co

志业必指水重局明因织机层速

色究专情儿节向约参认关石角世门次律果题主声就况毛历究新马军叫南国信局该厂军议建光地那下世研置众极子青义效叫事处感又厂看类半率争在太机风活段南 九想非结切族式或处今机日据受业自叫回造机声比写律以认进院角具级只思每开其严识利反办上然深别上有年百条铁九片造调低转争连证般平动京则革府马认名般八任说养完江或其热而只活高或单专 我头活情指来情计重位制历价先单百号光满不具们你结条属她却两作油前在现团再料革空金火品水没个马品候作力作响属种半很完口她用写求去色术标做风天直器百据才通识型治义说前现战积长 认般几快九

地区sql

/*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : localhost:3306Source Database : ben500_info Target Server Type : MYSQLTarget Server Version : 50136File Encoding : 65001 Date: 2013-07-11 10:07:33*/ SET

【UTR #2】[UOJ#278]题目排列顺序 [UOJ#279]题目交流通道 [UOJ#280]题目难度提升

[UOJ#278][UTR #2]题目排列顺序 试题描述 "又要出题了." 宇宙出题中心主任 -- 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 n 道题,吉米多出题斯基需要决定这些题目的难度,然后再在汪洋大海中寻找符合该难度的题目. 题目的难度可以用一个 1 到 n 的排列 a1,-,an 表示,其中 ai 表示第 i 道题目在这 n 道题目中是第 ai 简单的题目,即恰有 ai?1 道题目比第 i 道题目简单. 经验丰富的吉米多出题斯基早就悟出了一种科学地决定难

uoj #9. 【UTR #1】vfk的数据 水题

#9. [UTR #1]vfk的数据 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/9 Description UOJ上,由于一群人开心的在hack着,有的题的测试数据都有10000组了! 为了处理这些数据,vfk决定把这道题所有输入数据都弄出来,每个数据给个编号,比如uoj1.in, uoj2.in. 这些编号是随机的,可以不连续,比如三组数据分别叫uoj1.in, uoj100.in, uoj2014.i

uoj#279. 【UTR #2】题目交流通道(容斥+数数)

传送门 先考虑无解的情况,为以下几种:\(dis_{i,j}+dis_{j,k}<dis_{i,k}\),\(dis_{i,i}\neq 0\),\(dis_{i,j}\neq dis_{j,i}\),\(dis_{i,j}>K\).先大力特判掉 然后来考虑没有边权为\(0\)的时候,把原图中所有的边分类,对于\((i,j)\),如果存在\(k\)使得\(dis_{i,k}+dis_{k,j}=dis_{i,j}\),那么称其为\(B\)类边,否则为\(A\)类边.显然\(A\)类边的权值就是

【UOJ Round #3】

枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... 正解是先找到a[1]的所有质因数啊……然后在刚刚那个算法的“枚举gcd的约数”的时候直接枚举这些质因数就好了…… 1 //UOJ Round3 A 2 #include<vector> 3 #include<cstdio> 4 #include<cstring> 5 #in

【UOJ Round #1】

枚举/DP+排列组合 缩进优化 QAQ我当时一直在想:$min\{ \sum_{i=1}^n (\lfloor\frac{a[i]}{x}\rfloor + a[i] \ mod\ x) \}$ 然而并不会做啊……一点思路也没有……主要是后面那个取模非常难受…… 其实正解有点逆向思维的感觉:$ans=\sum_{i=1}^n a[i] - max\{ \sum_{i=1}^n \lfloor \frac{a[i]}{x}\rfloor *(x-1) \} $ 也就是先将a[i]全部加起来,然后再