제출 #1355965

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

using ll = long long;

int fw[200050];
queue <int> qu1[200050];//positive
queue <int> qu2[200050];//negative, store as positive

void update(int id,int n,int va){
	for (int i = id; i<=n; i+=(i&-i)){
		fw[i]+=va;
	}
}

int query(int id,int n){
	int tmp = 0;
	for (int i = id; i>=1; i-=(i&-i)){
		tmp += fw[i];
	}
	return tmp;
}

long long count_swaps(std::vector<int> s) {
	ll si = s.size();
	//cout << si << "\n";
	ll ans = 0;
	for (ll i=0; i<si; i++){
		//cout << i << ' ';
		int tmi = i - query(i+1,si);
		if(s[i] > 0){
			if(!qu2[s[i]].size()){
				qu1[s[i]].push(i);
			}else{
				ans += tmi - (qu2[s[i]].front() + query(qu2[s[i]].front()+1,si)) - 1;
				//cout << i << "|" << tmi - (qu2[s[i]].front() - query(qu2[s[i]].front()+1,si)) - 1 << " " << tmi << " " << qu2[s[i]].front() << " " << query(qu2[s[i]].front()+1,si) << "|\n";
				update(qu2[s[i]].front()+1,si,1);
				update(i+1,si,-1);
				qu2[s[i]].pop();
			}
		}else{
			s[i] *= -1;
			if(!qu1[s[i]].size()){
				qu2[s[i]].push(i);
			}else{
				ans += tmi - (qu1[s[i]].front() + query(qu1[s[i]].front()+1,si));
				//cout << i << "|" << tmi - (qu1[s[i]].front() - query(qu1[s[i]].front()+1,si)) << " " << tmi << " " << qu1[s[i]].front() << " " << query(qu1[s[i]].front()+1,si) << "||\n";
				update(qu1[s[i]].front()+1,si,1);
				update(i+1,si,-1);
				qu1[s[i]].pop();
			}
		}
		//cout << "E";
	}
	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...