BoxerTC

Untitled

Jun 28th, 2015
361
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1.  
  2. #include<bits/stdc++.h>
  3. #define N 10005
  4. #define pb(x) push_back(x)
  5. #define MOD 21092013
  6.  
  7. using namespace std;
  8.  
  9. vector<int>G[N];
  10. int L[N], H[N];
  11.  
  12. int getVal(int u, int g){
  13.    
  14.     if(g < L[u] || g > H[u])return 0;
  15.     return H[u] - g + 1;
  16. }
  17.  
  18. long long preffix[N], sum[N], res[N];
  19.  
  20. void DFS(int u, int pd, int g){
  21.    
  22.     long long val = getVal(u, g);
  23.     preffix[u] = val;
  24.    
  25.     for(int i = 0; i < G[u].size(); i++){
  26.        
  27.         int v = G[u][i];   
  28.         if(v == pd)continue;
  29.        
  30.         DFS(v, u, g);
  31.        
  32.         preffix[u] += val * preffix[v];
  33.         if(preffix[u] >= MOD)preffix[u] %= MOD;
  34.        
  35.         res[u] += sum[u] * preffix[v];
  36.         if(res[u] >= MOD)res[u] %= MOD;
  37.        
  38.         sum[u] += preffix[v];
  39.         if(sum[u] >= MOD)sum[u] -= MOD;
  40.     }
  41.    
  42.     res[u] *= val;
  43.     res[u] += preffix[u];
  44.    
  45.     res[u] %= MOD;
  46. }
  47.  
  48. int solve(int g, int n){
  49.    
  50.     for(int i = 0; i < n; i++)sum[i] = res[i] = preffix[i] = 0;
  51.     DFS(0, 0, g);
  52.    
  53.     int ans = 0;
  54.     for(int i = 0; i < n; i++){
  55.         ans += res[i];
  56.         if(ans >= MOD)ans -= MOD;
  57.     }
  58.    
  59.     return ans;
  60. }
  61.  
  62. int main(){
  63.    
  64.     int tc = 0, caso = 1;
  65.     scanf("%d", &tc);
  66.    
  67.     while(tc--){
  68.    
  69.         int n;
  70.         scanf("%d", &n);
  71.        
  72.         for(int i = 0; i < n; i++)G[i].clear();
  73.        
  74.         int u, v;
  75.         for(int i = 0; i < n - 1; i++){
  76.            
  77.             scanf("%d%d", &u, &v);
  78.             u--, v--;
  79.            
  80.             G[u].pb(v);
  81.             G[v].pb(u);
  82.         }
  83.        
  84.         for(int i = 0; i < n; i++)scanf("%d", &L[i]);
  85.         for(int i = 0; i < n; i++)scanf("%d", &H[i]);
  86.            
  87.         printf("Case %d:\n", caso++);
  88.        
  89.         for(int i = 1; i <= 50; i++)
  90.             printf("%d: %d\n", i, solve(i, n));
  91.  
  92.     }
  93.    
  94. }
Advertisement
Add Comment
Please, Sign In to add comment