제출 #399407

#제출 시각아이디문제언어결과실행 시간메모리
399407_Avocado_Arranging Shoes (IOI19_shoes)C++14
100 / 100
975 ms239612 KiB
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define int int64_t

vector<int>seg;

void update(int k, int v, int pos, int l, int r){
	if(l == r){
		seg[pos] = v;
		return;
	}
	else if(k <= (l+r)/2) update(k, v, pos*2, l, (r+l)/2);
	else update(k, v, pos*2+1, (l+r)/2+1, r);
	
	seg[pos] = seg[pos*2] + seg[pos*2+1];
}

int query(int ql, int qr, int pos, int l, int r){
	if(l >= ql && r <= qr) return seg[pos];
	else if(l > qr || r < ql) return 0;
	else return query(ql, qr, pos*2, l, (l+r)/2) + query(ql, qr, pos*2+1, (l+r)/2+1, r);
}

int solve(vector<int>&shoes, int n){
	vector<vector<int>>fred(n);
	seg.assign(n*4, 0);
	
	for(int i = 0; i<n; ++i){
		fred[i] = {shoes[i], i};
	}
	
	sort(fred.begin(), fred.end());
	reverse(fred.begin(), fred.end());
	
	int ans = 0;
	
	for(int i = 0; i<n; ++i){
		ans += query(0, fred[i][1]-1, 1, 0, n-1);
		update(fred[i][1], 1, 1, 0, n-1);
	}
	
	return ans;
}

long long count_swaps(std::vector<int32_t>v){
	int n = v.size();
	
	map<int, queue<int>>mp;
	map<int, queue<int>>index;
	vector<int>shoes(n);
	
	vector<int>flag(n);
		
	int cur = 1;
	
	for(int i = 0; i<n; ++i){
		if(index[-v[i]].size() >= 1 && flag[index[-v[i]].front()]){
			if(v[i] > 0) shoes[i] = mp[-v[i]].front()+1;
			else shoes[i] = mp[-v[i]].front()-1;
			index[-v[i]].pop();
			mp[-v[i]].pop();
		}
		else if(v[i] < 0){
			index[v[i]].push(i);
			mp[v[i]].push(cur);
			shoes[i] = cur;
			flag[i] = 1;
			cur += 2;
		}
		else{
			index[v[i]].push(i);
			mp[v[i]].push(cur+1);
			shoes[i] = cur+1;
			flag[i] = 1;
			cur += 2;
		}
	}
	
		
	/*
	for(int i = 0; i<n; ++i){
		if(v[i] > 0){
			shoes[i] = mp[-v[i]].front()+1;
			mp[-v[i]].pop();
		}
	}
	*/
	
	/*	
	for(auto u: shoes) cout<<u<<" ";
	cout<<endl;
	*/
	
	int ans = solve(shoes, n);
	
	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...