Submission #425570

#TimeUsernameProblemLanguageResultExecution timeMemory
425570Charis02Ancient Books (IOI17_books)C++14
50 / 100
269 ms60632 KiB
#include "books.h" #include<iostream> #include<vector> #include<algorithm> #include<queue> #define ll long long #define pi pair < ll,ll > #define rep(i,a,b) for(int i = a;i < b;i++) #define mp(a,b) make_pair(a,b) #define N 1000003 #define INF 1e9+7 using namespace std; vector < pi > graph[N]; int id[N]; bool vis[N]; ll abso(ll x) { return (x < 0) ? -x : x; } ll dijkstra_weight(int n,int source) { ll d[n]; ll w[n]; rep(i,0,n) d[i] = INF; d[source] = 0; w[source]=0; priority_queue < pi > pq; pq.push(mp(0,source)); while(!pq.empty()) { pi cur = pq.top(); pq.pop(); cur.first*=-1; if(cur.first > d[cur.second]) continue; rep(i,0,graph[cur.second].size()) { int v = graph[cur.second][i].first; ll wv = graph[cur.second][i].second; // cout <<"in " << v << endl; if(d[v] > cur.first + wv) { d[v]=cur.first+wv; w[v]=wv; pq.push(mp(-d[v],v)); } } } ll res = 0; rep(i,0,n) { res += w[i]; } return 2*res; } int dsu[N]; vector < pair < ll,pi > > edges; int f(int x) { if(dsu[x]==x) return x; return dsu[x]=f(dsu[x]); } bool issameset(int x,int y) { return f(x)==f(y); } void join(int x,int y) { dsu[f(x)]=f(y); return; } ll mst_weight(int n,int source) { rep(i,0,n) dsu[i]=i; ll res = 0; sort(edges.begin(),edges.end()); rep(i,0,edges.size()) { int u = edges[i].second.first; int v = edges[i].second.second; ll w = edges[i].first; if(!issameset(u,v)) { join(u,v); res+=2*w; } } return res; } ll get_cycle_cost(vector < int > c) { if(c.size()==1) return 0; ll res = 0; rep(i,1,c.size()) { res += abso(c[i]-c[i-1]); } res += abso(c[0]-c[c.size()-1]); return res; } ll get_distance(pi a,pi b) { if(a.first>a.second) swap(a.first,a.second); if(b.first>b.second) swap(b.first,b.second); return max((ll)0,max(a.first,b.first)-min(a.second,b.second)); } ll calculate_weights(const vector < int >&p,const vector < vector < int > >&cycles) { edges.clear(); vector < pi > ranges; rep(i,0,cycles.size()) { ranges.push_back(mp(cycles[i][0],cycles[i][0])); rep(j,0,cycles[i].size()) { ll v = cycles[i][j]; ll pv = p[v]; ranges[i].first = min(ranges[i].first,v); ranges[i].first = min(ranges[i].first,pv); ranges[i].second = max(ranges[i].second,v); ranges[i].second = max(ranges[i].second,pv); } } sort(ranges.begin(),ranges.end()); vector < pi > nranges; ll curlow = ranges[0].first; ll curhigh = ranges[0].second; rep(i,1,ranges.size()) { if(ranges[i].first > curhigh) { nranges.push_back(mp(curlow,curhigh)); curlow = ranges[i].first; curhigh = ranges[i].second; } else curhigh = max(ranges[i].second,curhigh); } nranges.push_back(mp(curlow,curhigh)); ll res = 0; rep(i,1,nranges.size()) { res += nranges[i].first-nranges[i-1].second; } return res*2; } long long minimum_walk(std::vector<int> p, int s) { int n = p.size(); vector < vector < int > > cycles; ll ans = 0; rep(i,0,n) { if(p[i] == i || vis[i]) continue; int cur = i; int ind = cycles.size(); cycles.push_back(vector < int > ()); while(!vis[cur]) { id[cur] = ind; vis[cur] = true; cycles[ind].push_back(cur); cur = p[cur]; } ans += get_cycle_cost(cycles[ind]); } if(!vis[s]) { vis[s]=true; int ind = cycles.size(); cycles.push_back(vector < int > ()); cycles[ind].push_back(s); id[s] = ind; } ans += calculate_weights(p,cycles); return ans; }

Compilation message (stderr)

books.cpp: In function 'long long int dijkstra_weight(int, int)':
books.cpp:8:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i,a,b) for(int i = a;i < b;i++)
......
   47 |         rep(i,0,graph[cur.second].size())
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
books.cpp:47:9: note: in expansion of macro 'rep'
   47 |         rep(i,0,graph[cur.second].size())
      |         ^~~
books.cpp: In function 'long long int mst_weight(int, int)':
books.cpp:8:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i,a,b) for(int i = a;i < b;i++)
......
   99 |     rep(i,0,edges.size())
      |         ~~~~~~~~~~~~~~~~            
books.cpp:99:5: note: in expansion of macro 'rep'
   99 |     rep(i,0,edges.size())
      |     ^~~
books.cpp: In function 'long long int get_cycle_cost(std::vector<int>)':
books.cpp:8:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i,a,b) for(int i = a;i < b;i++)
......
  122 |     rep(i,1,c.size())
      |         ~~~~~~~~~~~~                
books.cpp:122:5: note: in expansion of macro 'rep'
  122 |     rep(i,1,c.size())
      |     ^~~
books.cpp: In function 'long long int calculate_weights(const std::vector<int>&, const std::vector<std::vector<int> >&)':
books.cpp:8:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i,a,b) for(int i = a;i < b;i++)
......
  146 |     rep(i,0,cycles.size())
      |         ~~~~~~~~~~~~~~~~~           
books.cpp:146:5: note: in expansion of macro 'rep'
  146 |     rep(i,0,cycles.size())
      |     ^~~
books.cpp:8:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i,a,b) for(int i = a;i < b;i++)
......
  150 |         rep(j,0,cycles[i].size())
      |             ~~~~~~~~~~~~~~~~~~~~    
books.cpp:150:9: note: in expansion of macro 'rep'
  150 |         rep(j,0,cycles[i].size())
      |         ^~~
books.cpp:8:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i,a,b) for(int i = a;i < b;i++)
......
  167 |     rep(i,1,ranges.size())
      |         ~~~~~~~~~~~~~~~~~           
books.cpp:167:5: note: in expansion of macro 'rep'
  167 |     rep(i,1,ranges.size())
      |     ^~~
books.cpp:8:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 | #define rep(i,a,b) for(int i = a;i < b;i++)
......
  183 |     rep(i,1,nranges.size())
      |         ~~~~~~~~~~~~~~~~~~          
books.cpp:183:5: note: in expansion of macro 'rep'
  183 |     rep(i,1,nranges.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...