Submission #1230672

#TimeUsernameProblemLanguageResultExecution timeMemory
1230672djsksbrbfArranging Shoes (IOI19_shoes)C++20
0 / 100
0 ms324 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
#define ll long long
using namespace std;

int n;
vector <int> lazy, seg;

void prop(int l, int r, int x){
	if(l != r){
		lazy[2*x] += lazy[x];
		lazy[2*x + 1] += lazy[x];
	}
	
	seg[x] += lazy[x];
	lazy[x] = 0;
}

void upd(int l, int r, int tl, int tr, int pos, int val){
	prop(l, r, pos);
	
	if(r < tl || tr < l)return;
	
	if(l <= tl && tr <= r){
		lazy[pos] += val;
		prop(l, r, pos);
	}
	else{
		int mid = (l + r) >> 1;
		upd(l, mid, tl, tr, 2*pos, val);
		upd(mid + 1, r, tl, tr, 2*pos + 1, val);
		seg[pos] = max(seg[2*pos], seg[pos*2 + 1]);
	}
}

int query(int l, int r, int tl, int tr, int pos){
	prop(l, r, pos);
	if(tl <= l && r <= tr)return seg[pos];
	if(tr < l || r < tl)return 0;
	
	int mid = (l + r) >> 1;
	return max(query(l, mid, tl, tr, 2*pos), query(mid + 1, r, tl, tr, 2*pos + 1));
}

long long count_swaps(vector<int> v) {
	n = (int)v.size();
	
	lazy = seg = vector <int> (4*n + 5, 0);
	deque <int> dq[2][n + 5];
	
	for(int i = 0 ; i < n ; i++){
		if(v[i] < 0)dq[0][-v[i]].pb(i);
		else dq[1][v[i]].pb(i);
		
		upd(0, n, i, i, 0, i);
	}
	
	ll ans = 0;
	bool vis[n + 1];memset(vis, 0, sizeof(vis));
	
	ll idx = 0;
	for(int i = 0 ; i < n ; i++){
		if(vis[i])continue;
		
		if(v[i] < 0){
			ll tmp = dq[1][abs(v[i])].front();
			dq[0][abs(v[i])].pop_front();
			dq[1][abs(v[i])].pop_front();
			
			vis[tmp] = 1;
			
			ll tot = query(0, n, tmp, tmp, 0);
			ans += tot - idx;
			ans--;
			upd(0, n, 0, tmp, 0, 1);
		}
		else{
			ll tmp = dq[0][abs(v[i])].front();
			dq[0][abs(v[i])].pop_front();
			dq[1][abs(v[i])].pop_front();
			
			vis[tmp]  =1;
			ll tot = query(0, n, tmp, tmp, 0);
			ans += tot - idx;
			ans--;
			
			upd(0, n, 0, tmp, 0, 1);
			ans++;
		}
		
		idx += 2;
		vis[i] = 1;
	}
	
	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...