Submission #480138

#TimeUsernameProblemLanguageResultExecution timeMemory
480138fatemetmhrThe Potion of Great Power (CEOI20_potion)C++17
100 / 100
2717 ms39980 KiB
// ~Be name khoda~ // #include<bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define mp make_pair #define all(x) x.begin(), x.end() #define fi first #define se second #define cl clear #define endll '\n' const int maxn = 1e6 + 10; const int maxn5 = 1e5 + 10; const int maxnt = 1.2e6 + 10; const int maxn3 = 1e3 + 10; const int mod = 1e9 + 7; const int ssq = 503; const ll inf = 2e18; int n, d, u, h[maxn5], val[2 * maxn5]; vector <int> ver1, ver2, adj[maxn5], lim[maxn5]; map <int, int> have[maxn5]; pair <int, int> e[2 * maxn5]; inline bool cmp (int a, int b){ return val[a] < val[b]; } void init(int N, int D, int H[]) { n = N; d = D; for(int i = 0; i < n; i++) h[i] = H[i]; return; } void curseChanges(int U, int A[], int B[]) { u = U; for(int i = 0; i < u; i++){ int a = A[i]; int b = B[i]; e[i] = {a, b}; if(have[b].find(a) == have[b].end()){ adj[b].pb(i); have[b][a] = i; } else{ val[have[b][a]] = i; have[b].erase(a); } if(have[a].find(b) == have[a].end()){ adj[a].pb(i); have[a][b] = i; } else{ val[have[a][b]] = i; have[a].erase(b); } } for(int i = 0; i < n; i++) for(auto it = have[i].begin(); it != have[i].end(); it++) val[it->se] = u + 10; for(int i = 0; i < n; i++){ int ind = 0; while(ind < adj[i].size()){ lim[i].pb(adj[i][min(ind + ssq - 1, int(adj[i].size()) - 1)]); sort(adj[i].begin() + ind, adj[i].begin() + min(ssq + ind, int(adj[i].size())), cmp); ind += ssq; } } return; } int question(int x, int y, int v) { if(v == 0) return 1000000000; ver1.clear(); ver2.clear(); v--; int ind = 0, num = 0; while(ind < adj[x].size()){ if(lim[x][num] <= v){ int j = min(ind + ssq - 1, int(adj[x].size()) - 1); while(j >= ind && val[adj[x][j]] > v){ int u = e[adj[x][j]].fi; if(u == x) u = e[adj[x][j]].se; ver1.pb(h[u]); j--; } } else{ int j = ind; for(; j < min(ind + ssq, int(adj[x].size())); j++){ if(adj[x][j] <= v && val[adj[x][j]] > v){ int u = e[adj[x][j]].fi; if(u == x) u = e[adj[x][j]].se; ver1.pb(h[u]); } } } num++; ind += ssq; } ind = 0, num = 0; x = y; while(ind < adj[x].size()){ if(lim[x][num] <= v){ int j = min(ind + ssq - 1, int(adj[x].size()) - 1); while(j >= ind && val[adj[x][j]] > v){ int u = e[adj[x][j]].fi; if(u == x) u = e[adj[x][j]].se; ver2.pb(h[u]); j--; } } else{ int j = ind; for(; j < min(ind + ssq, int(adj[x].size())); j++){ if(adj[x][j] <= v && val[adj[x][j]] > v){ int u = e[adj[x][j]].fi; if(u == x) u = e[adj[x][j]].se; ver2.pb(h[u]); } } } num++; ind += ssq; } if(ver1.empty() || ver2.empty()) return 1000000000; sort(all(ver1)); sort(all(ver2)); ind = 0; int ans = 1000000000; for(int i = 0; i < ver1.size(); i++){ while(ind < ver2.size() && ver2[ind] <= ver1[i]) ind++; if(ind > 0) ans = min(ans, ver1[i] - ver2[ind - 1]); if(ind < ver2.size()) ans = min(ans, ver2[ind] - ver1[i]); } return ans; }

Compilation message (stderr)

potion.cpp: In function 'void curseChanges(int, int*, int*)':
potion.cpp:67:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |   while(ind < adj[i].size()){
      |         ~~~~^~~~~~~~~~~~~~~
potion.cpp: In function 'int question(int, int, int)':
potion.cpp:82:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |  while(ind < adj[x].size()){
      |        ~~~~^~~~~~~~~~~~~~~
potion.cpp:107:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |  while(ind < adj[x].size()){
      |        ~~~~^~~~~~~~~~~~~~~
potion.cpp:137:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  137 |  for(int i = 0; i < ver1.size(); i++){
      |                 ~~^~~~~~~~~~~~~
potion.cpp:138:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |   while(ind < ver2.size() && ver2[ind] <= ver1[i]) ind++;
      |         ~~~~^~~~~~~~~~~~~
potion.cpp:140:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |   if(ind < ver2.size()) ans = min(ans, ver2[ind] - ver1[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...