Submission #1306447

#TimeUsernameProblemLanguageResultExecution timeMemory
1306447baodatArranging Shoes (IOI19_shoes)C++20
10 / 100
1 ms352 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define FOR(i, l, r) for(int i = l; i <= r; i++) #define FORD(i, l, r) for(int i = l; i >= r; i--) #define all(x) (x).begin(), (x).end() struct BIT{ int n; vector<int> bit; BIT(int __n = 0){ init(__n); } void init(int __n = 0){ n = __n; bit.assign(n + 5, 0); } void update(int i, int v){ ++i; while(i <= n){ bit[i] += v; i += i &-i; } } int query(int i){ ++i; int ans = 0; while(i > 0){ ans += bit[i]; i -= i &-i; } return ans; } int query(int l, int r){ return query(r) - query(l - 1); } }; ll count_swaps(vector<int> a){ int n = a.size(); int maxi = *max_element(all(a)); BIT bit(n + 1); vector<int> pos(n + 1, 0), match(n + 1, -1), last(maxi + 1, -1); FOR(i, 0, n - 1){ int x = abs(a[i]); if(last[x] == -1) last[x] = i; else{ match[i] = last[x]; match[last[x]] = i; } } //FOR(i, 0, n - 1) cout << i << ": " << match[i] << " "; ll ans = 0; FOR(i, 0, n - 1) bit.update(i, 1); vector<bool> used(n, false); FOR(i, 0, n - 1){ if(used[i]) continue; int j = match[i]; if(i > j) continue; ans += bit.query(i + 1, j - 1); bit.update(i, -1); bit.update(j, -1); if(a[i] > 0) ++ans; used[i] = used[j] = true; } return ans; }
#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...