結果
問題 | No.1370 置換門松列 |
ユーザー |
|
提出日時 | 2021-01-29 23:05:07 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 60 ms / 2,000 ms |
コード長 | 3,713 bytes |
コンパイル時間 | 1,209 ms |
コンパイル使用メモリ | 109,368 KB |
最終ジャッジ日時 | 2025-01-18 09:45:15 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 25 |
ソースコード
#include <iostream>#include <algorithm>#include <vector>#include <string>#include <utility>#include <set>#include <map>#include <cmath>#include <queue>#include <cstdio>#include <limits>#define rep(i,n) for(int i = 0; i < n; ++i)#define rep1(i,n) for(int i = 1; i <= n; ++i)using namespace std;template<class T>bool chmax(T &a, const T &b) { if(a < b){ a = b; return 1; } return 0; }template<class T>bool chmin(T &a, const T &b) { if(a > b){ a = b; return 1; } return 0; }template<class T> inline int sz(T &a) { return a.size(); }using ll = long long; using ld = long double;using pi = pair<int,int>; using pl = pair<ll,ll>;using vi = vector<int>; using vvi = vector<vi>;using vl = vector<ll>; using vvl = vector<vl>;const int inf = numeric_limits<int>::max();const ll infll = numeric_limits<ll>::max();//****************************************// Graph template//****************************************// status of edgetemplate <typename X>struct Edge{int from;int to;X cost;Edge() = default;Edge(int from, int to, X cost) : from(from), to(to), cost(cost) {}};// status of nodetemplate <typename X>struct Node{int idx;vector<Edge<X>> edge;Node() = default;explicit Node(int idx) : idx(idx) {}};template <typename X>class Graph{private:int n; // number of nodeint m; // number of edgevector<Node<X>> node;void Init_Node() {rep(i,n) node.emplace_back(i);}public:explicit Graph(int n) : n(n) {Init_Node();}// edges have no-weightGraph(int n, int m, vector<int> from, vector<int> to) : n(n), m(m) {Init_Node();rep(i,m) {add_edge(from[i], to[i]);// add_edge(to[i], from[i]);}}// edges have weightGraph(int n, int m, vector<int> from, vector<int> to, vector<X> cost) : n(n), m(m) {Init_Node();rep(i,m) {add_edge(from[i], to[i], cost[i]);add_edge(to[i], from[i], cost[i]);}}void add_edge(int from, int to, X cost = 1) {node[from].edge.emplace_back(from, to, cost);}// トポロジカルソートした頂点の配列を返すvector<int> Tsort() {// 入次数のカウントvector<int> in(n, 0);rep(i,n) {for(auto next: node[i].edge) {int w = next.to;in[w]++;}}queue<int> q; // 頂点を入れるキューrep(i,n) {if(in[i] == 0) q.push(i);}vector<int> res;while( !q.empty() ) {int v = q.front(); q.pop();res.push_back(v);for(auto next: node[v].edge) {int w = next.to;in[w]--;if(in[w] == 0) {q.push(w);}}}return res;}};int main(){int n,m; cin >> n >> m;vi a(n);rep(i,n) {cin >> a[i];a[i]--;}Graph<int> gp(m);rep(i,n-1) {if(i&1) {gp.add_edge(a[i], a[i+1]);}else {gp.add_edge(a[i+1], a[i]);}if(i+2 < n) {if(a[i] == a[i+1] || a[i+1] == a[i+2] || a[i+2] == a[i]) {cout << "No" << "\n";return 0;}}}vi res = gp.Tsort();if(sz(res) == m) {cout << "Yes" << "\n";vi ans(m);int id = 1;for(auto tmp: res) {ans[tmp] = id++;}for(auto tmp: ans) cout << tmp << " ";cout << "\n";return 0;}Graph<int> gp2(m);rep(i,n-1) {if(i&1) {gp2.add_edge(a[i+1], a[i]);}else {gp2.add_edge(a[i], a[i+1]);}}res = gp2.Tsort();if(sz(res) == m) {cout << "Yes" << "\n";vi ans(m);int id = 1;for(auto tmp: res) {ans[tmp] = id++;}for(auto tmp: ans) cout << tmp << " ";cout << "\n";return 0;}cout << "No" << "\n";return 0;}