Submission #380828

#TimeUsernameProblemLanguageResultExecution timeMemory
380828KarliverArranging Shoes (IOI19_shoes)C++14
50 / 100
1100 ms21736 KiB
#include "shoes.h" #include <bits/stdc++.h> #include <fstream> #define FIXED_FLOAT(x) std::fixed <<std::setprecision(20) << (x) #define all(v) (v).begin(), (v).end() using namespace std; #define forn(i,n) for (int i = 0; i < (n); ++i) using ll = long long; int mod = (ll)1e9 + 7; #define PI acos(-1) typedef pair<int, int> pairs; typedef complex<ll> G; const int INF = 1e9 + 1; const int N = 1e6; const double eps = 1e-3; using namespace std; struct FenwickTree { vector<int> bit; // binary indexed tree int n; FenwickTree(int n) { this->n = n; bit.assign(n, 0); } FenwickTree(vector<int> a) : FenwickTree(a.size()) { for (size_t i = 0; i < a.size(); i++) add(i, a[i]); } int sum(int r) { int ret = 0; for (; r >= 0; r = (r & (r + 1)) - 1) ret += bit[r]; return ret; } int sum(int l, int r) { return sum(r) - sum(l - 1); } void add(int idx, int delta) { for (; idx < n; idx = idx | (idx + 1)) bit[idx] += delta; } }; long long count_swaps(std::vector<int> a) { int n = a.size(); FenwickTree F(n); ll ans = 0; vector<vector<int>> le(n + 1), ri(n + 1); forn(i, n) { if(a[i] > 0)ri[a[i]].push_back(i); else le[-a[i]].push_back(i); } vector<int> flow; vector<int> cnt1(n + 1, 0), cnt2(n + 1, 0); forn(i, n) { if(a[i] > 0) { if(!cnt2[a[i]])flow.push_back(a[i]); else { --cnt2[a[i]]; continue; } ++cnt1[a[i]]; } else { if(!cnt1[-a[i]])flow.push_back(a[i]); else { --cnt1[-a[i]]; continue; } cnt2[-a[i]]++; } } assert(flow.size() == n /2); for(int i = 0;i < n / 2;++i) { if(flow[i] < 0) { int now = le[-flow[i]][0]; int f = -flow[i]; assert(ri[f].size() && le[f].size()); int tar = ri[f][0]; assert(tar > now); ans += tar - now - F.sum(now) + F.sum(tar) - 1; F.add(now + 1, 1); F.add(tar, -1); le[f].erase(le[f].begin()); ri[f].erase(ri[f].begin()); } else { int now = ri[flow[i]][0]; int f = flow[i]; assert(ri[f].size() && le[f].size()); int tar = le[f][0]; assert(tar > now); ans += tar - now - F.sum(now) + F.sum(tar); F.add(now, 1); F.add(tar, -1); le[f].erase(le[f].begin()); ri[f].erase(ri[f].begin()); } } return ans; }

Compilation message (stderr)

In file included from /usr/include/c++/9/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/9/bits/stdc++.h:33,
                 from shoes.cpp:2:
shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:81:24: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   81 |     assert(flow.size() == n /2);
      |            ~~~~~~~~~~~~^~~~~~~
#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...