제출 #49304

#제출 시각아이디문제언어결과실행 시간메모리
49304doowey꿈 (IOI13_dreaming)C++14
0 / 100
70 ms12660 KiB
#include <bits/stdc++.h> #include "dreaming.h" using namespace std; typedef pair<int,int> pii; #define fi first #define se second #define mp make_pair const int N = (int)1e5 + 9; vector<pii>E[N]; vector<int>comp[N]; bool vis[N]; int p = 0; void Split(int u){ if(vis[u] == true) return; comp[p].push_back(u); vis[u] = true; for(auto x : E[u]){ if(!vis[x.fi]) Split(x.fi); } } int dim[N]; int hf[N]; int dist[N]; int las[N]; void search(int x){ // component x int st = comp[x][0]; for(int i = 0;i < comp[x].size();i ++ ){ dist[comp[x][i]] = (int)2e9 + 9; } dist[st] = 0; queue<int>ii; ii.push(st); int cr; while(!ii.empty()){ cr = ii.front(); ii.pop(); for(int i = 0;i < E[cr].size();i ++ ){ if(dist[E[cr][i].fi] > dist[cr] + E[cr][i].se){ dist[E[cr][i].fi] = dist[cr] + E[cr][i].se; ii.push(E[cr][i].fi); } } } int mx = -1; int z = 0; for(auto y : comp[x]){ if(dist[y] > mx){ mx = dist[y]; z = y; } dist[y] = (int)2e9 + 9; las[y] = -1; } ii.push(z); dist[z] = 0; while(!ii.empty()){ cr = ii.front(); ii.pop(); for(auto x : E[cr]){ if(dist[cr] + x.se < dist[x.fi]){ las[x.fi] = cr; dist[x.fi] = dist[cr] + x.se; ii.push(x.fi); } } } mx = -1; z = 0; for(auto y : comp[x]){ if(dist[y] > mx){ mx = dist[y]; z = y; } } dim[x] = mx; hf[x] = dist[z]; while(las[z] != -1 and dist[z] * 2 > mx){ hf[x] = min(hf[x],max(dist[z],mx - dist[z])); z = las[z]; } } int travelTime(int n, int m, int len, int fr[], int to[], int tt[]) { for(int i = 0;i < m; i ++ ){ E[fr[i]].push_back(mp(to[i], tt[i])); E[to[i]].push_back(mp(fr[i], tt[i])); } for(int i = 0;i < n;i ++ ) if(!vis[i]){ Split(i); p ++ ; } for(int j = 0;j < p;j ++ ) search(j); if(p == 1) return dim[0]; sort(hf, hf + p); int ans = 0; for(int i = 0;i < p;i ++ ) ans = max(ans, dim[i]); int tri; int sum; int cnt; int mx; int mz = (int)2e9 + 9; for(int i = 0;i < p;i ++ ){ tri = 0; sum = 0; cnt = 0; mx = 0; for(int j = p - 1;j >= 0;j -- ){ if(j != i){ sum += hf[j]; cnt++; if(cnt == 1){ mx = hf[j]; } } if(cnt == 2) break; } tri = max(tri, mx + len + hf[i]); tri = max(tri, sum + len + len); mz = min(mz, tri); } ans = max(ans , mz); return ans; }

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

dreaming.cpp: In function 'void search(int)':
dreaming.cpp:37:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0;i < comp[x].size();i ++ ){
                 ~~^~~~~~~~~~~~~~~~
dreaming.cpp:47:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0;i < E[cr].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...