Submission #418272

#TimeUsernameProblemLanguageResultExecution timeMemory
418272JosiaArranging Shoes (IOI19_shoes)C++14
100 / 100
254 ms145720 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;


#define int int64_t

vector<int> tree;


void update(int v, int rl, int rr, int pos, int x) {
	if (rl == rr) {
		tree[v] = x;
		return;
	}

	int rm = (rl + rr)/2;

	if (pos <= rm) update(v*2, rl, rm, pos, x);
	else update(v*2+1, rm+1, rr, pos, x);

	tree[v] = tree[v*2] + tree[v*2+1];
}


int querry(int v, int rl, int rr, int ql, int qr) {
	if (ql > qr) return 0;
	if (rl == ql && rr == qr) {
		return tree[v];
	}
	int rm = (rl + rr) / 2;

	return querry(v*2, rl, rm, ql, min(qr, rm)) + querry(v*2+1, rm+1, rr, max(rm+1, ql), qr);
}



long long count_swaps(std::vector<int32_t> s) {
	
	vector<bool> present(s.size(), 1);
	int res = 0;

	tree.assign(s.size()*4, 0);

	for (int i = 0; i<s.size(); i++) {
		update(1, 0, s.size()-1, i, 1);
	}


	vector<queue<int>> nextShoe(s.size()+1);


	for (int i = 0; i<s.size(); i++) {
		nextShoe[s[i]+s.size()/2].push(i);
	}



	for (int i = 0; i<s.size(); i++) {
		if (!present[i]) continue;


		int price = 0;
		// for (int j = i+1; j<s.size(); j++) {
		// 	if (!present[j]) continue;
		// 	price++;
		// 	if (s[j] == -s[i]) {present[j] = 0; break;}
		// }


		price = querry(1, 0, s.size()-1, i+1, nextShoe[-s[i]+s.size()/2].front());

		present[nextShoe[-s[i]+s.size()/2].front()] = 0;
		present[i] = 0;

		update(1, 0, s.size()-1, nextShoe[-s[i]+s.size()/2].front(), 0);

		nextShoe[-s[i]+s.size()/2].pop();
		nextShoe[s[i]+s.size()/2].pop();


		if (s[i] < 0) price--;
		res += price;
		// cout << price << "\n";
	}

	return res;
}

Compilation message (stderr)

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