제출 #1212536

#제출 시각아이디문제언어결과실행 시간메모리
1212536loiiii12358Arranging Shoes (IOI19_shoes)C++20
45 / 100
52 ms5808 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> seg;

void build(int id,int l,int r){
	if(l==r){
		seg[id]=1;
		return;
	}
	int m=(l+r)/2;
	build(id*2,l,m);
	build(id*2+1,m+1,r);
	seg[id]=seg[id*2]+seg[id*2+1];
}

void update(int id,int l,int r,int x){
	if(l==r){
		seg[id]=0;
		return;
	}
	int m=(l+r)/2;
	if(x<=m){
		update(id*2,l,m,x);
	}else{
		update(id*2+1,m+1,r,x);
	}
	seg[id]=seg[id*2]+seg[id*2+1];
}

int query(int id,int l,int r,int x){
	if(r<=x){
		return seg[id];
	}else if(l>x){
		return 0;
	}
	int m=(l+r)/2;
	return query(id*2,l,m,x)+query(id*2+1,m+1,r,x);
}

long long count_swaps(vector<int> s) {
	long long n=s.size()/2,ans=0,l,r;
	queue<int> pos,neg;
	for(int i=0;i<2*n;i++){
		if(s[i]>0){
			pos.push(i);
		}else{
			neg.push(i);
		}
	}
	seg.resize(8*n);
	build(1,0,2*n-1);
	for(int i=0;i<n;i++){
		l=query(1,0,2*n-1,neg.front())-1;
		r=query(1,0,2*n-1,pos.front())-1;
		if(l<r){
			r--;
		}
		ans+=l+r;
		update(1,0,2*n-1,neg.front());
		update(1,0,2*n-1,pos.front());
		neg.pop();pos.pop();
	}
	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...