제출 #118741

#제출 시각아이디문제언어결과실행 시간메모리
118741someone_aa통행료 (IOI18_highway)C++17
11 / 100
1922 ms37024 KiB
#include "highway.h" #include <bits/stdc++.h> #define ll long long #define pb push_back #define mp make_pair using namespace std; const int maxn = 100100; int n, m; vector<int>w; vector<int>gs[maxn]; vector<pair<int,int> > g[maxn]; vector<int>gt[maxn]; int dist[maxn][2], parent[maxn][2]; bool visited[maxn]; ll dista; map<pair<int,int>, int> ind; int type[maxn]; void bfs(int u, int v) { visited[u] = visited[v] = true; queue<pair<int,int> > q; type[u] = 0; type[v] = 1; q.push(mp(u, 0)); q.push(mp(v, 1)); while(!q.empty()) { int curr = q.front().first; int currtype = q.front().second; q.pop(); for(auto i:gs[curr]) { if(visited[i]) continue; visited[i] = true; type[i] = currtype; q.push(mp(i, currtype)); } } } vector<pair<int,int> > sta, stb; void preprocess() { for(int i=0;i<n;i++) { if(type[i] == 0) { for(auto j:gs[i]) { if(type[j] == type[i]) { sta.pb(mp(min(i, j), max(i, j))); } } } else { for(auto j:gs[i]) { if(type[j] == type[i]) { stb.pb(mp(min(i, j), max(i, j))); } } } } sort( sta.begin(), sta.end() ); sta.erase( unique( sta.begin(), sta.end() ), sta.end() ); sort( stb.begin(), stb.end() ); stb.erase( unique( stb.begin(), stb.end() ), stb.end() ); } int solve(int root, int d) { // build bfs tree //memset(visited,false,sizeof(visited)); //memset(parent,-1,sizeof(parent)); vector<pair<int,int> > edges; if(d == 0) edges = sta; else edges = stb; for(auto i:edges) { gt[i.first].pb(i.second); gt[i.second].pb(i.first); } vector<int>v, v2; queue<int>q; q.push(root); visited[root] = true; parent[root][d] = -1; while(!q.empty()) { int curr = q.front(); q.pop(); v.pb(parent[curr][d]); v2.pb(curr); for(auto i:gt[curr]) { if(!visited[i]) { visited[i] = true; parent[i][d] = curr; dist[i][d] = dist[curr][d] + 1; q.push(i); } } } if(v.size() == 1) return v2[0]; // perform binary search for(int i=0;i<v.size();i++) { if(v[i] == -1) continue; // root int cind = ind[mp(v[i], v2[i])]; w[cind] = 1; } int li = 0, ri = v.size() - 1; while(li < ri) { int mid = (li + ri) / 2; // all before mid put them as low cost and other as high cost for(int i=0;i<=mid;i++) { if(v[i] == -1) continue; // root int cind = ind[mp(v[i], v2[i])]; w[cind] = 0; } ll cdist = ask(w); for(int i=0;i<=mid;i++) { if(v[i] == -1) continue; // root int cind = ind[mp(v[i], v2[i])]; w[cind] = 1; } if(cdist == dista) { ri = mid; } else { li = mid + 1; } } for(int i=0;i<v.size();i++) { if(v[i] == -1) continue; // root int cind = ind[mp(v[i], v2[i])]; w[cind] = 0; } return v2[li]; } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { n = N; m = U.size(); int li=0, ri=m-1; for(int i=0;i<m;i++) { ind[mp(U[i], V[i])] = ind[mp(V[i], U[i])] = i; gs[U[i]].pb(V[i]); gs[V[i]].pb(U[i]); g[U[i]].pb(mp(V[i], i)); g[V[i]].pb(mp(U[i], i)); w.pb(0); } dista = ask(w); while(li<ri) { int mid = (li+ri)/2; for(int i=li;i<=mid;i++) { w[i] = 1; } ll distb = ask(w); for(int i=li;i<=mid;i++) { w[i] = 0; } if(dista == distb) { li = mid + 1; } else { ri = mid; } } int x = li; int u = U[x], v = V[x]; //cout<<u<<" "<<v<<"\n"; bfs(u, v); preprocess(); memset(visited,false,sizeof(visited)); //cout<<"Ans: "<<xx<<" "<<yy<<"\n"; answer(solve(u, 0), solve(v, 1)); }

컴파일 시 표준 에러 (stderr) 메시지

highway.cpp: In function 'int solve(int, int)':
highway.cpp:116:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v.size();i++) {
                 ~^~~~~~~~~
highway.cpp:149:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v.size();i++) {
                 ~^~~~~~~~~
#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...