제출 #1152665

#제출 시각아이디문제언어결과실행 시간메모리
1152665the_coding_poohArranging Shoes (IOI19_shoes)C++20
100 / 100
131 ms143536 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define uwu return

#define fs first
#define sc second

#define all(x) x.begin(), x.end()

using namespace std;

const int SIZE = 2e5 + 5;

deque <int> r_pos[SIZE];

long long BITree[SIZE];

void add(int pos, int a){
	for (pos = SIZE - pos; pos < SIZE; pos += (pos & -pos)){
		BITree[pos] += a;
	}
	uwu;
}

long long query(int pos){
	long long ret = 0;
	for (pos = SIZE - pos; pos; pos -= (pos & -pos)){
		ret += BITree[pos];
	}
	uwu ret;
}

long long count_cross(vector <pair<int, int>> intv){
	vector <pair<int, int>> event;
	for(auto i:intv){
		event.push_back({i.fs, 1});
		event.push_back({i.sc, -i.fs});
	}
	sort(all(event));
	memset(BITree, 0, sizeof(BITree));
	long long ret = 0;
	for (auto i : event){
		if(i.sc == 1){
			add(i.fs, 1);
		}
		else{
			add(-i.sc, -1);
			ret += query(-i.sc);
		}
	}
	uwu ret;
}

long long count_contains(vector <pair<int, int>> intv){
	vector <pair<int, int>> event;
	for(auto i:intv){
		event.push_back({i.fs, 1});
		event.push_back({i.sc, -i.fs});
	}
	sort(all(event));
	memset(BITree, 0, sizeof(BITree));
	long long ret = 0;
	for (auto i : event){
		if(i.sc != 1){
			ret += query(-i.sc);
			add(-i.sc, 1);
		}
	}
	uwu ret;
}

long long count_swaps(vector<int> s) {
	int N = s.size() / 2;
	for (int i = 0; i < 2 * N; i++){
		if(s[i] > 0)
			r_pos[s[i]].push_back(i);
	}
	vector <pair<int, int>> team_up;
	long long lr_swap = 0;
	for (int i = 0; i < 2 * N; i++){
		if(s[i] < 0){
			team_up.push_back({i, r_pos[-s[i]].front()});
			r_pos[-s[i]].pop_front();
			if(team_up.back().sc < team_up.back().fs){
				lr_swap++;
				swap(team_up.back().fs, team_up.back().sc);
			}
		}
	}
	long long cs = count_cross(team_up), ct = count_contains(team_up);
	// cerr << lr_swap << ' ' << cs << ' ' << ct << '\n';
	uwu lr_swap + cs + 2 * ct;
}
#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...