제출 #1048117

#제출 시각아이디문제언어결과실행 시간메모리
1048117shjeongClosing Time (IOI23_closing)C++17
35 / 100
1061 ms42244 KiB
#include <cstdio> #include <cassert> #include <vector> #include <bits/stdc++.h> typedef long long ll; using namespace std; vector<pair<ll,ll>> adj[202020]; vector<ll> l; bool dfs(ll x, ll y, ll prv=-1){ if(x==y){ l.push_back(x); return 1; } for(auto [next,w] : adj[x])if(prv!=next){ if(dfs(next,y,x)){ l.push_back(x); return 1; } } return 0; } ll sum(ll l, ll r, vector<ll> &v){ return l<=r ? v[r] - v[l-1] : 0; } int max_score(int n, int x, int y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { l.clear(); for(int i = 0 ; i < n ; i++)adj[i].clear(); for(int i = 0 ; i < n-1 ; i++)adj[U[i]].push_back({V[i], W[i]}), adj[V[i]].push_back({U[i], W[i]}); vector<vector<ll>> dist(2, vector<ll>(n,-1)); queue<ll> q; q.push(x); dist[0][x] = 0; while(q.size()){ ll cur = q.front(); q.pop(); for(auto [next,w] : adj[cur])if(dist[0][next]<0)dist[0][next] = dist[0][cur]+w, q.push(next); } q.push(y); dist[1][y] = 0; while(q.size()){ ll cur = q.front(); q.pop(); for(auto [next,w] : adj[cur])if(dist[1][next]<0)dist[1][next] = dist[1][cur]+w, q.push(next); } vector<ll> res1(n*2+1, 1e18), res2(n*2+1, 1e18); res1[0]=res2[0] = 0; //경로 내부 dfs(x,y); reverse(l.begin(),l.end()); vector<ll> a, b; ll t = l.size(); vector<bool> chk(n); for(auto i : l)chk[i] = 1; vector<ll> asum(t+1), bsum(t+1), mxsum(t+1); //1-index for(int i = 0 ; i < t ; i++){ a.push_back(dist[0][l[i]]); b.push_back(dist[1][l[i]]); asum[i+1] += asum[i], bsum[i+1] += bsum[i], mxsum[i+1] += mxsum[i]; asum[i+1] += a[i], bsum[i+1] += b[i], mxsum[i+1] += max(a[i],b[i]); } for(int i = 1 ; i <= t ; i++){ res1[i] = min(res1[i], sum(1,i,asum)); res1[i] = min(res1[i], sum(t-i+1,t,bsum)); } for(int i = 1 ; i <= t ; i++){ //교집합 x for(int j = i+1 ; j <= t ; j++){ res1[i + (t-j+1)] = min(res1[i + t-j+1], sum(1,i,asum) + sum(j,t,bsum)); } } for(int i = 1 ; i <= t ; i++){ for(int j = i ; j <= t ; j++){ res1[t + (j-i+1)] = min<ll>(res1[t + (j-i+1)], sum(1,i-1,asum) + sum(i,j,mxsum) + sum(j+1,t,bsum)); } } //경로 외부 for(int i = 0 ; i < n ; i++)if(!chk[i]){ auto newres = res2; for(int j = 1 ; j <= n*2 ; j++){ if(j>1)newres[j] = min(newres[j], res2[j-2] + max(dist[0][i], dist[1][i])); newres[j] = min(newres[j], res2[j-1] + min(dist[0][i], dist[1][i])); } res2 = newres; } ll ret = 0; for(int i = 0, j = n*2 ; i <= n*2 ; i++){ while(j>=0 and res1[i] + res2[j] > K)j--; if(j<0)break; ret = max<ll>(ret, i+j); } return ret; }
#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...