Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define boAshraf ios_base::sync_with_stdio(false); cin.tie(NULL);
- #define ll long long
- #define sz(s) (int)(s).size()
- #define all(s) (s).begin(),(s).end()
- using namespace std;
- void File();
- void sol();
- struct Node;
- extern Node *emp;
- struct Node {
- Node *left, *right;
- int val;
- Node() {
- left = right = this;
- val = 0;
- }
- Node(int val, Node *L = emp, Node *R = emp) : val(val), left(L), right(R) {}
- };
- Node *emp = new Node();
- const int N = 2e4 + 5;
- Node *seg[N] = {emp};
- Node *insert(Node *root, int start, int end, int idx) {
- if (idx > end || idx < start) return root;
- if (start == end) {
- return new Node(root->val + 1);
- }
- int mid = start + end >> 1;
- Node *L = insert(root->left, start, mid, idx);
- Node *R = insert(root->right, mid + 1, end, idx);
- return new Node(L->val + R->val, L, R);
- }
- int query(Node* L, Node* R, int start, int end, int k) {
- if (end <= k) return R->val-L->val;
- if (start > k) return 0;
- int mid = start + end >> 1;
- return query(L->left, R->left, start, mid, k) + query(L->right, R->right, mid + 1, end, k);
- }
- int main() {
- boAshraf
- File();
- int t = 1;
- // cin >> t;
- while (t--) {
- sol();
- }
- return 0;
- }
- void sol() {
- int n,m;
- cin>>n>>m;
- vector<int>val(n+1),siz(n+1),d(n+1);
- for(int i=1;i<=n;i++)cin>>val[i];
- vector<vector<int>>adj(n+1);
- vector<int>topo;
- for(int i=1;i<n;i++){
- int u,v;
- cin>>u>>v;
- adj[u].emplace_back(v);
- adj[v].emplace_back(u);
- }
- auto dfs=[&](auto &self,int u,int p)->void{
- topo.emplace_back(u);
- seg[u]= insert(seg[p],0,1e9,val[u]);
- siz[u]=1;
- d[u]=d[p]+1;
- for(auto v:adj[u]){
- if(v==p)continue;
- self(self,v,u);
- siz[u]+=siz[v];
- }
- };
- dfs(dfs,1,0);
- vector<int>c(n+1,-1);
- auto calc=[&](int u,int val)->int{
- if(~c[u])return c[u];
- int idx=val/2+1;
- int l=0,r=1e9,ans=0;
- while(l<=r){
- int mid=(l+r)/2;
- if(query(seg[0],seg[u],0,1e9,mid)>=idx)ans=mid,r=mid-1;
- else l=mid+1;
- }
- return c[u]=ans;
- };
- vector<vector<ll>>dp(n+1,vector<ll>(m+1,-1));
- auto rec=[&](auto &self,int i,int rem)->ll{
- if(i==n || rem==0)return 0;
- ll &ret=dp[i][rem];
- if(~ret)return ret;
- int u=topo[i];
- ret=self(self,i+siz[u],rem);
- ret=max(ret,self(self,i+1,rem-1)+calc(u,d[u]));
- return ret;
- };
- cout<<rec(rec,0,m);
- }
- void File() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment