Submission #397703

#TimeUsernameProblemLanguageResultExecution timeMemory
397703ly20Arranging Shoes (IOI19_shoes)C++17
100 / 100
250 ms22240 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 212345; vector <int> v[2 * MAXN]; int id1[2 * MAXN]; int seg[4 * MAXN]; int query(int cur, int ini, int fim, int a, int b) { if(ini > b || fim < a) return 0; if(ini >= a && fim <= b) return seg[cur]; int m = (ini + fim) / 2; int e = 2 * cur, d = 2 * cur + 1; return query(e, ini, m, a, b) + query(d, m + 1, fim, a, b); } void update(int cur, int ini, int fim, int id, int val) { if(ini > id || fim < id) return; if(ini == fim) { seg[cur] = val; return; } int m = (ini + fim) / 2; int e = 2 * cur, d = 2 * cur + 1; update(e, ini, m, id, val); update(d, m + 1, fim, id, val); seg[cur] = seg[e] + seg[d]; } long long count_swaps(vector<int> s) { int n = s.size(); long long resp = 0; for(int i = 0; i < n; i++) { update(1, 0, n - 1, i, 1); int a = s[i]; if(a < 0) { a = -a + MAXN; } v[a].push_back(i); } for(int i = 0; i < n; i++) { if(query(1, 0, n - 1, i, i) == 0) continue; if(s[i] > 0) resp++; int a = s[i], b = -s[i]; if(a < 0) { a = -a + MAXN; } if(b < 0) { b = -b + MAXN; } int ida = v[a][id1[a]], idb = v[b][id1[b]]; int q = query(1, 0, n - 1, 0, ida), r = query(1, 0, n - 1, 0, idb); resp += q + r - 3; id1[a]++; id1[b]++; //printf("%d %d\n", query(1, 0, n - 1, 0, ida), query(1, 0, n - 1, 0, idb)); //resp += query(1, 0, n - 1, 0, ida) + query(1, 0, n - 1, 0, idb) - 2; //id1[a]++; id1[b]++; update(1, 0, n - 1, ida, 0); update(1, 0, n - 1, idb, 0); //printf("%d\n", resp); } return resp; }
#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...