Submission #1079996

#TimeUsernameProblemLanguageResultExecution timeMemory
1079996PoPularPlusPlusClosing Time (IOI23_closing)C++17
0 / 100
1059 ms34116 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define all(x) x.begin(),x.end() #define pb(x) push_back(x) #define mp(x,y) make_pair(x,y) #define vf first #define vs second int max_score(int n, int x, int y, ll k,vector<int> u, vector<int> v, vector<int> w){ vector<pair<int,ll>> adj[n + 1]; for(int i = 0; i < n-1; i++){ adj[u[i]].pb(mp(v[i] , w[i])); adj[v[i]].pb(mp(u[i] , w[i])); } ll dis[n] , path[n] , dis1[n]; memset(dis,-1,sizeof dis); memset(path , -1 , sizeof path); memset(dis1, -1 , sizeof dis1); queue<int> q; q.push(x); dis[x] = 0; path[x] = 0; while(q.size()){ int node = q.front(); q.pop(); for(auto i : adj[node]){ if(dis[i.vf] == -1){ dis[i.vf] = dis[node] + i.vs; path[i.vf] = path[node] + 1; q.push(i.vf); } } } bool vis[n]; memset(vis,0,sizeof vis); vis[y] = 1; ll cur = y; vector<int> path_w; path_w.pb(y); while(cur != x){ for(auto i : adj[cur]){ if(path[i.vf] == path[cur] - 1){ cur = i.vf; vis[i.vf] = 1; path_w.pb(i.vf); break; } } } dis1[y] = 0; q.push(y); while(q.size()){ int node = q.front(); q.pop(); for(auto i : adj[node]){ if(dis1[i.vf] == -1){ dis1[i.vf] = dis1[node] + i.vs; path[i.vf] = path[node] + 1; q.push(i.vf); } } } /* for(int i = 0; i < n; i++){ cout << dis[i] << ' ' << dis1[i] << '\n'; }*/ int weight[n]; priority_queue<pair<ll,int>> pq; for(int i = 0; i < n; i++){ if(vis[i] == 0 && dis[i] < dis1[i]){ pq.push(mp(dis[i],i)); } } int pos = 0; while(pq.size()){ //cout << "former " << ' ' << pq.top().vs << '\n'; weight[pos++] = pq.top().vs; pq.pop(); } int xx = pos; while(path_w.size()){ weight[pos++] = path_w.back(); path_w.pop_back(); } for(int i = 0; i < n; i++){ if(vis[i] == 0 && dis[i] > dis1[i]){ pq.push(mp(dis1[i] , i)); } } int yy = pos -1; vector<int> rev; while(pq.size()){ rev.pb(pq.top().vs); pq.pop(); } while(rev.size()){ //cout << "later " << pq.top().vs << '\n'; weight[pos++] = rev.back(); rev.pop_back(); } for(int i = 0; i < n; i++){ cout << weight[i] << ' '; } cout << '\n'; x = xx; y = yy; cur = 0; int ans = 0; ll cur_w[n]; for(int i = x; i >= 0; i--){ for(int j = y; j < n; j++){ memset(cur_w,0,sizeof cur_w); ll rem = k; ll cur = 0; for(int tp = x; tp >= i; tp--){ rem -= dis[weight[tp]]; //cout << "dis " << dis[weight[tp]] << ' '; cur_w[tp] = dis[weight[tp]]; } cur = 0; for(int tp = y; tp <= j; tp++){ rem -= dis1[weight[tp]]; //cout << "dis1 " << dis1[weight[tp]] << ' '; cur_w[tp] = dis1[weight[tp]]; } //cout << i << ' ' << j << ' ' << rem << endl; if(rem >= 0){ int res = (x - i) + (j - y) + 2; // cout << res << ' '; int left = x + 1 , right = y - 1; ll cur_l = dis[weight[left]] , cur_r = dis1[weight[right]]; while(rem >= 0 && (left < n || right >= 0)){ //cout << rem << ' ' << left << ' ' << right << endl; if(right < 0 || (left < n && cur_l - cur_w[left] < cur_r - cur_w[right])){ if(rem - (max(0LL,cur_l - cur_w[left])) >= 0){ rem -= (max(0LL,cur_l - cur_w[left])); cur_w[left] += (max(0LL,cur_l - cur_w[left])); res++; left++; if(left < n)cur_l = dis[weight[left]]; } else break; } else { if(rem - max(0LL, cur_r - cur_w[right]) >= 0){ rem -= max(0LL, cur_r - cur_w[right]); cur_w[right] += max(0LL, cur_r - cur_w[right]); res++; right--; if(right >= 0)cur_r = dis1[weight[right]]; } else break; } } // cout << i << ' ' << j << ' ' << res << ' ' << rem << ' ' << left << ' ' << right << '\n'; // cout << i << ' ' << j << ' ' << res << ' ' << left << ' ' << right << "\n"; ans = max(ans , res); } } } return ans; }

Compilation message (stderr)

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:132:16: warning: variable 'cur' set but not used [-Wunused-but-set-variable]
  132 |             ll cur = 0;
      |                ^~~
#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...