제출 #1266143

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

int fw[200005];
int qry(int x){
	int ret=0;
	while(x){
		ret+=fw[x];
		x-=(x&(-x));
	}
	return ret;
}
void upd(int x, int v){
	while(x <= 200005){
		fw[x]+=v;
		x+=(x&(-x));
	}
}

long long count_swaps(vector<int> s) {
	int n=s.size();
	vector<vector<vector<int>>> szs(n+1, vector<vector<int>>(2));
	for(int i=0;i<n;i++){
		if(s[i] < 0){
			szs[-s[i]][0].push_back(i);
		}
		else {
			szs[s[i]][1].push_back(i);
		}
	}
	vector<int> rgt(n, -1);
	long long ans=0;
	for(int i=1;i<=n;i++){
		assert(szs[i][0].size() == szs[i][1].size());
		for(int j=0;j<(int)szs[i][0].size();j++){
			if(szs[i][1][j] < szs[i][0][j]){
				ans++;
			}
			rgt[min(szs[i][1][j], szs[i][0][j])]=max(szs[i][1][j], szs[i][0][j]);
		}
	}
	//~ cout<<ans<<endl;
	for(int i=0;i<n;i++){
		if(rgt[i]==-1)continue;
		int l=i+qry(i), r=rgt[i]+qry(rgt[i]);
		//~ printf("i %lld, l %lld, r %lld\n", i, l, r);
		assert(l < r);
		ans += r-l-1;
		
		upd(i+1, 1);
		upd(rgt[i], -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...