Submission #426953

#TimeUsernameProblemLanguageResultExecution timeMemory
426953APROHACKArranging Shoes (IOI19_shoes)C++14
100 / 100
249 ms40004 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define PB push_back
struct segtree{
	long long dd, htt, mid, val;
	segtree *L, *R;
	segtree(int l, int r){
		//cout<<l<<" "<<r<<endl;
		htt=r;
		dd=l;
		val=0;
		mid=(htt+dd)/2;
		if(l!=r){
			L=new segtree(l, mid);
			R=new segtree(mid+1, r);
			val=L->val+R->val;
		}else{
			val=1;
		}
		
	}
	void update(int ps){
		
		if(dd==htt){
			val=0;
			//cout<<ps<<endl;
			return ;
		}
		if(ps<=mid){
			L->update(ps);
		}else{
			R->update(ps);
		}
		val=L->val+R->val;
	}
	long long query(int l, int r){
		if(dd==l&&r==htt){
			return val;
		}
		else if(r<=mid)return L->query(l, r);
		else if(l>mid)return R->query(l, r);
		else return L->query(l, mid)+R->query(mid+1, r);
	}

};
long long count_swaps(std::vector<int> s) {
	long long n = s.size()/2, sum=0;
	/*
	for(int i = 0 ; i < n ; i++){
		sum+=i;
	}*/
	vector<int>pos[n*2+1];
	int conut[n*2+1];
	memset(conut, -1, sizeof conut);
	//bool contado[n*2+1];
	for(int i = 0 ; i < n * 2 ; i++){
		//contado[abs(s[i])*2]=false;
		if(s[i]>0){//par
			pos[s[i]*2].PB(i);
			if(conut[s[i]*2]==-1)conut[s[i]*2]=0;
		}else{
			pos[(-s[i]*2)-1].PB(i);
			if(conut[-s[i]*2-1]==-1)conut[(-s[i]*2)-1]=0;
		}
	}
	segtree *tree = new segtree(0, n*2);
	for(int i = 0 ; i < n*2 ; i++){
		if(s[i]>0){
			conut[s[i]*2]++;
			s[pos[s[i]*2-1][conut[s[i]*2-1]]]=0;
			
			//cout<<i<<" "<<pos[s[i]*2-1][conut[s[i]*2-1]]<<" = "<<tree->query(i, pos[s[i]*2-1][conut[s[i]*2-1]])<<endl;
			sum+=tree->query(i, pos[s[i]*2-1][conut[s[i]*2-1]])-1;
			tree->update(pos[s[i]*2-1][conut[s[i]*2-1]]);
			//cout<<'s'<<sum<<endl;
			conut[s[i]*2-1]++;
		}else if(s[i]<0){
			conut[-s[i]*2-1]++;
			s[pos[-s[i]*2][conut[-s[i]*2]]]=0;
			
			if(i+1<pos[-s[i]*2][conut[-s[i]*2]])sum+=tree->query(i+1, pos[-s[i]*2][conut[-s[i]*2]])-1;
			tree->update(pos[-s[i]*2][conut[-s[i]*2]]);
			conut[-s[i]*2]++;
			
			//cout<<'s'<<sum<<endl;
		}
	}

	return sum;
}
#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...