알고리즘 블로그
Published 2025. 9. 29. 21:41
[IOI 2019] Arranging Shoes PS 문제들

https://oj.uz/problem/view/IOI19_shoes

 

ioi에 이상한 문제도 좀 있는 것 같다.

이게 왜 플래1인지 전혀 모르겠다.

 

그냥 가까운 짝 찾아서 매칭하는 전략이 먹히는지 $O(n^2)$에 대충 해서 넣었더니 50점 나오는걸 확인하고 바로 펜윅으로 짜서 맞혔다.

그냥 내가 사용하는 swap중에 안 써도 되는게 하나도 없고, 더 좋은 매칭도 없다는게 자명하다고 생각한다.

플래 5 같다.

 

대충 셋으로 짝꿍 인덱스를 찾았는데, 벡터로 해도 된다.

 

(플래 스트릭을 아껴야 하므로.. oj.uz에 채점해두고 BOJ에 스트릭 안 채운 날 하나씩 까먹을 예정)

 

#include "shoes.h"
#include <bits/stdc++.h>
using namespace std; using ll = long long;

const int N = 1e5 + 3;
set<ll> trunk[N+N];
auto *pos = trunk+N;

struct BIT {
	ll t[2*N+2];
	void add(int k, ll x) {
		for(++k; k<=2*N; k+=k&-k) t[k]+=x;
	}
	ll sum(int l, int r) {
		ll res=0;
		for(; l; l-=l&-l) res-=t[l];
		for(++r; r; r-=r&-r) res+=t[r];
		return res;
	}
} ds;

ll count_swaps(vector<int> s) {
	ll n = size(s)/2, cnt=0;
	for(int i=0; i<2*n; ++i) {
		pos[s[i]].insert(i);
		ds.add(i, +1);
	}
	for(int i=0; i<2*n; ++i) if(pos[s[i]].contains(i)) {
		pos[s[i]].erase(i);
		ll j=*pos[-s[i]].begin(); pos[-s[i]].erase(j);
		
		cnt += ds.sum(i+1, j-1) + (s[i]>0);
		ds.add(i, -1), ds.add(j, -1);
	}
	return cnt;
}

'PS 문제들' 카테고리의 다른 글

[충남대 SW-IT 2025] Designing a Tree  (2) 2025.10.02
[KTSC 2019] 외계 선인장  (0) 2025.09.29
[IOI 2014] Game  (0) 2025.09.28
[APIO 2015] 발리의 조각상  (0) 2025.09.28
[IOI 2017] The Big Prize  (0) 2025.09.25
profile

알고리즘 블로그

@도훈.

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...