Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define N 10005
- #define pb(x) push_back(x)
- #define MOD 21092013
- using namespace std;
- vector<int>G[N];
- int L[N], H[N];
- int getVal(int u, int g){
- if(g < L[u] || g > H[u])return 0;
- return H[u] - g + 1;
- }
- long long preffix[N], sum[N], res[N];
- void DFS(int u, int pd, int g){
- long long val = getVal(u, g);
- preffix[u] = val;
- for(int i = 0; i < G[u].size(); i++){
- int v = G[u][i];
- if(v == pd)continue;
- DFS(v, u, g);
- preffix[u] += val * preffix[v];
- if(preffix[u] >= MOD)preffix[u] %= MOD;
- res[u] += sum[u] * preffix[v];
- if(res[u] >= MOD)res[u] %= MOD;
- sum[u] += preffix[v];
- if(sum[u] >= MOD)sum[u] -= MOD;
- }
- res[u] *= val;
- res[u] += preffix[u];
- res[u] %= MOD;
- }
- int solve(int g, int n){
- for(int i = 0; i < n; i++)sum[i] = res[i] = preffix[i] = 0;
- DFS(0, 0, g);
- int ans = 0;
- for(int i = 0; i < n; i++){
- ans += res[i];
- if(ans >= MOD)ans -= MOD;
- }
- return ans;
- }
- int main(){
- int tc = 0, caso = 1;
- scanf("%d", &tc);
- while(tc--){
- int n;
- scanf("%d", &n);
- for(int i = 0; i < n; i++)G[i].clear();
- int u, v;
- for(int i = 0; i < n - 1; i++){
- scanf("%d%d", &u, &v);
- u--, v--;
- G[u].pb(v);
- G[v].pb(u);
- }
- for(int i = 0; i < n; i++)scanf("%d", &L[i]);
- for(int i = 0; i < n; i++)scanf("%d", &H[i]);
- printf("Case %d:\n", caso++);
- for(int i = 1; i <= 50; i++)
- printf("%d: %d\n", i, solve(i, n));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment