zoukankan      html  css  js  c++  java
  • BZOJ 2286 消耗战

    //Twenty
    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<queue>
    #include<vector>
    const int maxn=500000+299;
    typedef long long LL;
    using namespace std;
    int k,kk,ecnt,n,R[maxn],fir[maxn],nxt[maxn],to[maxn],val[maxn],vis[maxn],f[maxn][21];
    int fr[maxn],nx[maxn],tt[maxn];
    int dfs_cnt,ls[maxn],le[maxn],a[maxn],sta[maxn],mi[maxn],time_now;
    bool cmp(int a,int b){
      return ls[a]<ls[b];
    }
    void add1(int u,int v,int w){
       nx[++ecnt]=fr[u]; fr[u]=ecnt; tt[ecnt]=v; val[ecnt]=w;
    }
    void add(int u,int v,int w){
       nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v; val[ecnt]=w;
    }
    void dfs(int x,int fa){
      /*(if(x==67) 
        {
           int debug=1;
        }*/
       f[x][0]=fa; R[x]=R[fa]+1;
       ls[x]=++dfs_cnt;
       for(int i=1;i<=20;i++)
       f[x][i]=f[f[x][i-1]][i-1]; //在dfs之前不是之后QAQ 
       for(int i=fr[x];i;i=nx[i])
       if(tt[i]!=fa)
       {
            if(x==1) mi[tt[i]]=val[i];
            else mi[tt[i]]=min(mi[x],val[i]);
         dfs(tt[i],x);
       }
       le[x]=dfs_cnt;
       
    }
    int lca(int x,int y){
        if(R[x]<R[y]) swap(x,y);
        for(int i=20;i>=0;i--){
            if(R[x]==R[y]) break;
            if(R[x]-(1<<i)>=R[y]) x=f[x][i];
        }
        if(x==y) return x;
        for(int i=20;i>=0;i--)
          if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
        return f[x][0];
    }
    bool in(int fa,int x){
        return ls[fa]<=ls[x]&&le[fa]>=le[x];
    }
    LL tree_dp(int x){
       LL res=0;
       for(int &i=fir[x];i;i=nxt[i]){
          res+=tree_dp(to[i]);
       }
       if(vis[x]==time_now) return (LL)mi[x];
       if(x==1) return res;
       else return min(res,(LL)mi[x]);
    }
    int main()
    { 
       scanf("%d",&n);
       for(int i=1;i<n;i++){
         int x,y,w;
         scanf("%d%d%d",&x,&y,&w);
         add1(x,y,w); add1(y,x,w);
       }
       dfs(1,0); int now;
       scanf("%d",&now);
       for(time_now=1;time_now<=now;time_now++){
          scanf("%d",&k); kk=k;
          for(int i=1;i<=k;i++){
            scanf("%d",&a[i]);
            vis[a[i]]=time_now;
          }
          sort(a+1,a+k+1,cmp);
          //k=unique(a+1,a+k+1)-(a+1);
          for(int i=2;i<=k;i++) {
          a[++kk]=lca(a[i],a[i-1]);
          }
          a[++kk]=1;
          sort(a+1,a+kk+1,cmp); 
          kk=unique(a+1,a+kk+1)-(a+1);
          int top=0; ecnt=0;
          for(int i=1;i<=kk;i++){
             while(top&&!in(sta[top],a[i])){
              top--;
             }
             if(top){
                 add(sta[top],a[i],1);
             }
             sta[++top]=a[i];
          }
          //mi[1]=1e9+7; 傻了吧 
          printf("%lld
    ",tree_dp(1));
       }
       return 0;
    }
    消耗战
  • 相关阅读:
    移动端的文本框获取焦点时导致fixed或absolute定位的按钮被手机键盘顶上去的问题
    移动端css适配
    【两种方式】vuex 如何监听页面状态的变化
    VUE中使用lib-flexible和 px2rem-loader
    在vue移动端使用lib-flexible和px2remLoader适配屏幕
    两步创建vue全局组件
    《心淡》钢伴
    原生JS代码封装(显示、隐藏)
    原生JS代码封装(添加cookie,获取cookie)
    原生JS代码封装(输入id名、class名、标签名 返回 "object HTMLDivElement")
  • 原文地址:https://www.cnblogs.com/Achenchen/p/7475027.html
Copyright © 2011-2022 走看看