結果
| 問題 | No.3508 OR Mapping |
| コンテスト | |
| ユーザー |
shobonvip
|
| 提出日時 | 2026-04-19 08:52:16 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 251 ms / 2,000 ms |
| コード長 | 2,961 bytes |
| 記録 | |
| コンパイル時間 | 3,466 ms |
| コンパイル使用メモリ | 288,104 KB |
| 実行使用メモリ | 155,956 KB |
| 最終ジャッジ日時 | 2026-04-19 08:52:40 |
| 合計ジャッジ時間 | 13,327 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 65 |
ソースコード
/**
author: shobonvip
created: 2026.04.19 08:29:12
**/
#include<bits/stdc++.h>
using namespace std;
//* ATCODER
#include<atcoder/all>
using namespace atcoder;
typedef modint998244353 mint;
//*/
/* BOOST MULTIPRECISION
#include<boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
//*/
typedef long long ll;
#define rep(i, s, n) for (int i = (int)(s); i < (int)(n); i++)
#define rrep(i, s, n) for (int i = (int)(n)-1; i >= (int)(s); i--)
#define all(v) v.begin(), v.end()
template <typename T> bool chmin(T &a, const T &b) {
if (a <= b) return false;
a = b;
return true;
}
template <typename T> bool chmax(T &a, const T &b) {
if (a >= b) return false;
a = b;
return true;
}
template <typename T> T max(vector<T> &a){
assert(!a.empty());
T ret = a[0];
for (int i=0; i<(int)a.size(); i++) chmax(ret, a[i]);
return ret;
}
template <typename T> T min(vector<T> &a){
assert(!a.empty());
T ret = a[0];
for (int i=0; i<(int)a.size(); i++) chmin(ret, a[i]);
return ret;
}
template <typename T> T sum(vector<T> &a){
T ret = 0;
for (int i=0; i<(int)a.size(); i++) ret += a[i];
return ret;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m; cin >> n >> m;
int k; cin >> k;
vector<pair<int,int>> edge;
scc_graph scc(n);
rep(i,0,m) {
int u, v;
cin >> u >> v;
u--; v--;
edge.emplace_back(u, v);
scc.add_edge(u, v);
}
vector<vector<int>> g = scc.scc();
vector<int> taio(n, -1);
vector cango(n, vector<int>(0));
vector inner(n, vector<int>(0));
rep(i,0,(int)g.size()) {
rep(j,0,(int)g[i].size()) {
taio[g[i][j]] = i;
}
}
rep(i,0,m) {
auto [u,v] = edge[i];
if (taio[u] == taio[v]) {
inner[u].emplace_back(v);
continue;
}
cango[taio[u]].emplace_back(taio[v]);
}
vector<int> d(n, -1);
auto dfs = [&](auto self, int i) -> int {
if (d[i] != -1) return d[i];
int v = 1;
for (int j: cango[i]) {
chmax(v, self(self, j) + 1);
}
d[i] = v;
return v;
};
dfs(dfs, taio[0]);
if (d[taio[0]] != (int)g.size()) {
cout << "No\n";
return 0;
}
vector<int> road;
auto dfs2 = [&](auto self, int i) -> void {
road.emplace_back(i);
for (int j: cango[i]) {
if (d[i] - 1 == d[j]) {
self(self, j);
break;
}
}
};
dfs2(dfs2, taio[0]);
if (g[road[0]].size() == 1) {
cout << "No\n";
return 0;
}
rep(i,0,(int)road.size() - 1) {
if (g[road[i]].size() == 1 && g[road[i+1]].size() == 1) {
cout << "No\n";
return 0;
}
}
vector<int> tansaku(n, -1);
int gs = 0;
auto dfs3 = [&](auto self, int i) -> void {
for (int j: inner[i]) {
if (tansaku[j] == -1) {
tansaku[j] = tansaku[i] + 1;
self(self, j);
} else {
gs = gcd(gs, abs(tansaku[i] - tansaku[j] + 1));
}
}
};
rep(i,0,(int)road.size()) {
gs = 0;
tansaku[g[road[i]].front()] = 0;
dfs3(dfs3, g[road[i]].front());
if (gs > 0 && gs % 2 == 0) {
cout << "No\n";
return 0;
}
}
cout << "Yes\n";
return 0;
}
shobonvip