제출 #257841

#제출 시각아이디문제언어결과실행 시간메모리
257841shrek12357정렬하기 (IOI15_sorting)C++14
20 / 100
3 ms512 KiB
#include <iostream> #include <vector> #include <algorithm> #include <string> #include <map> #include <set> #include <climits> #include <cmath> #include <fstream> #include <queue> using namespace std; vector<pair<int, int>> toChange; vector<int> xAns, yAns; bool check(int mid, int nums[], int n, int x[], int y[]) { for (int i = 0; i < mid; i++) { int a = nums[x[i]]; nums[x[i]] = nums[y[i]]; nums[y[i]] = a; } int adjList[n + 5]; // can optimize later for (int i = 0; i < n; i++) { adjList[i] = nums[i]; } int counter = 0; bool vis[n + 5]; for (int i = 0; i < n; i++) { vis[i] = false; } for (int i = 0; i < n; i++) { if (vis[i]) { continue; } //DFS because I'm too lazy to make a function vector<int> arr; vis[i] = true; int cur = adjList[i]; while (cur != i) { arr.push_back(cur); vis[cur] = true; cur = adjList[cur]; } arr.push_back(cur); //process the stuff in backwards order so change is correct for (int j = arr.size() - 1; j > 0; j--) { toChange.push_back(make_pair(arr[0], arr[j])); } counter++; } return (n - counter <= mid); } void getAns(int mid, int nums[], int n, int x[], int y[]) { map<int, int> pos; for (int i = 0; i < n; i++) { pos[nums[i]] = i; } for (int i = 0; i < toChange.size(); i++) { int a = x[i], b = y[i]; swap(nums[a], nums[b]); pos[nums[a]] = a; pos[nums[b]] = b; int c = toChange[i].first, d = toChange[i].second; nums[pos[c]] = d; nums[pos[d]] = c; xAns.push_back(pos[c]); yAns.push_back(pos[d]); int tmp = pos[d]; pos[d] = pos[c]; pos[c] = tmp; } for (int i = 0; i < mid - toChange.size(); i++) { xAns.push_back(0); yAns.push_back(0); } } int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { int lo = 0; int hi = M; while (lo < hi) { int mid = (lo + hi) / 2; if (check(mid,S,N,X,Y)) { hi = mid; } else { lo = mid + 1; } toChange.clear(); } check(lo, S, N, X, Y); getAns(lo, S, N, X, Y); for (int i = 0; i < xAns.size(); i++) { P[i] = xAns[i]; Q[i] = yAns[i]; } return lo; }

컴파일 시 표준 에러 (stderr) 메시지

sorting.cpp: In function 'bool check(int, int*, int, int*, int*)':
sorting.cpp:47:27: warning: conversion to 'int' from 'std::vector<int>::size_type {aka long unsigned int}' may alter its value [-Wconversion]
   for (int j = arr.size() - 1; j > 0; j--) {
                ~~~~~~~~~~~^~~
sorting.cpp: In function 'void getAns(int, int*, int, int*, int*)':
sorting.cpp:61:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < toChange.size(); i++) {
                  ~~^~~~~~~~~~~~~~~~~
sorting.cpp:76:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < mid - toChange.size(); i++) {
                  ~~^~~~~~~~~~~~~~~~~~~~~~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:97:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < xAns.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...