Submission #295007

#TimeUsernameProblemLanguageResultExecution timeMemory
295007Atill83Arranging Shoes (IOI19_shoes)C++14
100 / 100
401 ms344440 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = (int) 1e5 + 5;


int t[8*MAXN];
int lazy[8*MAXN];
void build(int v, int tl, int tr){
	if(tl == tr){
		t[v] = tl;
	}else{
		int tm = (tl + tr) / 2;
		build(2*v, tl, tm);
		build(2*v+1, tm + 1, tr);
	}
}

void push(int v){
	t[2*v] += lazy[v];
	t[2*v + 1] += lazy[v];
	lazy[2*v] += lazy[v];
	lazy[2*v + 1] += lazy[v];
	lazy[v] = 0;
}

void upd(int v, int tl, int tr, int l, int r){
	if(l > r) return;
	if(tl == l && tr == r){
		lazy[v]++;
		t[v]++;
	}else{
		push(v);
		int tm = (tl + tr) / 2;
		upd(2*v, tl, tm, l, min(tm, r));
		upd(2*v+1, tm + 1, tr, max(tm + 1, l), r);
	}
}

int que(int v, int tl, int tr, int pos){
	if(tl == tr) return t[v];
	else{
		push(v);
		int tm = (tl + tr) / 2;
		if(pos <= tm) return que(2*v, tl, tm, pos);
		else return que(2*v + 1, tm + 1, tr, pos);
	}
}


deque<int> dq[5*MAXN];


long long count_swaps(vector<int> s) {
	build(1, 0, s.size() - 1);
	ll ans = 0;
	for(int idx = 0; idx < s.size(); idx++){
		int i = s[idx];
		int ot = -i;
		if(dq[ot + MAXN].empty()){
			dq[i + MAXN].push_back(idx);
		}else{
			int ooidx = dq[ot + MAXN].front();
			dq[ot + MAXN].pop_front();
			int oidx = que(1, 0, s.size() - 1, ooidx);
			//cerr<<idx<<" "<<oidx<<endl;
			if(i < 0){
				ans += (idx - oidx);
			}else{
				ans += (idx - oidx - 1);
			}
			upd(1, 0, s.size() - 1, ooidx + 1, idx - 1);
		}
	}
	return ans;
}

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:58:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |  for(int idx = 0; idx < s.size(); idx++){
      |                   ~~~~^~~~~~~~~~
#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...