zoukankan      html  css  js  c++  java
  • 2019 杭电多校第三场 题解

    题解


    1001 Azshara's deep sea

    Unsolved.

    1002 Blow up the city.

     题解:倒着建图,然后将原图出度为零的点用一个新节点连接起来,支配树板题。

    参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define pb push_back
    //DAG图q个询问,给你u,v:去掉一个点连同和这个点相连的所有边使得u或v不能到达出度为零的点的方案 
    const int maxn=2e5+7;
    int n,m,deg[maxn],rt,a[maxn],dep[maxn],val[maxn];
    int f[maxn][20];
    vector<int>E[maxn],RE[maxn];
    void Topsort()
    {
        queue<int>q;
        rt=n+1;//图可能不连通,建一个新点连接起来 
        for(int i=1;i<=n;i++) if(!deg[i]){q.push(i);E[rt].pb(i);RE[i].pb(rt);}
        int tot=0;
        while(!q.empty())
        {
            int u=q.front(); q.pop();
            a[++tot]=u;
            for(auto &v:E[u]){if((--deg[v])==0) q.push(v);}
        }
    }
    int LCA(int x,int y)
    {
        if(dep[x]>dep[y]) swap(x,y);
        for(int i=19;i>=0;i--)
        {
            if(dep[y]>dep[x]&&dep[f[y][i]]>=dep[x]) 
                y=f[y][i];
        }
        if(x==y) return x;
        for(int i=19;i>=0;i--)
        { 
            if(f[x][i]!=f[y][i]) 
                x=f[x][i],y=f[y][i];
        }
        return f[x][0];
    }
    void Work()
    {
        dep[rt]=1;
        for(int i=1;i<=n;i++)
        {
            int u=a[i],fa=-1;
            for(auto &v:RE[u]) fa=(fa==-1? v:LCA(fa,v));
            dep[u]=dep[fa]+1;
            f[u][0]=fa; 
            for(int i=1;i<=19;i++) f[u][i]=f[f[u][i-1]][i-1];
        }
    }
    int main()
    {
        int tt; 
        scanf("%d",&tt);
        while(tt--)
        {
            scanf("%d%d",&n,&m);
            memset(f,0,sizeof(f)); 
            for(int i=1;i<=n+1;i++) 
            {
                E[i].clear(); RE[i].clear();
                dep[i]=deg[i]=0;
            }
            while(m--) 
            {
                int u, v; 
                scanf("%d%d", &u, &v);
                E[v].pb(u); RE[u].pb(v); deg[u]++;
            }
            
            Topsort(); Work();
            int q; 
            scanf("%d", &q);
            while(q--)
            {
                int u, v; 
                scanf("%d%d",&u,&v);
                int lca=LCA(u,v);
                printf("%d
    ",dep[u]+dep[v]-dep[lca]-1);
            }
        }
        
        return 0;
    }
    View Code

    1003 Yukikaze and Demons

    Unsolved.

    1004 Distribution of books

    https://blog.csdn.net/liufengwei1/article/details/97703075

    #include<bits/stdc++.h>
    using namespace std;
    #define maxl 200010
    
    
    int n,tot,cnt,k;
    long long up,dow,ans;
    int a[maxl],b[maxl],dp[maxl],h[maxl],c[maxl];
    long long sum[maxl];
    long long num[maxl];
    
    
    inline void prework()
    {
        scanf("%d%d",&n,&k);
        up=0;dow=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            sum[i]=sum[i-1]+a[i],num[i]=sum[i];
            if(a[i]>0) up+=a[i];
            else dow+=a[i];
        }
        num[n+1]=0;
        sort(num+1,num+2+n);
        tot=unique(num+1,num+2+n)-num-1;
        for(int i=0;i<=n;i++)
            b[i]=lower_bound(num+1,num+1+tot,sum[i])-num;
    }
    
    inline void upd(int i,int x) 
    {
        int t;
        while(i<=tot && i)
        {
            h[i]=c[i];
            for(int k=1;k<(i&-i);k<<=1)
                h[i]=max(h[i],h[i-k]);
            i+=i&-i;
        }
    }
    inline int qry(int l,int r)
    {
        int ret=-n-1,len=r-l+1;
        while(len && r)
        {
            if(len<(r&-r))
            {
                ret=max(ret,c[r]);
                r--;len--;
            }else
            {
                ret=max(ret,h[r]);
                len-=(r&-r);
                r-=r&-r;                
            }
        }
        return ret;
    }
    
    inline bool jug(long long mid)
    {
        for(int i=1;i<=n;i++)
            dp[i]=0;
        for(int i=1;i<=tot;i++)
            h[i]=-n-1,c[i]=-n-1;
        int l=1,r=n,id,tmp;
        c[b[0]]=0;upd(b[0],c[b[0]]);
        for(int i=1;i<=n;i++)
        {
            id=lower_bound(num+1,num+1+tot,sum[i]-mid)-num;
            if(id>tot)
                continue;
            tmp=qry(id,tot);
            if(tmp<=-n-1)
                continue;
            dp[i]=max(dp[i],qry(id,tot)+1);
            c[b[i]]=max(c[b[i]],dp[i]);
            upd(b[i],c[b[i]]);
            if(dp[i]>=k)
                return true;
        }
            return false;
    }
    
    inline void mainwork()
    {
        long long l=dow,r=up,mid;
        while(l+1<r)
        {
            mid=(l+r)>>1;
            if(jug(mid))
                r=mid;
            else
                l=mid;
        }
        if(jug(l))
            ans=l;
        else
            ans=l+1;
    }
    
    inline void print()
    {
        printf("%lld
    ",ans);
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        for(int i=1;i<=t;i++)
        {
            prework();
            mainwork();
            print();
        }
        return 0;
    }
    View Code

    1005 Easy Math Problem

    https://blog.csdn.net/baiyifeifei/article/details/97798086

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int size=2e5+5;
    const int mod=1e9+7;
    typedef long long LL;
    bool prime[size]; int p[size];
    int tot=0;
    int inv6,inv2;
    int phi[size];
    int sumiiphi[size];
    int quick_pow(int a,int b)
    {
        register int ans=1;
        while(b)
        {
            if(b&1) ans=1LL*ans*a%mod;
            a=1LL*a*a%mod;
            b>>=1;
        }
        return ans;
    }
    int inv[205];
    void init()
    {
        tot=0;
        phi[1]=1;
        for(int i=1;i<size;i++) prime[i]=true;
        for(int i=2;i<size;i++)
        {
            if(prime[i])
                p[++tot]=i,phi[i]=i-1;
            for(int j=1;j<=tot&&p[j]*i<size;j++) 
            {
                prime[i*p[j]]=false;
                if(i%p[j]==0) 
                {
                    phi[i*p[j]]=phi[i]*p[j];
                    break;
                }
                else
                phi[i*p[j]]=phi[i]*phi[p[j]];                
            }
        }
        sumiiphi[0]=0;
        for(int i=1;i<size;i++) sumiiphi[i]=(sumiiphi[i-1]+1LL*i*i%mod*phi[i]%mod)%mod;
        inv6=quick_pow(6,mod-2);
        inv2=quick_pow(2,mod-2);
        inv[0]=inv[1]=1;
        for(int i=2;i<=200;i++)
        inv[i] = (mod - (mod / i)) * inv[mod % i] % mod;
        for (int i = 1; i <= 200; ++i)inv[i] = inv[i] * inv[i - 1] % mod;
    }
    int tol;
    int hk[size<<1];LL num[size<<1];
    int pre[size];
    int coeff[205];
    void pre_lage(int k)
    {
        for(int i=1;i<=k+2;i++) coeff[i]=quick_pow(i,k);
        coeff[0]=0;
        for(int i=1;i<=k+2;i++) coeff[i]=(coeff[i-1]+coeff[i])%mod;
    }
    LL suf[205],bef[205];
    int lage(int n,int k)
    {
        if(n<=k+2) return coeff[n];
        bef[0] = suf[0] = 1;
        for (int i = 1; i <= k + 2; ++i) {
            bef[i] = bef[i - 1] * ((n - i) % mod) % mod;
            suf[i] = suf[i - 1] * ((n + i - k - 3) % mod) % mod;
        }
        LL res = 0;
        for (int i = 1; i <= k + 2; ++i) {
            LL s = coeff[i] * bef[i - 1] % mod * suf[k - i + 2] % mod * inv[i - 1] % mod * inv[k + 2 - i] % mod;
            if ((k + 2 - i) & 1)s = -s;
            res += s;
            res = (res % mod + mod) % mod;
        }
        return res;
    }
    int s;LL n;
    int id1[size],id2[size];
    inline int ID(int x)
    {
        if(x<=s) return id1[x];
        return id2[n/x];
    }
    void get_h(int k)
    {
        s=sqrt(n);
        while(1LL*s*s<=n) s++;
        while(1LL*s*s>n) s--;
        pre[0]=0;
        for(register int i=1;p[i]<=s;i++)
        {
            pre[i]=(1LL*pre[i-1]+quick_pow(p[i],k+1))%mod;
        }
        tol=0;
        for(register LL l=1,r;l<=n;l=r+1)
        {
            r=n/(n/l);
            num[++tol]=r;
            if(r<=s) id1[r]=tol;
            else id2[n/r]=tol;
        }
        pre_lage(k+1);
        for(register int i=1;i<=tol;i++) hk[i]=(lage(num[i]%mod,k+1)-1+mod)%mod;
        hk[0]=0;
        int x=1;
        for(int j=1;j<=tot&&p[j]<=s;j++)
        {
            while(num[x]<p[j]*p[j]) x++;
            for(int i=tol;i>=x;i--)
            {
                hk[i]=((hk[i]-1LL*(pre[j]-pre[j-1]+mod)%mod*(hk[ID(num[i]/p[j])]-pre[j-1]))%mod+mod)%mod;
            }
        }
    }
    unordered_map<LL,int> mp;
    inline int sum2(int n)
    {
        return 1LL*n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
    }
    inline int sum3(int n)
    {
        int ans=1LL*n*(n+1)%mod*inv2%mod;
        return 1LL*ans*ans%mod;
    }
    inline int S(LL n)
    {
        if(n<size) return sumiiphi[n];
        if(mp.count(n)) return mp[n];
        LL ans=sum3(n%mod);//n取模 
        for(LL l=2,r;l<=n;l=r+1)
        {
            r=n/(n/l);
            ans=((ans-1LL*S(n/r)*(sum2(r%mod)-sum2((l-1)%mod)))%mod+mod)%mod;
        }
        return mp[n]=ans;
    }
    int32_t main()
    {
        int t;
        scanf("%lld",&t);
        int k;
        init();
        while(t--)
        {
            scanf("%lld%lld",&n,&k);
            mp.clear();
            get_h(k);
            int ans=0;
            for(int i=1;i<=tol;i++)
            {
                ans=(ans+1LL*(hk[i]-hk[i-1])%mod*S(n/num[i])%mod+mod)%mod;
            }
            printf("%lld
    ",ans);
        }
    }
    View Code

    1006 Fansblog

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    unordered_map<LL,LL> mp;
    LL quick_pow(LL a,LL b,LL mod)
    {
        LL ans=1;
        while(b)
        {
            if(b&1) ans=((__int128)ans)*a%mod;
            a=((__int128)a)*a%mod;
            b>>=1;
        }
        return ans;
    }
    long long factor[110], cnt;
    long long Mul_Mod(long long a, long long b, long long c) {
        if (b == 0)
            return 0;
        long long ans = Mul_Mod(a, b / 2, c);
        ans = (ans * 2) % c;
        if (b % 2)
            ans = (ans + a) % c;
        return ans;
    }
    long long Pow_Mod(long long a, long long b, long long c) {
        if (b == 0)
            return 1;
        long long x = Pow_Mod(a, b / 2, c);
        if (x == 0)
            return 0;
        long long y = Mul_Mod(x, x, c);
        if (y == 1 && x != 1 && x != c - 1)
            return 0;
        if (b % 2)
            y = Mul_Mod(y, a, c);
        return y;
    }
    bool Miller_rabin(long long n, int timenum = 10) {
        if (n < 2)
            return false;
        if (n == 2)
            return true;
        while (timenum--) {
            if (Pow_Mod(rand() % (n - 2) + 2, n - 1, n) != 1)
                return false;
        }
        return true;
    }
    long long Gcd(long long a, long long b) {
        long long t;
        while (b) {
            t = a;
            a = b;
            b = t % b;
        }
        return a;
    }
    void Pollard(long long n);
     
    void Factor(long long n) {
        long long d = 2;
        while (true) {
            if (n % d == 0) {
                Pollard(d);
                Pollard(n / d);
                return;
            }
            d++;
        }
    }
    void Pollard(long long n) {
        if (n == 1)
            return;
        if (Miller_rabin(n)) {
            factor[cnt++] = n;
            return;
        }
        long long i = 0, k = 2, x, y, d;
        x = y = rand() % (n - 1) + 1;
        while (i++ < 123456) {
            x = (Mul_Mod(x, x, n) + n - 1) % n;
            d = Gcd((y - x + n) % n, n);
            if (d != 1) {
                Pollard(d);
                Pollard(n / d);
                return;
            }
            if (i == k) {
                y = x;
                k *= 2;
            }
        }
        Factor(n);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        LL p;
        while(t--)
        {
            scanf("%lld",&p);
            if(mp.count(p))
            {
                printf("%lld
    ",mp[p]);
                continue;
            }
            LL ans=p-1;
            if(Miller_rabin(p-2))
            {
                LL ret=(LL)(((__int128)(p-1))*quick_pow(p-1,p-2,p)%p);
                mp[p]=ret;
                printf("%lld
    ",ret);
                continue;
            }
            for(LL i=p-4;i>=998244353;i-=2)
            {
                ans=(__int128)ans*(i+1)%p*(i+2)%p;
                if(Miller_rabin(i))
                {
                    LL ret=(LL)(((__int128)(p-1))*quick_pow(ans,p-2,p)%p);
                    mp[p]=ret;
                    printf("%lld
    ",ret);
                    break;
                }
            }
        }
    }
    View Code

    1007 Find the answer

    #include<bits/stdc++.h>
    #define maxl 200010
    using namespace std;
    
    int n,m;
    int a[maxl],dy[maxl],ans[maxl];
    struct anode
    {
        int id,val;
    }aa[maxl];
    struct node
    {
        int l,r;
        long long sum;
    }tree[maxl*4];
    int b[maxl];
    
    inline bool cmp(const anode &x,const anode &y)
    {
        return x.val<y.val;
    }
    
    inline void add(int i,int x)
    {
        while(i<=n)
        {
            b[i]+=x;
            i+=i&-i;
        }
    }
    
    inline int sum(int i)
    {
        int ret=0;
        while(i)
        {
            ret+=b[i];
            i-=i&-i;
        }
        return ret;
    }
    
    inline void build(int k,int l,int r)
    {
        tree[k].l=l;tree[k].r=r;
        if(l==r)
        {
            tree[k].sum=aa[l].val;
            return;
        }
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
    }
    
    inline void prework()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]),aa[i].id=i,aa[i].val=a[i];
        sort(aa+1,aa+1+n,cmp);
        for(int i=1;i<=n;i++)
        {    
            dy[aa[i].id]=i;
            b[i]=0;
        }
        for(int i=1;i<=n;i++)
            add(i,1);
        build(1,1,n);
    }
    
    inline void upd(int k,int l)
    {
        if(tree[k].l==tree[k].r)
        {
            tree[k].sum=0;
            return;
        }
        int mid=(tree[k].l+tree[k].r)>>1;
        if(l<=mid)
            upd(k<<1,l);
        else
            upd(k<<1|1,l);
        tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
    }
    
    inline int query(int k,long long res)
    {
        if(tree[k].l==tree[k].r)
        {
            if(tree[k].sum>res)
                return tree[k].l-1;
            else
                return tree[k].l;
        }
        if(tree[k<<1].sum<res)
            return query(k<<1|1,res-tree[k<<1].sum);
        else
            return query(k<<1,res);
    }
    
    inline void mainwork()
    {
        int l;
        for(int i=n;i>=1;i--)
        {
            upd(1,dy[i]);
            add(dy[i],-1);
            l=query(1,m-a[i]);
            ans[i]=(i-1)-sum(l);
        }
    }
    
    inline void print()
    {
        for(int i=1;i<=n;i++)
            printf("%d ",ans[i]);
        puts("");
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        for(int i=1;i<=t;i++)
        {
            prework();
            mainwork();
            print();
        }
        return 0;
    }
    View Code

    1008 Game

    Unsolved.

    1009 K Subsequence

    https://blog.csdn.net/baiyifeifei/article/details/97706037

    #include<bits/stdc++.h>
    using namespace std;
    typedef pair<int, int> pii;
    const int maxn = 1e4;
    const int inf = 0x3f3f3f3f;
    struct edge {
        int to, cap, cost, rev;
        edge() {}
        edge(int to, int _cap, int _cost, int _rev) :to(to), cap(_cap), cost(_cost), rev(_rev) {}
    };
    int V, H[maxn + 5], dis[maxn + 5], PreV[maxn + 5], PreE[maxn + 5];
    vector<edge> G[maxn + 5];
    void init(int n) {
        V = n;
        for (int i = 0; i <= V; ++i)G[i].clear();
    }
    void AddEdge(int from, int to, int cap, int cost) {
        G[from].push_back(edge(to, cap, cost, G[to].size()));
        G[to].push_back(edge(from, 0, -cost, G[from].size() - 1));
    }
    int Min_cost_max_flow(int s, int t, int f, int& flow) {
        int res = 0; fill(H, H + 1 + V, 0);
        while (f) {
            priority_queue <pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > q;
            fill(dis, dis + 1 + V, inf);
            dis[s] = 0; q.push(pair<int, int>(0, s));
            while (!q.empty()) {
                pair<int, int> now = q.top(); q.pop();
                int v = now.second;
                if (dis[v] < now.first)continue;
                for (int i = 0; i < G[v].size(); ++i) {
                    edge& e = G[v][i];
                    if (e.cap > 0 && dis[e.to] > dis[v] + e.cost + H[v] - H[e.to]) {
                        dis[e.to] = dis[v] + e.cost + H[v] - H[e.to];
                        PreV[e.to] = v;
                        PreE[e.to] = i;
                        q.push(pair<int, int>(dis[e.to], e.to));
                    }
                }
            }
            if (dis[t] == inf)break;
            for (int i = 0; i <= V; ++i)H[i] += dis[i];
            int d = f;
            for (int v = t; v != s; v = PreV[v])d = min(d, G[PreV[v]][PreE[v]].cap);
            f -= d; flow += d; res += d*H[t];
            for (int v = t; v != s; v = PreV[v]) {
                edge& e = G[PreV[v]][PreE[v]];
                e.cap -= d;
                G[v][e.rev].cap += d;
            }
        }
        return res;
    }
    int a[maxn];
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n,k;
            scanf("%d%d",&n,&k);
            for(register int i=1;i<=n;++i) scanf("%d",&a[i]);
            int ss=0,s=1,t=2*n+2,tt=2*n+3;
            init(tt+1);
            AddEdge(ss,s,k,0);
            AddEdge(t,tt,k,0);
            for(register int i=1;i<=n;++i)
            {
                AddEdge(s,i+1,1,0);
                AddEdge(i+1+n,t,1,0);
                AddEdge(i+1,i+1+n,1,-a[i]);
                for(register int j=i+1;j<=n;++j)
                {
                    if(a[j]>=a[i])
                    {
                        AddEdge(1+i+n,1+j,1,0);
                    }
                }
            }
            int ans=0;
            printf("%d
    ",-Min_cost_max_flow(ss,tt,inf,ans));
        }
        return 0;
    }
    View Code

    1010 Sindar's Art Exhibition

    Unsolved.

    1011 Squrirrel

    题解:题目意思给你一棵树,每条边有一个权值。

    让你求:在将一条边的权值变为零的情况下,一个点到其最远叶子节点的距离的最小值为多少。

    思路:

    先考虑在不使一条边变为零的情况下:我们先dfs处理出,每一个节点到其叶子节点的最远距离l[i],然后求出其沿着父亲节点的最远距离fa[i],则对于这个节点的就是max(l[i],fa[i]),然后在所有节点中的最大距离取个最小值就行了。 现在是可以任意一条边变为零,那么我们先dfs,记录每个节点到其叶子节点的最大值,次大值,第三大值,然后求出其沿着父亲节点的最大值,对于将边变为零的情况,我们只要在DP时加上一维,判断是否江一条边变为零就行了。

    参考代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define pii pair<int,int>
    #define pil pair<int,ll>
    #define PI acos(-1.0)
    #define mkp make_pair
    #define mem(a,b) memset(a,b,sizeof(a))
    const int INF=0x3f3f3f3f;
    const ll inf=0x3f3f3f3f3f3f3f3fll;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=2e5+10;
    int T,n,cnt,head[maxn];
    struct Edge{
        int to,nxt,w;
    } edge[maxn<<1];
    void AddEdge(int u,int v,int w)
    {
        edge[cnt].to=v;
        edge[cnt].w=w;
        edge[cnt].nxt=head[u];
        head[u]=cnt++;    
    }
    int dis[maxn],ans[maxn];
    int f[maxn],s[maxn],t[maxn],fa[maxn][2];
    int fi[maxn][2],se[maxn][2],th[maxn][2];
    
    void Init()
    {
        cnt=0; mem(head,-1);
        mem(dis,0); mem(ans,0);
        for(int i=0;i<=n;++i)
        {
            fi[i][0]=fi[i][1]=0;
            se[i][0]=se[i][1]=0;
            th[i][0]=th[i][1]=0;
            fa[i][0]=fa[i][1]=0;
            f[i]=t[i]=s[i]=0;
            dis[i]=0; 
        }    
    }
    
    void dfs1(int x,int pre)
    {
        for(int i=head[x];~i;i=edge[i].nxt)
        {
            int v=edge[i].to,w=edge[i].w;
            if(v==pre) continue;
            dis[v]=w;
            dfs1(v,x);
            if(w+fi[v][0]>fi[x][0])
            {
                th[x][0]=se[x][0];
                t[x]=s[x];
                se[x][0]=fi[x][0];
                s[x]=f[x];
                fi[x][0]=fi[v][0]+w;
                f[x]=v;
            }
            else if(w+fi[v][0]>se[x][0])
            {
                th[x][0]=se[x][0];
                t[x]=s[x];
                se[x][0]=fi[v][0]+w;
                s[x]=v;
            }
            else if(w+fi[v][0]>th[x][0])
            {
                th[x][0]=fi[v][0]+w;
                t[x]=v;    
            }
        }
        fi[x][1]=min(fi[f[x]][0],dis[f[x]]+max(fi[f[x]][1],se[f[x]][0]));
        se[x][1]=min(fi[s[x]][0],dis[s[x]]+max(fi[s[x]][1],se[s[x]][0]));    
    }    
    
    void dfs2(int x,int pre)
    {
        ans[x]=min(max(fi[x][0],fa[x][1]),max(max(fi[x][1],se[x][0]),fa[x][0]));
        for(int i=head[x];~i;i=edge[i].nxt)
        {
            int v=edge[i].to,w=edge[i].w;
            if(v==pre) continue;
            
            if(f[x]==v)
            {
                fa[v][0]=max(fa[x][0],se[x][0])+w;
                fa[v][1]=min(max(fa[x][0],se[x][0]),min(max(fa[x][0],max(se[x][1],th[x][0])),max(se[x][0],fa[x][1]))+w);    
            }
            else if(s[x]==v)
            {
                fa[v][0]=max(fi[x][0],fa[x][0])+w;
                fa[v][1]=min(max(fi[x][0],fa[x][0]),min(max(fa[x][0],max(fi[x][1],th[x][0])),max(fi[x][0],fa[x][1]))+w);
            }
            else
            {
                fa[v][0]=max(fi[x][0],fa[x][0])+w;
                fa[v][1]=min(max(fi[x][0],fa[x][0]),min(max(fa[x][0],max(fi[x][1],se[x][0])),max(fi[x][0],fa[x][1]))+w);
            }
            dfs2(v,x);
        }
    }
    
    int main()
    {
        T=read();
        while(T--)
        {
            n=read();
            Init();
            int u,v,w;
            for(int i=1;i<n;++i)    
            {
                u=read();v=read();w=read();
                AddEdge(u,v,w);AddEdge(v,u,w);    
            }
            dfs1(1,0);
            dfs2(1,0);
            int val=INF,pos;
            for(int i=1;i<=n;i++)
            {
                   if(ans[i]<val) val=ans[i],pos=i;
                else if(ans[i]==val&&i<pos) pos=i;
            }
            printf("%d %d
    ",pos,val);
        }
        
        return 0;    
    }
    /*
    1
    5
    1 5 1
    1 2 1
    2 3 2
    3 4 1
    */
    View Code

  • 相关阅读:
    数据持久化编程学习总结
    Boost Replaceable by C++11 language features or libraries
    【敬业福bug】支付宝五福卡敬业福太难求 被炒至200元
    由文字生成path后制作写字的动画
    CSS经典布局之弹性布局
    HDU2082 找单词 【母函数】
    HDOJ 题目2475 Box(link cut tree去点找祖先)
    DELPHI中MDI子窗口的关闭 和打开
    sql语句中日期相减的操作
    Delphi编码规范
  • 原文地址:https://www.cnblogs.com/csushl/p/11269471.html
Copyright © 2011-2022 走看看