제출 #571338

#제출 시각아이디문제언어결과실행 시간메모리
571338beaconmc꿈 (IOI13_dreaming)C++14
59 / 100
1088 ms27940 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") typedef long long ll; #define FOR(i,x,y) for(ll i=x; i<y; i++) #define FORNEG(i,x,y) for(ll i=x; i>y; i--) #define double long double #include "dreaming.h" using namespace std; ll cc[100005]; ll find(ll a){ while (a!=cc[a]) cc[a] = cc[cc[a]], a = cc[a]; return a; } void unite(ll a,ll b){ cc[find(a)] = find(b); } ll globalmax = 0; vector<pair<ll, ll>> edges[100005]; vector<ll> sussies[100005]; int sus(vector<ll> a){ if (a.size()==1) return 0; bool visited[100005]; FOR(i,0,100001) visited[i] = 0; vector<ll> parent[100005]; vector<ll> stacc; stacc.push_back(a[0]); visited[a[0]] = 1; while (stacc.size()){ ll node = stacc[stacc.size()-1]; stacc.pop_back(); for (auto&i : edges[node]){ if (!visited[i.first]){ visited[i.first] = 1; stacc.push_back(i.first); parent[i.first] = {node, i.second}; } } } FOR(i,0,100001) visited[i] = 0; ll maxi = -1; ll maxpos = -1; vector<vector<ll>> stack; stack.push_back({a[0], 0}); visited[a[0]] = 1; while (stack.size()){ vector<ll> node = stack[stack.size()-1]; stack.pop_back(); if (maxi < node[1]) maxi = node[1], maxpos = node[0]; for (auto&i : edges[node[0]]){ if (!visited[i.first]){ visited[i.first] = 1; stack.push_back({i.first, node[1] + i.second}); } } } globalmax = max(globalmax, maxi); stack.clear(); ll maxmaxpos = -1; maxi = -1; FOR(i,0,100001) visited[i] = 0; stack.push_back({maxpos, 0}); visited[maxpos] = 1; while (stack.size()){ vector<ll> node = stack[stack.size()-1]; stack.pop_back(); if (maxi < node[1]) maxi = node[1], maxmaxpos = node[0]; for (auto&i : edges[node[0]]){ if (!visited[i.first]){ visited[i.first] = 1; stack.push_back({i.first, node[1] + i.second}); } } } vector<ll> prev; vector<vector<ll>> left; vector<vector<ll>> right; globalmax =max(globalmax, maxi); while (maxpos != a[0]){ left.push_back({parent[maxpos][0], parent[maxpos][1]}); maxpos = parent[maxpos][0]; } while (maxmaxpos != a[0]){ left.push_back({parent[maxmaxpos][0], parent[maxmaxpos][1]}); maxmaxpos = parent[maxmaxpos][0]; } while (left.size() && right.size() && left[left.size()-1] == right[right.size()-1]){ left.pop_back(); prev = right[right.size()-1]; right.pop_back(); } vector<ll> sussies; sussies.push_back(0); for (auto&i : left){ sussies.push_back(i[1]); } if (prev.size()) sussies.push_back(prev[1]); for (auto&i : right){ sussies.push_back(i[1]); } ll mini = 10000000000; ll cur = 0; FOR(i,0,sussies.size()){ cur += sussies[i]; mini = min(mini, max(cur, maxi-cur)); } return mini; } int travelTime(int n, int m, int L, int a[], int b[], int t[]){ FOR(i,0,n) cc[i] = i; FOR(i,0,m){ edges[a[i]].push_back({b[i], t[i]}); edges[b[i]].push_back({a[i], t[i]}); } FOR(i,0,n){ for (auto&j : edges[i]){ unite(i, j.first); } } FOR(i,0,n){ sussies[find(i)].push_back(i); } vector<ll> kindasus; for (auto&i : sussies){ if (i.size()==0) continue; kindasus.push_back(sus(i)); } sort(kindasus.begin(), kindasus.end()); // for (auto&i : kindasus){ // cout << i << endl; // } if (kindasus.size() == 1) return globalmax; if (kindasus.size()==2){ return max(globalmax, kindasus[kindasus.size()-1] + kindasus[kindasus.size()-2] + L); } return max(globalmax, max(kindasus[kindasus.size()-2] + kindasus[kindasus.size()-3] + 2*L, kindasus[kindasus.size()-1] + kindasus[kindasus.size()-2] + L)); }

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

dreaming.cpp: In function 'int sus(std::vector<long long int>)':
dreaming.cpp:4:33: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define FOR(i,x,y) for(ll i=x; i<y; i++)
......
  141 |  FOR(i,0,sussies.size()){
      |      ~~~~~~~~~~~~~~~~~~          
dreaming.cpp:141:2: note: in expansion of macro 'FOR'
  141 |  FOR(i,0,sussies.size()){
      |  ^~~
#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...