AhmedAshraff

Untitled

Jun 20th, 2025
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
  3. #define ll long long
  4. #define sz(s) (int)(s).size()
  5. #define all(s) (s).begin(),(s).end()
  6. using namespace std;
  7. void File();
  8. void sol();
  9.  
  10. struct Node;
  11. extern Node *emp;
  12. struct Node {
  13.     Node *left, *right;
  14.     int val;
  15.     Node() {
  16.         left = right = this;
  17.         val = 0;
  18.     }
  19.     Node(int val, Node *L = emp, Node *R = emp) : val(val), left(L), right(R) {}
  20. };
  21.  
  22. Node *emp = new Node();
  23. const int N = 2e4 + 5;
  24. Node *seg[N] = {emp};
  25. Node *insert(Node *root, int start, int end, int idx) {
  26.     if (idx > end || idx < start) return root;
  27.     if (start == end) {
  28.         return new Node(root->val + 1);
  29.     }
  30.     int mid = start + end >> 1;
  31.     Node *L = insert(root->left, start, mid, idx);
  32.     Node *R = insert(root->right, mid + 1, end, idx);
  33.     return new Node(L->val + R->val, L, R);
  34. }
  35.  
  36. int query(Node* L, Node* R, int start, int end, int k) {
  37.     if (end <= k) return R->val-L->val;
  38.     if (start > k) return 0;
  39.     int mid = start + end >> 1;
  40.     return query(L->left, R->left, start, mid, k) + query(L->right, R->right, mid + 1, end, k);
  41. }
  42.  
  43. int main() {
  44.     boAshraf
  45.     File();
  46.     int t = 1;
  47. //    cin >> t;
  48.     while (t--) {
  49.         sol();
  50.     }
  51.     return 0;
  52. }
  53.  
  54. void sol() {
  55.     int n,m;
  56.     cin>>n>>m;
  57.     vector<int>val(n+1),siz(n+1),d(n+1);
  58.     for(int i=1;i<=n;i++)cin>>val[i];
  59.     vector<vector<int>>adj(n+1);
  60.     vector<int>topo;
  61.     for(int i=1;i<n;i++){
  62.         int u,v;
  63.         cin>>u>>v;
  64.         adj[u].emplace_back(v);
  65.         adj[v].emplace_back(u);
  66.     }
  67.     auto dfs=[&](auto &self,int u,int p)->void{
  68.         topo.emplace_back(u);
  69.         seg[u]= insert(seg[p],0,1e9,val[u]);
  70.         siz[u]=1;
  71.         d[u]=d[p]+1;
  72.         for(auto v:adj[u]){
  73.             if(v==p)continue;
  74.             self(self,v,u);
  75.             siz[u]+=siz[v];
  76.         }
  77.     };
  78.     dfs(dfs,1,0);
  79.     vector<int>c(n+1,-1);
  80.     auto calc=[&](int u,int val)->int{
  81.         if(~c[u])return c[u];
  82.         int idx=val/2+1;
  83.         int l=0,r=1e9,ans=0;
  84.         while(l<=r){
  85.             int mid=(l+r)/2;
  86.             if(query(seg[0],seg[u],0,1e9,mid)>=idx)ans=mid,r=mid-1;
  87.             else l=mid+1;
  88.         }
  89.         return c[u]=ans;
  90.     };
  91.     vector<vector<ll>>dp(n+1,vector<ll>(m+1,-1));
  92.     auto rec=[&](auto &self,int i,int rem)->ll{
  93.         if(i==n || rem==0)return 0;
  94.         ll &ret=dp[i][rem];
  95.         if(~ret)return ret;
  96.         int u=topo[i];
  97.         ret=self(self,i+siz[u],rem);
  98.         ret=max(ret,self(self,i+1,rem-1)+calc(u,d[u]));
  99.         return ret;
  100.     };
  101.     cout<<rec(rec,0,m);
  102. }
  103.  
  104. void File() {
  105. #ifndef ONLINE_JUDGE
  106.     freopen("input.txt", "r", stdin);
  107.     freopen("output.txt", "w", stdout);
  108. #endif
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment