zoukankan      html  css  js  c++  java
  • 2019ICPC 上海现场赛补题

    题目连接:传送门

    B - Prefix Code

    签到题,字符串hash、unordered_map、字典树都可以

     1 #include<bits/stdc++.h>
     2 /*
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<vector>
     7 #include<cctype>
     8 #include<queue>
     9 #include<algorithm>
    10 #include<map>
    11 #include<set>
    12 */
    13 #pragma GCC optimize(2)
    14 using namespace std;
    15 typedef long long LL;
    16 typedef pair<int,int> pii;
    17 typedef pair<double,double> pdd;
    18 const int N=2e4+5;
    19 const int M=3005;
    20 const int inf=0x3f3f3f3f;
    21 const LL mod=1e9+7;
    22 const double eps=1e-9;
    23 const long double pi=acos(-1.0L);
    24 #define ls (i<<1)
    25 #define rs (i<<1|1)
    26 #define fi first
    27 #define se second
    28 #define pb push_back
    29 #define mk make_pair
    30 #define mem(a,b) memset(a,b,sizeof(a))
    31 LL read()
    32 {
    33     LL x=0,t=1;
    34     char ch;
    35     while(!isdigit(ch=getchar())) if(ch=='-') t=-1;
    36     while(isdigit(ch)){ x=10*x+ch-'0'; ch=getchar(); }
    37     return x*t;
    38 }
    39 unordered_map<string,int> mp;
    40 char a[N][15];
    41 int main()
    42 {
    43     int T=read(),test=0;
    44     while(T--)
    45     {
    46         int n=read();
    47         for(int i=1;i<=n;i++)
    48         {
    49             scanf("%s",a[i]);
    50             char s[15];
    51             mem(s,0);
    52             int l=strlen(a[i]);
    53             for(int j=0;j<l;j++)
    54                 s[j]=a[i][j],mp[s]++;
    55         }
    56         int ans=0;
    57         for(int i=1;i<=n;i++)
    58             if(mp[a[i]]>1) {
    59                 ans=1;
    60                 break;
    61             }
    62         printf("Case #%d: ",++test);
    63         if(!ans) printf("Yes
    ");
    64         else printf("No
    ");
    65         mp.clear();
    66     }
    67     return 0;
    68 }
    View Code

    D - Spanning Tree Removal

    构造题。第i棵树,按 i  , i+1 , i-1 , i+2 , i-2 , i+3 ....  注意取模

     1 #include<bits/stdc++.h>
     2 /*
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<vector>
     7 #include<cctype>
     8 #include<queue>
     9 #include<algorithm>
    10 #include<map>
    11 #include<set>
    12 */
    13 #pragma GCC optimize(2)
    14 using namespace std;
    15 typedef long long LL;
    16 typedef pair<int,int> pii;
    17 typedef pair<double,double> pdd;
    18 const int N=2e3+5;
    19 const int M=3005;
    20 const int inf=0x3f3f3f3f;
    21 const LL mod=1e9+7;
    22 const double eps=1e-9;
    23 const long double pi=acos(-1.0L);
    24 #define ls (i<<1)
    25 #define rs (i<<1|1)
    26 #define fi first
    27 #define se second
    28 #define pb push_back
    29 #define mk make_pair
    30 #define mem(a,b) memset(a,b,sizeof(a))
    31 LL read()
    32 {
    33     LL x=0,t=1;
    34     char ch;
    35     while(!isdigit(ch=getchar())) if(ch=='-') t=-1;
    36     while(isdigit(ch)){ x=10*x+ch-'0'; ch=getchar(); }
    37     return x*t;
    38 }
    39 
    40 int main()
    41 {
    42     int T=read(),test=0;
    43     while(T--)
    44     {
    45         int n=read();
    46         printf("Case #%d: %d
    ",++test,n/2);
    47         for(int i=1;i<=n/2;i++)
    48         {
    49             int t=1,x=i-1;
    50             for(int j=1;j<n;j++)
    51             {
    52                 int y=(x+t*j+n)%n;
    53                 printf("%d %d
    ",x+1,y+1);
    54                 x=y;
    55                 t*=-1;
    56             }
    57         }
    58     }
    59     return 0;
    60 }
    View Code

    E - Cave Escape

    模拟生成矩阵,再建边求最大生成树(kruskal + 桶排序 ,据说快排会被卡)

     1 #include<bits/stdc++.h>
     2 /*
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<vector>
     7 #include<cctype>
     8 #include<queue>
     9 #include<algorithm>
    10 #include<map>
    11 #include<set>
    12 */
    13 #pragma GCC optimize(2)
    14 using namespace std;
    15 typedef long long LL;
    16 typedef pair<int,int> pii;
    17 typedef pair<double,double> pdd;
    18 const int N=1e3+5;
    19 const int M=1e4+5;
    20 const int inf=0x3f3f3f3f;
    21 const LL mod=1e9+7;
    22 const double eps=1e-9;
    23 const long double pi=acos(-1.0L);
    24 #define ls (i<<1)
    25 #define rs (i<<1|1)
    26 #define fi first
    27 #define se second
    28 #define pb push_back
    29 #define mk make_pair
    30 #define mem(a,b) memset(a,b,sizeof(a))
    31 LL read()
    32 {
    33     LL x=0,t=1;
    34     char ch;
    35     while(!isdigit(ch=getchar())) if(ch=='-') t=-1;
    36     while(isdigit(ch)){ x=10*x+ch-'0'; ch=getchar(); }
    37     return x*t;
    38 }
    39 int n,m,sx,sy,ex,ey,x1,x2,x3,a,b,c,p;
    40 int v[N][N],f[N*N];
    41 vector<pii> w[M];
    42 int getf(int x)
    43 {
    44     return x==f[x]?f[x]:f[x]=getf(f[x]);
    45 }
    46 int main()
    47 {
    48     int T=read(),test=0;
    49     while(T--)
    50     {
    51         scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&ex,&ey);
    52         scanf("%d%d%d%d%d%d",&x1,&x2,&a,&b,&c,&p);
    53         for(int i=1;i<=n*m;i++) f[i]=i;
    54         for(int i=0;i<M;i++) w[i].clear();
    55         int cnt=1;
    56         for(int i=1;i<=n;i++)
    57             for(int j=1;j<=m;j++,cnt++)
    58                 if(cnt>=3) x3=(a*x2+b*x1+c)%p,v[i][j]=x3,x1=x2,x2=x3;
    59                 else if(cnt==2) v[i][j]=x2;
    60                 else v[i][j]=x1;
    61         //for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) printf("%d%c",v[i][j],j==m?'
    ':' ');
    62         for(int i=1;i<=n;i++)
    63             for(int j=1;j<=m;j++){
    64                 if(i<n) w[v[i][j]*v[i+1][j]].pb(mk((i-1)*m+j,i*m+j));
    65                 if(j<m) w[v[i][j]*v[i][j+1]].pb(mk((i-1)*m+j,(i-1)*m+j+1));
    66             }
    67         LL ans=0;
    68         for(int i=10000;i>=0;i--)
    69         {
    70             for(auto x:w[i])
    71             {
    72                 int u=x.fi,v=x.se;
    73                 int fu=getf(u),fv=getf(v);
    74                 if(fu!=fv) f[fu]=fv,ans+=i;
    75             }
    76         }
    77         printf("Case #%d: %lld
    ",++test,ans);
    78     }
    79     return 0;
    80 }
    View Code

    H - Tree Partition

    正着做不太容易,可以反过来考虑二分答案,check(x)时自底向上贪心。对于每个点u, 维护一个sum[u] (表示以 u 为根的树中,包含 u 的子树权值和且其权值和小于等于x );

    贪心的话,则是 sum[u]+=sum[v] ,v是u的儿子结点;若sum[u] > x 了,意味着我必须要切割这棵树,但又要尽可能少切割,因此只需先切割大的sum[v](由于自底向上,sum[v]一定小等于x),直到sum[u]<=x;

    #include<bits/stdc++.h>
    /*
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<cctype>
    #include<queue>
    #include<algorithm>
    #include<map>
    #include<set>
    */
    #pragma GCC optimize(2)
    using namespace std;
    typedef long long LL;
    typedef pair<int,int> pii;
    typedef pair<double,double> pdd;
    const int N=2e5+5;
    const int M=3005;
    const int inf=0x3f3f3f3f;
    const LL mod=1e9+7;
    const double eps=1e-9;
    const long double pi=acos(-1.0L);
    #define ls (i<<1)
    #define rs (i<<1|1)
    #define fi first
    #define se second
    #define pb push_back
    #define mk make_pair
    #define mem(a,b) memset(a,b,sizeof(a))
    LL read()
    {
        LL x=0,t=1;
        char ch;
        while(!isdigit(ch=getchar())) if(ch=='-') t=-1;
        while(isdigit(ch)){ x=10*x+ch-'0'; ch=getchar(); }
        return x*t;
    }
    LL w[N],sum[N];
    int cnt;
    vector<int> e[N];
    void dfs(int u,int pre,LL k)
    {
        sum[u]=w[u];
        vector<LL> a;
        for(auto v:e[u])
        {
            if(v==pre) continue;
            dfs(v,u,k);
            sum[u]+=sum[v];
            a.pb(sum[v]);
        }
        sort(a.begin(),a.end());
        int p=a.size();
        while(sum[u]>k) sum[u]-=a[--p],cnt++;
    }
    int main()
    {
        int T=read(),test=0;
        while(T--)
        {
            int n=read(),k=read();
            for(int i=1;i<n;i++)
            {
                int x=read(),y=read();
                e[x].pb(y);
                e[y].pb(x);
            }
            LL l=0,r=0;
            for(int i=1;i<=n;i++) w[i]=read(),l=max(l,w[i]),r+=w[i];
            while(l<=r)
            {
                LL mid=l+r>>1;
                cnt=0;
                dfs(1,0,mid);
                //printf("cnt = %d,mid = %d
    ",cnt,mid);
                if(cnt<k) r=mid-1;
                else l=mid+1;
            }
            printf("Case #%d: %lld
    ",++test,l);
            for(int i=1;i<=n;i++) e[i].clear();
        }
        return 0;
    }
    View Code

    F - A Simple Problem On A Tree

    贼恶心的一个大树剖,写了两遍才过。为了简化代码,写了很多函数;操作1 区间赋值w 可以直接写,但也可以转化成 乘以0 再加上w。

    其中需要注意,立方和、平方和、一次幂和的更新顺序;还有延时标记的初始化

      1 #include<bits/stdc++.h>
      2 /*
      3 #include<cstdio>
      4 #include<cmath>
      5 #include<cstring>
      6 #include<vector>
      7 #include<cctype>
      8 #include<queue>
      9 #include<algorithm>
     10 #include<map>
     11 #include<set>
     12 */
     13 #pragma GCC optimize(2)
     14 using namespace std;
     15 typedef long long LL;
     16 typedef pair<int,int> pii;
     17 typedef pair<double,double> pdd;
     18 const int N=2e5+5;
     19 const int M=3005;
     20 const int inf=0x3f3f3f3f;
     21 const LL mod=1e9+7;
     22 const double eps=1e-9;
     23 const long double pi=acos(-1.0L);
     24 #define ls (i<<1)
     25 #define rs (i<<1|1)
     26 #define fi first
     27 #define se second
     28 #define pb push_back
     29 #define mk make_pair
     30 #define mem(a,b) memset(a,b,sizeof(a))
     31 LL read()
     32 {
     33     LL x=0,t=1;
     34     char ch;
     35     while(!isdigit(ch=getchar())) if(ch=='-') t=-1;
     36     while(isdigit(ch)){ x=10*x+ch-'0'; ch=getchar(); }
     37     return x*t;
     38 }
     39 LL lazy1[N<<2],lazy2[N<<2];
     40 int deep[N],id[N],top[N],f[N],cnt[N],son[N],tot,n,m,a[N],rk[N];
     41 vector<int> e[N];
     42 struct node{ LL x,y,z; }c[N<<2];
     43 void dfs(int u,int pre)
     44 {
     45     f[u]=pre;
     46     cnt[u]=1;
     47     deep[u]=deep[pre]+1;
     48     for(auto v:e[u])
     49     {
     50         if(v==pre) continue;
     51         dfs(v,u);
     52         cnt[u]+=cnt[v];
     53         if(cnt[son[u]]<cnt[v]) son[u]=v;
     54     }
     55 }
     56 void dfs2(int u,int pre,int t)
     57 {
     58     top[u]=t;
     59     id[u]=++tot;
     60     rk[tot]=u;
     61     if(son[u]) dfs2(son[u],u,t);
     62     for(auto v:e[u])
     63         if(v!=son[u]&&v!=pre) dfs2(v,u,v);
     64 }
     65 inline LL s2(LL x)
     66 {
     67     return x*x%mod;
     68 }
     69 inline LL s3(LL x)
     70 {
     71     return x*x%mod*x%mod;
     72 }
     73 void calmul(int i,LL w)
     74 {
     75     c[i].x=c[i].x*w%mod;
     76     c[i].y=c[i].y*s2(w)%mod;
     77     c[i].z=c[i].z*s3(w)%mod;
     78     lazy1[i]=lazy1[i]*w%mod;
     79     lazy2[i]=lazy2[i]*w%mod;
     80 }
     81 void caladd(int i,LL len,LL w)
     82 {
     83     c[i].z=(c[i].z+len*s3(w)%mod+3LL*s2(w)%mod*c[i].x+3LL*w%mod*c[i].y%mod )%mod;
     84     c[i].y=(c[i].y+len*s2(w)%mod+2LL*w%mod*c[i].x%mod )%mod;
     85     c[i].x=(c[i].x+len*w%mod )%mod;
     86     lazy2[i]=(lazy2[i]+w)%mod;
     87 }
     88 void pushup(int i)
     89 {
     90     c[i].x=(c[ls].x+c[rs].x)%mod;
     91     c[i].y=(c[ls].y+c[rs].y)%mod;
     92     c[i].z=(c[ls].z+c[rs].z)%mod;
     93 }
     94 void pushdown(int i,int l,int r)
     95 {
     96     int mid=l+r>>1;
     97     calmul(ls,lazy1[i]);
     98     calmul(rs,lazy1[i]);
     99     caladd(ls,mid-l+1,lazy2[i]);
    100     caladd(rs,r-mid,lazy2[i]);
    101     lazy1[i]=1;
    102     lazy2[i]=0;
    103 }
    104 void build(int i,int l,int r)
    105 {
    106     lazy1[i]=1;
    107     lazy2[i]=0;
    108     if(l==r)
    109     {
    110         LL t=a[rk[l]];
    111         c[i].x=t;
    112         c[i].y=s2(t);
    113         c[i].z=s3(t);
    114         return ;
    115     }
    116     int mid=l+r>>1;
    117     build(ls,l,mid);
    118     build(rs,mid+1,r);
    119     pushup(i);
    120 }
    121 void update(int i,int l,int r,int ll,int rr,int flag,LL w)
    122 {
    123     if(ll<=l&&r<=rr)
    124     {
    125         if(flag==1)
    126         {
    127             LL len=r-l+1;
    128             lazy1[i]=0;
    129             lazy2[i]=w;
    130             c[i].x=w*len%mod;
    131             c[i].y=s2(w)*len%mod;
    132             c[i].z=s3(w)*len%mod;
    133         }
    134         else if(flag==2) caladd(i,r-l+1,w);
    135         else calmul(i,w);
    136         return ;
    137     }
    138     pushdown(i,l,r);
    139     int mid=l+r>>1;
    140     if(mid>=ll) update(ls,l,mid,ll,rr,flag,w);
    141     if(mid<rr) update(rs,mid+1,r,ll,rr,flag,w);
    142     pushup(i);
    143 }
    144 LL query(int i,int l,int r,int ll,int rr)
    145 {
    146     if(ll<=l&&r<=rr) return c[i].z;
    147     pushdown(i,l,r);
    148     LL t1=0,t2=0;
    149     int mid=l+r>>1;
    150     if(mid>=ll) t1=query(ls,l,mid,ll,rr);
    151     if(mid<rr) t2=query(rs,mid+1,r,ll,rr);
    152     return (t1+t2)%mod;
    153 }
    154 void change(int x,int y,int flag,LL w)
    155 {
    156     while(top[x]!=top[y])
    157     {
    158         if(deep[top[x]]<deep[top[y]]) swap(x,y);
    159         update(1,1,n,id[top[x]],id[x],flag,w);
    160         x=f[top[x]];
    161     }
    162     if(id[x]>id[y]) swap(x,y);
    163     update(1,1,n,id[x],id[y],flag,w);
    164 }
    165 LL getans(int x,int y)
    166 {
    167     LL ans=0;
    168     while(top[x]!=top[y])
    169     {
    170         if(deep[top[x]]<deep[top[y]]) swap(x,y);
    171         ans+=query(1,1,n,id[top[x]],id[x]);
    172         ans%=mod;
    173         x=f[top[x]];
    174     }
    175     if(id[x]>id[y]) swap(x,y);
    176     ans+=query(1,1,n,id[x],id[y]);
    177     ans%=mod;
    178     return ans;
    179 }
    180 inline void init()
    181 {
    182     tot=0;
    183     mem(son,0);
    184     for(int i=1;i<=n;i++) e[i].clear();
    185 }
    186 int main()
    187 {
    188     int T=read(),test=0;
    189     while(T--)
    190     {
    191         n=read();
    192         for(int i=1;i<n;i++)
    193         {
    194             int x=read(),y=read();
    195             e[x].pb(y);
    196             e[y].pb(x);
    197         }
    198         for(int i=1;i<=n;i++) a[i]=read();
    199         dfs(1,0);
    200         dfs2(1,0,1);
    201         build(1,1,n);
    202         m=read();
    203         printf("Case #%d:
    ",++test);
    204         while(m--)
    205         {
    206             int cmd=read(),u=read(),v=read();
    207             if(cmd==4) printf("%lld
    ",getans(u,v));
    208             else
    209             {
    210                 LL w=read();
    211                 change(u,v,cmd,w);
    212             }
    213         }
    214         init();
    215     }
    216     return 0;
    217 }
    View Code

    K - Color Graph

    考虑到题目要求不能存在奇数环(简单环),而二分图正好满足要求,那么就二进制枚举二分图,再去掉同一集合的边即可,对于每一次枚举得到的ans 取最大。

      1 #include<bits/stdc++.h>
      2 /*
      3 #include<cstdio>
      4 #include<cmath>
      5 #include<cstring>
      6 #include<vector>
      7 #include<cctype>
      8 #include<queue>
      9 #include<algorithm>
     10 #include<map>
     11 #include<set>
     12 */
     13 #pragma GCC optimize(2)
     14 using namespace std;
     15 typedef long long LL;
     16 typedef pair<int,int> pii;
     17 typedef pair<double,double> pdd;
     18 const int N=2e5+5;
     19 const int M=3005;
     20 const int inf=0x3f3f3f3f;
     21 const LL mod=1e9+7;
     22 const double eps=1e-9;
     23 const long double pi=acos(-1.0L);
     24 #define ls (i<<1)
     25 #define rs (i<<1|1)
     26 #define fi first
     27 #define se second
     28 #define pb push_back
     29 #define mk make_pair
     30 #define mem(a,b) memset(a,b,sizeof(a))
     31 LL read()
     32 {
     33     LL x=0,t=1;
     34     char ch;
     35     while(!isdigit(ch=getchar())) if(ch=='-') t=-1;
     36     while(isdigit(ch)){ x=10*x+ch-'0'; ch=getchar(); }
     37     return x*t;
     38 }
     39 LL lazy1[N<<2],lazy2[N<<2];
     40 int deep[N],id[N],top[N],f[N],cnt[N],son[N],tot,n,m,a[N],rk[N];
     41 vector<int> e[N];
     42 struct node{ LL x,y,z; }c[N<<2];
     43 void dfs(int u,int pre)
     44 {
     45     f[u]=pre;
     46     cnt[u]=1;
     47     deep[u]=deep[pre]+1;
     48     for(auto v:e[u])
     49     {
     50         if(v==pre) continue;
     51         dfs(v,u);
     52         cnt[u]+=cnt[v];
     53         if(cnt[son[u]]<cnt[v]) son[u]=v;
     54     }
     55 }
     56 void dfs2(int u,int pre,int t)
     57 {
     58     top[u]=t;
     59     id[u]=++tot;
     60     rk[tot]=u;
     61     if(son[u]) dfs2(son[u],u,t);
     62     for(auto v:e[u])
     63         if(v!=son[u]&&v!=pre) dfs2(v,u,v);
     64 }
     65 inline LL s2(LL x)
     66 {
     67     return x*x%mod;
     68 }
     69 inline LL s3(LL x)
     70 {
     71     return x*x%mod*x%mod;
     72 }
     73 void calmul(int i,LL w)
     74 {
     75     c[i].x=c[i].x*w%mod;
     76     c[i].y=c[i].y*s2(w)%mod;
     77     c[i].z=c[i].z*s3(w)%mod;
     78     lazy1[i]=lazy1[i]*w%mod;
     79     lazy2[i]=lazy2[i]*w%mod;
     80 }
     81 void caladd(int i,LL len,LL w)
     82 {
     83     c[i].z=(c[i].z+len*s3(w)%mod+3LL*s2(w)%mod*c[i].x+3LL*w%mod*c[i].y%mod )%mod;
     84     c[i].y=(c[i].y+len*s2(w)%mod+2LL*w%mod*c[i].x%mod )%mod;
     85     c[i].x=(c[i].x+len*w%mod )%mod;
     86     lazy2[i]=(lazy2[i]+w)%mod;
     87 }
     88 void pushup(int i)
     89 {
     90     c[i].x=(c[ls].x+c[rs].x)%mod;
     91     c[i].y=(c[ls].y+c[rs].y)%mod;
     92     c[i].z=(c[ls].z+c[rs].z)%mod;
     93 }
     94 void pushdown(int i,int l,int r)
     95 {
     96     int mid=l+r>>1;
     97     calmul(ls,lazy1[i]);
     98     calmul(rs,lazy1[i]);
     99     caladd(ls,mid-l+1,lazy2[i]);
    100     caladd(rs,r-mid,lazy2[i]);
    101     lazy1[i]=1;
    102     lazy2[i]=0;
    103 }
    104 void build(int i,int l,int r)
    105 {
    106     lazy1[i]=1;
    107     lazy2[i]=0;
    108     if(l==r)
    109     {
    110         LL t=a[rk[l]];
    111         c[i].x=t;
    112         c[i].y=s2(t);
    113         c[i].z=s3(t);
    114         return ;
    115     }
    116     int mid=l+r>>1;
    117     build(ls,l,mid);
    118     build(rs,mid+1,r);
    119     pushup(i);
    120 }
    121 void update(int i,int l,int r,int ll,int rr,int flag,LL w)
    122 {
    123     if(ll<=l&&r<=rr)
    124     {
    125         if(flag==1)
    126         {
    127             LL len=r-l+1;
    128             lazy1[i]=0;
    129             lazy2[i]=w;
    130             c[i].x=w*len%mod;
    131             c[i].y=s2(w)*len%mod;
    132             c[i].z=s3(w)*len%mod;
    133         }
    134         else if(flag==2) caladd(i,r-l+1,w);
    135         else calmul(i,w);
    136         return ;
    137     }
    138     pushdown(i,l,r);
    139     int mid=l+r>>1;
    140     if(mid>=ll) update(ls,l,mid,ll,rr,flag,w);
    141     if(mid<rr) update(rs,mid+1,r,ll,rr,flag,w);
    142     pushup(i);
    143 }
    144 LL query(int i,int l,int r,int ll,int rr)
    145 {
    146     if(ll<=l&&r<=rr) return c[i].z;
    147     pushdown(i,l,r);
    148     LL t1=0,t2=0;
    149     int mid=l+r>>1;
    150     if(mid>=ll) t1=query(ls,l,mid,ll,rr);
    151     if(mid<rr) t2=query(rs,mid+1,r,ll,rr);
    152     return (t1+t2)%mod;
    153 }
    154 void change(int x,int y,int flag,LL w)
    155 {
    156     while(top[x]!=top[y])
    157     {
    158         if(deep[top[x]]<deep[top[y]]) swap(x,y);
    159         update(1,1,n,id[top[x]],id[x],flag,w);
    160         x=f[top[x]];
    161     }
    162     if(id[x]>id[y]) swap(x,y);
    163     update(1,1,n,id[x],id[y],flag,w);
    164 }
    165 LL getans(int x,int y)
    166 {
    167     LL ans=0;
    168     while(top[x]!=top[y])
    169     {
    170         if(deep[top[x]]<deep[top[y]]) swap(x,y);
    171         ans+=query(1,1,n,id[top[x]],id[x]);
    172         ans%=mod;
    173         x=f[top[x]];
    174     }
    175     if(id[x]>id[y]) swap(x,y);
    176     ans+=query(1,1,n,id[x],id[y]);
    177     ans%=mod;
    178     return ans;
    179 }
    180 inline void init()
    181 {
    182     tot=0;
    183     mem(son,0);
    184     for(int i=1;i<=n;i++) e[i].clear();
    185 }
    186 int main()
    187 {
    188     int T=read(),test=0;
    189     while(T--)
    190     {
    191         n=read();
    192         for(int i=1;i<n;i++)
    193         {
    194             int x=read(),y=read();
    195             e[x].pb(y);
    196             e[y].pb(x);
    197         }
    198         for(int i=1;i<=n;i++) a[i]=read();
    199         dfs(1,0);
    200         dfs2(1,0,1);
    201         build(1,1,n);
    202         m=read();
    203         printf("Case #%d:
    ",++test);
    204         while(m--)
    205         {
    206             int cmd=read(),u=read(),v=read();
    207             if(cmd==4) printf("%lld
    ",getans(u,v));
    208             else
    209             {
    210                 LL w=read();
    211                 change(u,v,cmd,w);
    212             }
    213         }
    214         init();
    215     }
    216     return 0;
    217 }
    View Code
  • 相关阅读:
    PHP之数据库操作(一)
    PHP之字符串操作
    Subline使用方法
    POST和GET的区别(面试回答)
    面试题(1)
    http协议
    JS 闭包(内存溢出与内存泄漏)(垃圾回收机制)
    JS----事件机制 事件冒泡 事件捕获 事件委托
    js的数据类型、判断对象类型 js对象
    JS----DOM节点操作:创建 ,插入,删除,复制,查找节点
  • 原文地址:https://www.cnblogs.com/DeepJay/p/12853653.html
Copyright © 2011-2022 走看看