Submission #1097857

#TimeUsernameProblemLanguageResultExecution timeMemory
1097857NewtonabcArranging Shoes (IOI19_shoes)C++14
100 / 100
198 ms274824 KiB
#include "shoes.h"
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int MIDX=2e5;
int n,fw[N],arr[N];
stack<int> pos[N],rpos[N];
void update(int idx,int val){
	while(idx<=MIDX){
		fw[idx]+=val;
		idx+=idx & -idx;
	}
}
long long read(int idx){
	long long sum=0;
	while(idx>0){
		sum+=fw[idx];
		idx-=idx & -idx;
	}
	return sum;
}
long long count_swaps(vector<int> s) {
	n=s.size()/2;
	int lidx,ridx;
	long long ans=0;
	for(int i=1;i<=2*n;i++) arr[i]=s[i-1],update(i,1);
	for(int i=2*n;i>=1;i--){
		if(arr[i]<0) rpos[-arr[i]].push(i);
		else pos[arr[i]].push(i);
	}
	for(int i=1;i<=2*n;i++){
		//cout<<pos[2].top() <<" " <<rpos[2].top() <<"\n";
		if(read(i)-read(i-1)==0) continue;
		if(arr[i]<0){
			lidx=i;
			ridx=pos[-arr[i]].top();
			pos[-arr[i]].pop(),rpos[-arr[i]].pop();
			ans+=read(ridx)-read(lidx)-1;
			//cout<<read(ridx) <<" " <<read(lidx) <<"\n";
			update(lidx,-1),update(ridx,-1);
			continue;
		}
		ridx=i;
		lidx=rpos[arr[i]].top();
		rpos[arr[i]].pop(),pos[arr[i]].pop();
		ans+=read(lidx)-read(ridx);
		//cout<<read(lidx) <<" " <<read(ridx) <<"\n";
		update(lidx,-1),update(ridx,-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...