Submission #826678

#TimeUsernameProblemLanguageResultExecution timeMemory
826678AlesL0Arranging Shoes (IOI19_shoes)C++17
100 / 100
74 ms20684 KiB
#include <bits/stdc++.h>
#include "shoes.h"

using namespace std;

typedef long long ll;

ll sol = 0, k = 1;

vector <ll> T;

void build(ll n){
	while (k < n)k *= 2;
	T.resize(2*k, 0);
}

void update(ll x){
	x += k;
	T[x] = 1;
	for (x >>= 1; x; x >>= 1)T[x] = T[2*x]+T[2*x+1];
}

ll range_sum(ll x, ll y){
	if (y <= x)return 0;
	ll sum = 0;
	for (x += k, y += k; y > x; x >>= 1, y >>= 1){
		if (x & 1)sum += T[x++];
		if (y & 1)sum += T[--y];
	}
	return sum;
}

long long count_swaps(std::vector<int> s) {
	ll n = s.size()/2;
	vector <vector <ll>> loc_pos(n+1), loc_neg(n+1);
	for (int i = 0; i < s.size(); i++){
		if (s[i] > 0)loc_pos[s[i]].push_back(i);
		else loc_neg[-s[i]].push_back(i);
	}
	vector <ll> point(n+1);
	for (int i = 0; i <= n; i++)point[i] = loc_pos[i].size()-1;
	vector <pair<ll, ll>> couples;
	vector <bool> taken(s.size(), 0);
	for (int i = s.size()-1; i >= 0; i--){
		if (taken[i])continue;
		ll x;
		if (s[i] > 0){
			x = loc_neg[s[i]][point[s[i]]];
			point[s[i]]--;
		}
		else {
			sol++;
			x = loc_pos[-s[i]][point[-s[i]]];
			point[-s[i]]--;
		}
		taken[x] = 1;
		couples.push_back({x, i});
	}
	build(s.size());
	reverse(couples.begin(), couples.end());
	for (auto p : couples){
		//cerr << p.first << " " << p.second << "\n";

		sol += range_sum(p.first, p.second);
		update(p.first);
		update(p.second);
	}
	return sol;
}

Compilation message (stderr)

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:36:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  for (int i = 0; i < s.size(); i++){
      |                  ~~^~~~~~~~~~
#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...