제출 #1012663

#제출 시각아이디문제언어결과실행 시간메모리
1012663JakobZorz봉쇄 시간 (IOI23_closing)C++17
83 / 100
1065 ms51772 KiB
#include"closing.h" #include<vector> #include<iostream> #include<queue> #include<set> #include<algorithm> #include<map> using namespace std; typedef long long ll; int n,x,y; ll k; vector<pair<int,int>>nodes[200000]; ll distx[200000]; ll disty[200000]; void dfs1(int node,int par,ll*dists){ for(auto[ne,w]:nodes[node]){ if(ne==par) continue; dists[ne]=dists[node]+w; dfs1(ne,node,dists); } } int lvl1(){ vector<bool>vis(n); int res=0; ll kr=k; priority_queue<pair<ll,int>>q; q.push({0,x}); q.push({0,y}); vis[x]=true; vis[y]=true; while(q.size()){ int node=q.top().second; ll cost=-q.top().first; q.pop(); if(cost>kr) break; res++; kr-=cost; for(auto[ne,w]:nodes[node]){ if(vis[ne]) continue; vis[ne]=true; q.push({-min(distx[ne],disty[ne]),ne}); } } return res; } struct Structure{ //multiset<ll>s; vector<ll>vec; vector<ll>tree; vector<bool>pres; map<ll,int>mp; void reg(ll a){ vec.push_back(a); } void init(){ sort(vec.begin(),vec.end()); tree=vector<ll>(vec.size()); pres=vector<bool>(vec.size()); for(int i=(int)vec.size()-1;i>=0;i--) mp[vec[i]]=i; } int get(ll money){ int res=0; for(int i=0;i<(int)vec.size();i++){ if(pres[i]){ if(tree[i]>money) break; money-=tree[i]; res++; } } return res; /*int res=0; for(ll i:s){ if(i>money) break; res++; money-=i; } return res;*/ } void insert(ll a){ tree[mp[a]]=vec[mp[a]]; pres[mp[a]]=true; mp[a]++; //s.insert(a); } void remove(ll a){ mp[a]--; tree[mp[a]]=0; pres[mp[a]]=false; //s.erase(s.find(a)); } }; int cmp(pair<ll,ll>a,pair<ll,ll>b){ return a.first+a.second<b.first+b.second; } int solve(vector<pair<ll,ll>>opts,ll money){ sort(opts.begin(),opts.end(),cmp); Structure s; for(auto[i,j]:opts){ s.reg(i); s.reg(j); } s.init(); for(auto[i,j]:opts) s.insert(i); int res=s.get(money); int res2=0; for(auto[i,j]:opts){ money-=i; s.remove(i); s.insert(j); res2++; if(money<0) break; res=max(res,res2+s.get(money)); } return res; } int lvl2(){ int cres=0; ll money=k; vector<pair<ll,ll>>opts; for(int i=0;i<n;i++){ if(distx[i]+disty[i]==distx[y]){ // is on the path from x to y cres++; money-=min(distx[i],disty[i]); opts.emplace_back(max(distx[i],disty[i])-min(distx[i],disty[i]),1e18); }else{ opts.emplace_back(min(distx[i],disty[i]),max(distx[i],disty[i])-min(distx[i],disty[i])); } } if(money<0) return 0; return cres+solve(opts,money); } int max_score(int N,int X,int Y,ll K,vector<int>U,vector<int>V,vector<int>W){ n=N; x=X; y=Y; k=K; for(int i=0;i<n;i++){ distx[i]=0; disty[i]=0; nodes[i].clear(); } for(int i=0;i<n-1;i++){ nodes[U[i]].emplace_back(V[i],W[i]); nodes[V[i]].emplace_back(U[i],W[i]); } dfs1(x,x,distx); dfs1(y,y,disty); return max(lvl1(),lvl2()); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...