結果
問題 | No.326 あみだますたー |
ユーザー |
|
提出日時 | 2017-10-21 01:38:17 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 11 ms / 2,000 ms |
コード長 | 3,843 bytes |
コンパイル時間 | 1,323 ms |
コンパイル使用メモリ | 103,624 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-11-21 10:55:22 |
合計ジャッジ時間 | 2,277 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 26 |
ソースコード
#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <climits>#include <cmath>#include <string>#include <vector>#include <algorithm>#include <queue>#include <map>#include <functional>#include <set>#include <numeric>#include <stack>#include <utility>#include <time.h>#include <iterator>//#include "util.h"using namespace std;typedef unsigned uint;typedef long long lint;typedef unsigned long long ulint;//呪文template <typename _KTy, typename _Ty> ostream& operator << (ostream& ostr, const pair<_KTy, _Ty>& m) { cout << "{" << m.first << ", " << m.second <<"}"; return ostr; }template <typename _KTy, typename _Ty> ostream& operator << (ostream& ostr, const map<_KTy, _Ty>& m) { if (m.empty()) { cout << "{ }"; return ostr; }cout << "{" << *m.begin(); for (auto itr = ++m.begin(); itr != m.end(); itr++) { cout << ", " << *itr; } cout << "}"; return ostr; }template <typename _Ty> ostream& operator << (ostream& ostr, const vector<_Ty>& v) { if (v.empty()) { cout << "{ }"; return ostr; } cout << "{" << v.front(); for (auto itr = ++v.begin(); itr != v.end(); itr++) { cout << ", " << *itr; } cout << "}"; return ostr; }template <typename _Ty> ostream& operator << (ostream& ostr, const set<_Ty>& s) { if (s.empty()) { cout << "{ }"; return ostr; } cout << "{" << *(s.begin()); for (auto itr = ++s.begin(); itr != s.end(); itr++) { cout << ", " << *itr; } cout << "}"; return ostr; }//template <typename T> void print(T* v, int N) { if (N == 0) cout << "{ }"; cout << "{" << v[0]; for (int i = 1; i < N; i++) cout << ", " << v[i];cout << "}"; }#define PI 3.14159265358979323846#define EPS 1e-8#define FOR(i,a,b) for(int i=(a);i<(b);++i)#define REP(i,n) FOR(i,0,n)#define all(x) (x).begin(), (x).end()typedef pair<int, int> pii;stack<vector<int> > cyclic_permutation(vector<int> v, vector<int> w){stack<vector<int> > res;vector<bool> used(v.size(), false);map<int, int> mp;for (int i = 0; i < v.size(); i++) mp[v[i]] = i;for (int i = 0; i < v.size(); i++) {int j = i;vector<int> cyclic;while (!used[j]) {used[j] = true;cyclic.push_back(j);j = w[mp[j]];}if (cyclic.size() >= 2) res.push(cyclic);}return res;}stack<pii> transposition_product(vector<int> v, vector<int> w){stack<pii> res;stack<vector<int> > cyclic = cyclic_permutation(v, w);while (!cyclic.empty()) {vector<int> t = cyclic.top(); cyclic.pop();for (int j = 1; j < t.size(); j++)res.push(pii(t[0], t[j]));}return res;}stack<pii> fundamental_transposition_product(vector<int> v, vector<int> w){stack<pii> res;stack<pii> transposition = transposition_product(v, w);while (!transposition.empty()) {pii p = transposition.top(); transposition.pop();if (p.first > p.second) swap(p.first, p.second);for (int j = p.first; j < p.second; j++) {if (!res.empty() && res.top().first == j && res.top().second == j + 1) res.pop();else res.push(pii(j, j + 1));}for (int j = p.second - 1; j > p.first; j--) {if (!res.empty() && res.top().first == j - 1 && res.top().second == j) res.pop();else res.push(pii(j - 1, j));}}return res;}int yuki0326(){int N, K;cin >> N >> K;vector<int> v(N + 1, 0);map<int, int> mp;for (int i = 1; i <= N; i++) {mp[i] = i; v[i] = i;}for (int i = 0; i < K; i++) {int X, Y;cin >> X >> Y;swap(v[mp[X]], v[mp[Y]]);swap(mp[X], mp[Y]);}vector<int> w(N + 1, 0);for (int i = 1; i <= N; i++) cin >> w[i];stack<pii> step = fundamental_transposition_product(v, w);cout << step.size() << endl;while (!step.empty()) {pii t = step.top(); step.pop();cout << t.first << " " << t.second << endl;}return 0;}int main(){//clock_t start, end;//start = clock();yuki0326();//end = clock();//printf("%d msec.\n", end - start);return 0;}