Submission #474205

# Submission time Handle Problem Language Result Execution time Memory
474205 2021-09-17T11:20:14 Z jwvg0425 Sorting (IOI15_sorting) C++17
0 / 100
7 ms 460 KB
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <iostream>
#include <string>
#include <bitset>
#include <map>
#include <set>
#include <tuple>
#include <string.h>
#include <math.h>
#include <random>
#include <functional>
#include <assert.h>
#include <math.h>
#include "sorting.h"
#define all(x) (x).begin(), (x).end()
#define xx first
#define yy second

using namespace std;

template<typename T, typename Pr = less<T>>
using pq = priority_queue<T, vector<T>, Pr>;
using i64 = long long int;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;

bool sorted(vector<int> s)
{
	for (int i = 0; i < s.size(); i++)
		if (s[i] != i)
			return false;

	return true;
}

vector<ii> solve(vector<int> s, vector<ii> r, int k)
{
	int n = s.size();
	r.resize(k);
	int m = r.size();
	vector<ii> res;

	vector<int> rev(n), idx(n), pos(n);
	for (int j = 0; j < n; j++)
		pos[s[j]] = j;

	for (int j = 0; j < n; j++)
		rev[j] = j;

	for (int j = 0; j < m; j++)
		swap(rev[r[j].xx], rev[r[j].yy]);

	for (int j = 0; j < n; j++)
		idx[rev[j]] = j;

	for (int i = 0; i < m; i++)
	{
		swap(s[r[i].xx], s[r[i].yy]);
		swap(pos[s[r[i].xx]], pos[s[r[i].yy]]);
		int a = idx[r[i].xx], b = idx[r[i].yy];
		swap(rev[a], rev[b]);
		swap(idx[rev[a]], idx[rev[b]]);

		// s[x] -> idx[x]
		bool f = false;
		for (int x = 0; x < n && !f; x++)
		{
			if (s[x] == idx[x])
				continue;

			int y = pos[idx[x]];
			res.emplace_back(x, y);
			swap(s[x], s[y]);
			swap(pos[s[x]], pos[s[y]]);
			f = true;
		}

		if (!f)
			res.emplace_back(0, 0);
	}

	if (!sorted)
		res.clear();

	return res;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[])
{
	vector<int> s(N);
	vector<ii> r(M);

	for (int i = 0; i < N; i++)
		s[i] = S[i];

	for (int i = 0; i < M; i++)
	{
		r[i].xx = X[i];
		r[i].yy = Y[i];
	}

	int lo = 0, hi = M;
	vector<ii> res;

	while (lo <= hi)
	{
		int mid = (lo + hi) / 2;
		auto now = solve(s, r, mid);

		if (now.empty())
		{
			lo = mid + 1;
		}
		else
		{
			res = now;
			hi = mid - 1;
		}
	}

	for (int i = 0; i < res.size(); i++)
	{
		P[i] = res[i].xx;
		Q[i] = res[i].yy;
	}

	return res.size();
}

Compilation message

sorting.cpp: In function 'bool sorted(std::vector<int>)':
sorting.cpp:32:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for (int i = 0; i < s.size(); i++)
      |                  ~~^~~~~~~~~~
sorting.cpp: In function 'std::vector<std::pair<int, int> > solve(std::vector<int>, std::vector<std::pair<int, int> >, int)':
sorting.cpp:41:16: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   41 |  int n = s.size();
      |          ~~~~~~^~
sorting.cpp:43:16: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   43 |  int m = r.size();
      |          ~~~~~~^~
sorting.cpp:85:7: warning: the address of 'bool sorted(std::vector<int>)' will never be NULL [-Waddress]
   85 |  if (!sorted)
      |       ^~~~~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:124:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |  for (int i = 0; i < res.size(); i++)
      |                  ~~^~~~~~~~~~~~
sorting.cpp:130:17: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  130 |  return res.size();
      |         ~~~~~~~~^~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 0 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 0 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Incorrect 1 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 0 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 460 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 460 KB Output isn't correct
2 Halted 0 ms 0 KB -