Submission #785230

#TimeUsernameProblemLanguageResultExecution timeMemory
785230ymmSorting (IOI15_sorting)C++17
100 / 100
275 ms22828 KiB
#include "sorting.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (l); --x)
typedef std::pair<int,int> pii;
typedef long long ll;
using namespace std;

const int maxn = 200010;
int pos[maxn];
int pospos[maxn];
int pos2[maxn];

void swap_by_idx(int a[], int p[], int i, int j)
{
	swap(p[a[i]], p[a[j]]);
	swap(a[i], a[j]);
}
void swap_by_val(int a[], int p[], int i, int j)
{
	swap_by_idx(a, p, p[i], p[j]);
}

bool can(int r, int N, int S[], int M, int X[], int Y[], int P[], int Q[])
{
	Loop (i,0,N)
		pospos[i] = pos[i] = i;
	LoopR (i,0,r)
		swap_by_val(pos, pospos, X[i], Y[i]);
	Loop (i,0,N)
		pos2[S[i]] = i;
	vector<pii> vec;
	vector<int> where_should_go(N);
	Loop (i,0,N)
		where_should_go[pos[i]] = i;
	Loop (i,0,N) {
		while (where_should_go[pos2[i]] != i) {
			vec.push_back({pos2[i], pos2[where_should_go[pos2[i]]]});
			swap(pos2[i], pos2[where_should_go[pos2[i]]]);
		}
	}
	if (vec.size() > r)
		return 0;
	if (P && Q) {
		Loop (i,0,N)
			pos[i] = pospos[i] = i;
		Loop (i,0,vec.size()) {
			swap_by_val(pos, pospos, X[i], Y[i]);
			P[i] = pos[vec[i].first];
			Q[i] = pos[vec[i].second];
		}
		Loop (i,vec.size(),r)
			P[i] = Q[i] = 0;
	}
	return 1;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
	int l = 0, r = M;
	while (l < r) {
		int m = (l+r)/2;
		if (can(m, N, S, M, X, Y, 0, 0))
			r = m;
		else
			l = m+1;
	}
	can(l, N, S, M, X, Y, P, Q);
	return l;
}


Compilation message (stderr)

sorting.cpp: In function 'bool can(int, int, int*, int, int*, int*, int*, int*)':
sorting.cpp:27:24: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   27 |   pospos[i] = pos[i] = i;
      |                        ^
sorting.cpp:31:16: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   31 |   pos2[S[i]] = i;
      |                ^
sorting.cpp:35:29: warning: conversion from 'll' {aka 'long long int'} to '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'} may change value [-Wconversion]
   35 |   where_should_go[pos[i]] = i;
      |                             ^
sorting.cpp:42:17: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   42 |  if (vec.size() > r)
      |      ~~~~~~~~~~~^~~
sorting.cpp:46:25: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
   46 |    pos[i] = pospos[i] = i;
      |                         ^
sorting.cpp:3:40: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | #define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
      |                                        ^
sorting.cpp:47:3: note: in expansion of macro 'Loop'
   47 |   Loop (i,0,vec.size()) {
      |   ^~~~
sorting.cpp:24:37: warning: unused parameter 'M' [-Wunused-parameter]
   24 | bool can(int r, int N, int S[], int M, int X[], int Y[], int P[], int Q[])
      |                                 ~~~~^
#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...