제출 #1181384

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

vector<int> poses[100005][2];
int fwk[200005];
bool vis[200005];

void upd(int idx, int val) {
	//cout << idx << ' ';
	for(;idx <= 200000; idx+=idx&-idx)
		fwk[idx] += val;
}

int qr(int idx) {
	int sum = 0;
	for(;idx;idx-=idx&-idx)
		sum += fwk[idx];
	return sum;
}

int gcidx(int idx) {
	return idx - qr(idx);
}

long long count_swaps(std::vector<int> s) {
	long long res = 0;
	for(int i=s.size()-1;i>=0;i--) {
		if(s[i] < 0) poses[-s[i]][0].push_back(i);
		else poses[s[i]][1].push_back(i);
	}
	for(int i=0;i<s.size();i++) {
		if(vis[i]) continue;
		int bruhbruh = max(s[i], -s[i]);
		if(s[i] < 0) {
			int cl = gcidx(i+1), cr = gcidx(poses[-s[i]][1].back() + 1);
			res += (cr - cl - 1);
			upd(i+1, 1); upd(poses[-s[i]][1].back() + 1, 1);
		} else {
			int cl = gcidx(i+1), cr = gcidx(poses[s[i]][0].back() + 1);
			res += (cr - cl);
			upd(i+1, 1); upd(poses[s[i]][0].back() + 1, 1);
		}
		vis[poses[bruhbruh][0].back()] = 1;
		vis[poses[bruhbruh][1].back()] = 1;	
		poses[bruhbruh][0].pop_back();
		poses[bruhbruh][1].pop_back();
	}
	return res;
}
#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...