Submission #1351410

#TimeUsernameProblemLanguageResultExecution timeMemory
1351410vahagngArranging Shoes (IOI19_shoes)C++20
45 / 100
80 ms14296 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 1;

struct segtree{
	struct Node{
		int mn, mx, lazy;
	};

	int size = 1;
	vector<Node> stree;

	void init(int n){
		while(size <= n) size <<= 1;
		stree.assign(4*size, {N, -N, -N});
	}

	void push(int x, int lx, int rx){
		if(rx - lx == 1 || stree[x].lazy == -N) return;
		stree[2*x+1].lazy = stree[2*x+1].mn = stree[2*x+1].mx = stree[x].mx;
		stree[2*x+2].lazy = stree[2*x+2].mn = stree[2*x+2].mx = stree[x].mx;
		stree[x].lazy = -N;
	}

	void upd(int l, int r, int v, int x, int lx, int rx){
		push(x, lx, rx);
		if(lx >= r || rx <= l) return;
		if(lx >= l && rx <= r) {
			stree[x].mx = stree[x].mn = stree[x].lazy = v;
			return;
		}
		int m = (lx + rx) / 2;
		upd(l, r, v, 2 * x + 1, lx, m);
		upd(l, r, v, 2 * x + 2, m, rx);
		stree[x].mx = max(stree[2*x+1].mx, stree[2*x+2].mx);
		stree[x].mn = min(stree[2*x+1].mn, stree[2*x+2].mn);
	}

	int qry_mn(int l, int x, int lx, int rx){
		push(x, lx, rx);
		if(rx <= l) return -1;
		if(stree[x].mn > 0) return -1;
		if(rx - lx == 1){
			return lx;
		}
		int m = (lx + rx) / 2;
		int res = qry_mn(l, 2 * x + 1, lx, m);
		if(res == -1) res = qry_mn(l, 2*x + 2, m, rx);
		return res;
	}

	int qry_mx(int l, int x, int lx, int rx){
		push(x, lx, rx);
		if(rx <= l) return -1;
		if(stree[x].mx < 0) return -1;
		if(rx - lx == 1){
			return lx;
		}
		int m = (lx + rx) / 2;
		int res = qry_mx(l, 2 * x + 1, lx, m);
		if(res == -1) res = qry_mx(l, 2*x + 2, m, rx);
		return res;
	}

	void upd(int l, int r, int v){
		upd(l, r, v, 0, 0, size);
	}

	int qry_mn(int l){
		return qry_mn(l, 0, 0, size);
	}

	int qry_mx(int l){
		return qry_mx(l, 0, 0, size);
	}
} st;

long long count_swaps(std::vector<int> s) {
	st.init(s.size() + 1);
	int S = abs(s[0]);
	for(int i = 0; i < s.size(); i++){
		st.upd(i, i + 1, s[i]);
	}
	long long ans = 0;
	for(int i = 0; i < s.size() - 1; i++){
		if(i & 1){
			int id = st.qry_mx(i);
			ans += (id - i + 0ll);
			st.upd(i + 1, id + 1, -S);
		}else{
			int id = st.qry_mn(i);
			ans += (id - i + 0ll);
			st.upd(i + 1, id + 1, S);
		}
	}
	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...