제출 #986873

#제출 시각아이디문제언어결과실행 시간메모리
986873PagodePaivaArranging Shoes (IOI19_shoes)C++17
10 / 100
289 ms281944 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;
const int N = 400010;
queue <int> q[N];
int res[N];
int p[N];

struct Segtree{
	int tree[4*N], lazy[4*N];
	int join(int a, int b){
		return a+b;
	}
	void unlazy(int node, int l, int r){
		tree[node] += (r-l+1)*lazy[node];
		if(l != r){
			lazy[2*node] += lazy[node];
			lazy[2*node+1] += lazy[node];
		}
		lazy[node] = 0;
		return;
	}
	void build(int node, int l,int r){
		if(l == r){
			tree[node] = 0;
			lazy[node] = 0;
			return;
		}
		int mid = (l+r)/2;
		build(2*node, l, mid);
		build(2*node+1, mid+1, r);
		tree[node] = 0;
		lazy[node] = 0;
		return;
	}
	void update(int node, int l, int r, int tl, int tr, int val){
		unlazy(node,tl,tr);
		if(l <= tl and tr <= r){
			lazy[node] += val;
			unlazy(node,tl,tr);
			return;
		}
		if(l > tr or tl > r) return;
		int mid = (tl+tr)/2;
		update(2*node, l, r, tl, mid, val);
		update(2*node+1, l, r, mid+1, tr, val);
		tree[node] = join(tree[2*node], tree[2*node+1]);
		return;
	}
	int query(int node, int l, int r, int tl, int tr){
		unlazy(node, tl, tr);
		if(l <= tl and tr <= r) return tree[node];
		if(l > tr or tl > r) return 0;
		int mid = (tl+tr)/2;
		return join(query(2*node, l, r, tl, mid), query(2*node+1, l, r, mid+1, tr));
	}
} seg;

long long count_swaps(std::vector<int> v) {
	int n = v.size();
	int num = n;
	for(int i = v.size()-1;i >= 0;i--){
		if(q[v[i]+n].empty()){
			if(v[i] > 0){
				res[i+1] = num;
				q[n-v[i]].push(num-1);
			}
			else{
				res[i+1] = num-1;
				q[n-v[i]].push(num);
			}
			num -= 2;
		}
		else{
			res[i+1] = q[v[i]+n].front();
			q[v[i]+n].pop();
		}
	}
	seg.build(1, 1, n);
	for(int i = 1;i <= n;i++){
		// cout << res[i] << ' ';
		seg.update(1, res[i], res[i], 1, n, i);
	}
	int resp = 0;
	for(int i = n;i > 0;i--){
		resp += i - seg.query(1, i, i, 1, n);
		seg.update(1, seg.query(1, i, i, 1, n), i, 1, n, -1);
	}
	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...