제출 #161694

#제출 시각아이디문제언어결과실행 시간메모리
161694InkretBearArranging Shoes (IOI19_shoes)C++14
10 / 100
11 ms9720 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;

const int MAXN=200000+100;
int fen[MAXN];

int querry(int j){
	if (j==0){
		return 0;
	}
	return fen[j]+querry(j-(j&-j));
}

long long count_swaps(vector<int> a){
	int n=a.size();
	int f=0;
	long long rez=0;
	vector<int> v1[MAXN],v2[MAXN];
	for (int i=0;i<n;++i){
		int curr=a[i];
		if (curr>0){
			v1[curr].push_back(i);
			if (!v2[curr].empty()){
				int x=*--v2[curr].end();
				v2[curr].pop_back();
				v1[curr].pop_back();
				rez+=i+x-2*f-querry(i+1)-querry(x+1)+2*querry(1+2*f)-1;
				for (int j=i+1;j<=MAXN;j+=j&-j){
					++fen[j];
				}
				for (int j=x+1;j<=MAXN;j+=j&-j){
					++fen[j];
				}
				++f;
			}
		}
		else {
			curr*=-1;
			v2[curr].push_back(i);
			if (!v1[curr].empty()){
				int x=*--v1[curr].end();
				v2[curr].pop_back();
				v1[curr].pop_back();
				rez+=i+x-2*f-querry(i+1)-querry(x+1)+2*querry(1+2*f);
				for (int j=i+1;j<=MAXN;j+=j&-j){
					++fen[j];
				}
				for (int j=x+1;j<=MAXN;j+=j&-j){
					++fen[j];
				}
				++f;
			}
		}
	}
	return rez;
}
#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...