Submission #846346

#TimeUsernameProblemLanguageResultExecution timeMemory
846346vjudge1ČVENK (COI15_cvenk)C++17
38 / 100
3019 ms312984 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 1e5+37; vector<array<int, 2>> adj[N]; vector<array<int, 2>> a[N*65]; vector<int> val(N*65); map<array<int, 2>, int> mp; int sum = 0; void dfs(int x, int y, int z){ for(auto i: a[x]){ if(i[0]==y) continue; dfs(i[0], x, z+i[1]); } sum+=val[x]*z; } void op(int v, array<int, 2> pos, vector<array<int, 2>> ve, char type, int dep){ if(ve.size()==0) return; if(type == 'x'){ sort(ve.begin(), ve.end()); int gh = mp[{ve[0][0], pos[1]}]; a[v].push_back({gh, ve[0][0]-pos[0]}); a[gh].push_back({v, ve[0][0]-pos[0]}); int tmp = gh; vector<array<int, 2>> aa; if(dep<adj[ve[0][1]].size()) aa.push_back({adj[ve[0][1]][dep][1] , ve[0][1]}); for(int i=1; i<ve.size(); i++){ if(ve[i][0]!=ve[i-1][0]){ op(tmp, {ve[i-1][0], pos[1]}, aa, 'y', dep+1); aa.clear(); gh =mp[{ve[i][0], pos[1]}]; a[tmp].push_back({gh, ve[i][0]-ve[i-1][0]}); a[gh].push_back({tmp, ve[i][0]-ve[i-1][0]}); tmp = gh; } if(dep<adj[ve[i][1]].size()){ aa.push_back({adj[ve[i][1]][dep][1], ve[i][1]}); } } op(tmp, {ve[ve.size()-1][0], pos[1]}, aa, 'y', dep+1); aa.clear(); } else{ sort(ve.begin(), ve.end()); int gh = mp[{pos[0], ve[0][0]}]; a[v].push_back({gh, ve[0][0]-pos[1]}); a[gh].push_back({v, ve[0][0]-pos[1]}); int tmp = gh; vector<array<int, 2>> aa; if(dep<adj[ve[0][1]].size()) aa.push_back({adj[ve[0][1]][dep][0], ve[0][1]}); for(int i=1; i<ve.size(); i++){ if(ve[i][0]!=ve[i-1][0]){ op(tmp, {pos[0], ve[i-1][0]}, aa, 'x', dep+1); aa.clear(); gh =mp[{pos[0], ve[i][0]}]; a[tmp].push_back({gh, ve[i][0]-ve[i-1][0]}); a[gh].push_back({tmp,ve[i][0]-ve[i-1][0] }); tmp = gh; } if(dep<adj[ve[i][1]].size()){ aa.push_back({adj[ve[i][1]][dep][0], ve[i][1]}); } } op(tmp, {pos[0], ve[ve.size()-1][0]}, aa, 'x', dep+1); aa.clear(); } } signed main(){ ios_base::sync_with_stdio(false); int n; cin >> n; int cnt = 1; mp[{0, 0}]=0; // cout<<0<<" "<<0 << " "<<0<<"\n"; vector<array<int, 2>> yy, xx; for(int l=0; l<n; l++){ int x, y; cin >> x >> y; adj[l].push_back({x, y}); int cx=0, cy=0; vector<array<int, 2>> as; int tmpx=x, tmpy=y; for(int i=0; i<30&&x&&y; i++){ if(x&(1<<i)){ x-=(1<<i); as.push_back({i, 0}); }else if(y&(1<<i)){ y-=(1<<i); as.push_back({i, 1}); } } x=tmpx; y=tmpy; for(int i=0; i<as.size(); i++){ if(as[i][1]==0) x-=(1<<as[i][0]); else y-=(1<<as[i][0]); if(i==as.size()-1||as[i][1]!=as[i+1][1]){ adj[l].push_back({x, y}); } } reverse(adj[l].begin(), adj[l].end()); for(auto i: adj[l]){ if(!mp.count(i)){ mp[i]=cnt, cnt++; // cout<<cnt-1<<" "<<i[0]<<" "<<i[1]<<"\n"; } } val[mp[{tmpx, tmpy}]]++; if(x==0){ yy.push_back({y, l}); } else if(y==0){ xx.push_back({x, l}); } } op(0,{0, 0}, yy,'y', 1); op(0, {0, 0}, xx, 'x', 1); int ans = 1e18; for(int i=0; i<cnt; i++){ sum=0; /* for(auto l: a[i]){ cout<<l[0]<<" "<<"\n"; } */ dfs(i, i, 0); // cout<<i<<" "<<sum<<"\n"; ans =min(ans, sum); } cout<<ans<<"\n"; }

Compilation message (stderr)

cvenk.cpp: In function 'void op(long long int, std::array<long long int, 2>, std::vector<std::array<long long int, 2> >, char, long long int)':
cvenk.cpp:40:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |         if(dep<adj[ve[0][1]].size())  aa.push_back({adj[ve[0][1]][dep][1] , ve[0][1]});
      |            ~~~^~~~~~~~~~~~~~~~~~~~~
cvenk.cpp:42:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |         for(int i=1; i<ve.size(); i++){
      |                      ~^~~~~~~~~~
cvenk.cpp:55:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |             if(dep<adj[ve[i][1]].size()){
      |                ~~~^~~~~~~~~~~~~~~~~~~~~
cvenk.cpp:74:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |         if(dep<adj[ve[0][1]].size())  aa.push_back({adj[ve[0][1]][dep][0], ve[0][1]});
      |            ~~~^~~~~~~~~~~~~~~~~~~~~
cvenk.cpp:76:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |         for(int i=1; i<ve.size(); i++){
      |                      ~^~~~~~~~~~
cvenk.cpp:89:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |             if(dep<adj[ve[i][1]].size()){
      |                ~~~^~~~~~~~~~~~~~~~~~~~~
cvenk.cpp: In function 'int main()':
cvenk.cpp:132:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |         for(int i=0; i<as.size(); i++){
      |                      ~^~~~~~~~~~
cvenk.cpp:136:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |             if(i==as.size()-1||as[i][1]!=as[i+1][1]){
      |                ~^~~~~~~~~~~~~
cvenk.cpp:116:13: warning: unused variable 'cx' [-Wunused-variable]
  116 |         int cx=0, cy=0;
      |             ^~
cvenk.cpp:116:19: warning: unused variable 'cy' [-Wunused-variable]
  116 |         int cx=0, cy=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...