제출 #342054

#제출 시각아이디문제언어결과실행 시간메모리
342054DrearyJokeArranging Shoes (IOI19_shoes)C++17
100 / 100
203 ms34360 KiB
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include "shoes.h"
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ll> vll;
typedef vector<vector<ll>> vvll;
typedef vector<bool> vb;
typedef tree<ll, null_type, less_equal<ll>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;

template <typename T, typename U> std::istream&operator>>(std::istream&i, pair<T,U>&p) {i >> p.x >> p.y; return i;}
template<typename T>std::istream&operator>>(std::istream&i,vector<T>&t) {for(auto&v:t){i>>v;}return i;}
template <typename T, typename U> std::ostream&operator<<(std::ostream&o, const pair<T,U>&p) {o << p.x << ' ' << p.y; return o;}
template<typename T>std::ostream&operator<<(std::ostream&o,const vector<T>&t) {if(t.empty())o<<'\n';for(size_t i=0;i<t.size();++i){o<<t[i]<<" \n"[i == t.size()-1];}return o;}

#define deb(x) cout << '>' << #x << ':' << x << endl;
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define END '\n'
#define inf 9e18
#define ff first
#define ss second
#define pb push_back


struct SegTree {
	int n = 1;
	vi st;
	SegTree (int sz) {
		while(n < sz) n <<= 1;
		st.resize(n << 1, 0);
	}
	void add(int pos, int x, int lx, int rx) {
		if (rx - lx == 1) {
			st[x] = 1;
			return;
		}
		int mid = (lx + rx) >> 1, a = (x << 1) | 1, b = (x << 1) + 2;
		if (pos < mid) add(pos, a, lx, mid);
		else add(pos, b, mid, rx);
		st[x] = st[a] + st[b];
	}
	void add(int pos) {
		add(pos, 0, 0, n);
	}
	int query(int l, int r, int x, int lx, int rx) {
		if (rx <= l || lx >= r) return 0;
		if (lx >= l && rx <= r) return st[x];
		int mid = (lx + rx) >> 1, a = (x << 1) | 1, b = (x << 1) + 2;
		return query(l, r, a, lx, mid) + query(l, r, b, mid, rx);
	}
	int query(int l, int r) {
		return query(l, r, 0, 0, n);
	}
};

long long count_swaps(std::vector<int> s) {
	int n = s.size();
	vector<set<int>> A(n + 1), B(n + 1);
	vi done(n, 0);
	SegTree st(n);
	for (int i = 0; i < n; ++i) {
		if (s[i] > 0) A[s[i]].insert(i);
		else B[-s[i]].insert(i);
	}
	int idx = 0;
	ll ans = 0;
	for (int i = 0; i < n; ++i) {
		int nxt;
		if (done[i]) {
			continue;
		}
		if (s[i] > 0) {
			A[s[i]].erase(i);
			nxt = *B[s[i]].begin();
			B[s[i]].erase(B[s[i]].begin());
		} else {
			B[-s[i]].erase(i);
			nxt = *A[-s[i]].begin();
			A[-s[i]].erase(A[-s[i]].begin());
		}
		// cout << i << " " << s[i] << " " << idx << " " << nxt << " " << get_off(done, n, nxt) << END;
		ans += (nxt + st.query(nxt, n)) - idx - 1;
		done[nxt] = 1;
		st.add(nxt);
		if (s[i] > 0) ++ans;
		idx += 2;
		// cout << ans << END;
	}
	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...