jatarc2004

Untitled

Apr 13th, 2025
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. #define double long double
  6. const int MOD=998244353;
  7. const int INF=1e18;
  8.  
  9. int bin_pow(int a, int b){
  10.     int ans=1;
  11.     while(b){
  12.         if(b&1){
  13.             ans*=a;
  14.             ans%=MOD;
  15.         }
  16.         a*=a;
  17.         a%=MOD;
  18.         b>>=1;
  19.     }
  20.     return ans;
  21. }
  22.  
  23. void dfs(int x, int par, vector<int> g[], vector<vector<int>>&pf, vector<int>&f, int m){
  24.     pf[x][f[x]-1]++;
  25.     for(auto it:g[x]){
  26.         if(it==par) continue;
  27.         dfs(it,x,g,pf,f,m);
  28.         for(int i=0; i<m; i++) pf[x][i]+=pf[it][i];
  29.     }
  30. }
  31.  
  32. void dfs2(int x, int par, vector<int> g[], vector<vector<vector<int>>>&dp, int m, vector<vector<int>>&pf){
  33.     for(int i=0; i<m; i++){
  34.         for(int j=0; j<3; j++){
  35.             dp[x][i][j]+=dp[par][i][j];
  36.             dp[x][i][j]%=MOD;
  37.         }
  38.         if(pf[x][i]==0){
  39.             dp[x][i][2]+=1;
  40.             dp[x][i][2]%=MOD;
  41.         }
  42.         else if(pf[x][i]==1){
  43.             dp[x][i][1]+=1;
  44.             dp[x][i][1]%=MOD;
  45.             dp[x][i][2]+=bin_pow(2,MOD-2);
  46.             dp[x][i][2]%=MOD;
  47.         }
  48.         else{
  49.             dp[x][i][0]+=bin_pow(pf[x][i]-1,MOD-2);
  50.             dp[x][i][0]%=MOD;
  51.             dp[x][i][1]+=bin_pow(pf[x][i],MOD-2);
  52.             dp[x][i][1]%=MOD;
  53.             dp[x][i][2]+=bin_pow(pf[x][i]+1,MOD-2);
  54.             dp[x][i][2]%=MOD;
  55.         }
  56.     }
  57.     for(auto it:g[x]){
  58.         if(it==par) continue;
  59.         dfs2(it,x,g,dp,m,pf);
  60.     }
  61. }
  62.  
  63. signed main() {
  64.     ios_base::sync_with_stdio(false);
  65.     cin.tie(NULL);
  66.     int t;
  67.     cin>>t;
  68.     while(t--){
  69.         int n, m;
  70.         cin>>n>>m;
  71.         vector<int> v(m);
  72.         vector<int> f(n+1);
  73.         for(int i=1; i<=n; i++) cin>>f[i];
  74.         for(int i=0; i<m; i++) cin>>v[i];
  75.         vector<int> g[n+1];
  76.         for(int i=0; i<n-1; i++){
  77.             int a, b;
  78.             cin>>a>>b;
  79.             g[a].push_back(b);
  80.             g[b].push_back(a);
  81.         }
  82.         vector<vector<int>> pf(n+1, vector<int>(m,0));
  83.         dfs(1,0,g,pf,f,m);
  84.         double ini = 0;
  85.         int init = 0;
  86.         for(int i=1; i<=n; i++){
  87.             for(int j=0; j<m; j++){
  88.                 if(!pf[i][j]) continue;
  89.                 int dl=v[j]*bin_pow(pf[i][j],MOD-2);
  90.                 dl%=MOD;
  91.                 init+=dl;
  92.                 init%=MOD;
  93.             }
  94.         }
  95.         vector<vector<vector<int>>> dp(n+1, vector<vector<int>>(m, vector<int>(3,0)));
  96.         dfs2(1,0,g,dp,m,pf);
  97.         int q;
  98.         cin>>q;
  99.         int ans = init;
  100.         while(q--){
  101.             int x, r;
  102.             cin>>x>>r;
  103.             if(f[x]==r) cout<<ans<<'\n';
  104.             else{
  105.                 int d=f[x]-1;
  106.                 r--;
  107.                 int tm=ans;
  108.                 tm-=dp[x][d][1]*v[d];
  109.                 tm%=MOD;
  110.                 tm-=dp[x][r][1]*v[r];
  111.                 tm%=MOD;
  112.                 tm+=dp[x][d][0]*v[d];
  113.                 tm%=MOD;
  114.                 tm+=dp[x][r][2]*v[r];
  115.                 tm%=MOD;
  116.                 tm+=MOD;
  117.                 tm%=MOD;
  118.                 cout<<tm<<'\n';
  119.             }
  120.         }
  121.     }
  122. }
Advertisement
Add Comment
Please, Sign In to add comment