結果
問題 | No.270 next_permutation (1) |
ユーザー |
|
提出日時 | 2015-10-01 00:30:18 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 71 ms / 2,000 ms |
コード長 | 2,379 bytes |
コンパイル時間 | 939 ms |
コンパイル使用メモリ | 91,244 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-12-21 07:31:43 |
合計ジャッジ時間 | 2,173 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 15 |
ソースコード
#include <iostream>#include <iomanip>#include <vector>#include <algorithm>#include <numeric>#include <functional>#include <cmath>#include <queue>#include <stack>#include <set>#include <map>#define repd(i,a,b) for (int i=(a);i<(b);i++)#define rep(i,n) repd(i,0,n)#define pb(x) push_back(x)#define mp(x,y) make_pair((x),(y))typedef long long ll;using namespace std;int inputValue(){int a;cin >> a;return a;};template <typename T>void output(T a, int precision) {if(precision > 0){cout << setprecision(precision) << a << "\n";}else{cout << a << "\n";}}void my_next_permutation(vector<int> &p, vector<pair<int, int>> &swp){swp.clear();if (p.size() == 1) {return;}int s = (int)p.size();int k = s - 2;int l = s - 1;for (; k >= 0; k--) {if (p[k + 1] > p[k]) {break;}if (k == 0) {for (; k < l; k++, s--) {//swap(p[k], p[l]);swp.push_back(mp(k, l));}return;}}for (; l > k; l--) {if (p[l] > p[k]) {break;}}//swap(p[k], p[l]);swp.push_back(mp(k, l));for (; k + 1 < s - 1; k++, s--) {//swap(p[k + 1], p[s - 1]);swp.push_back(mp(k + 1, s - 1));}}int main() {// source codeint N = inputValue();int K = inputValue();vector<int> P(N);vector<int> B(N);rep(i, N){P[i] = inputValue();}rep(i, N){B[i] = inputValue();}// K == 0if (K == 0) {output(0, 0);return 0;}ll ret = 0;rep(i, N){ret += abs(P[i] - B[i]);}ll dist = ret;vector<pair<int, int>> swp;rep(k, K - 1){my_next_permutation(P, swp);rep(i, swp.size()){dist -= abs(P[swp[i].first] - B[swp[i].first]);dist -= abs(P[swp[i].second] - B[swp[i].second]);swap(P[swp[i].first], P[swp[i].second]);dist += abs(P[swp[i].first] - B[swp[i].first]);dist += abs(P[swp[i].second] - B[swp[i].second]);}ret += dist;}output(ret, 0);return 0;}