結果
問題 | No.2536 同値性と充足可能性 |
ユーザー |
![]() |
提出日時 | 2023-11-10 21:45:32 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 103 ms / 2,000 ms |
コード長 | 2,157 bytes |
コンパイル時間 | 3,818 ms |
コンパイル使用メモリ | 260,212 KB |
実行使用メモリ | 13,312 KB |
最終ジャッジ日時 | 2024-09-26 01:21:10 |
合計ジャッジ時間 | 5,395 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 |
ソースコード
#include<bits/stdc++.h>using namespace std;using ll = long long;#include<atcoder/dsu>int main(){int n,m;cin>>n>>m;vector<int> u(m),v(m);vector<string> s(m);atcoder::dsu uf(n);vector<int> p(m,0);for(int i = 0;i<m;i++){cin>>u[i]>>s[i]>>v[i];u[i]--;v[i]--;if(s[i]=="<=/=>") {p[i] = 1;continue;}uf.merge(u[i],v[i]);}vector<int> vis(n,0);bool ok = true;vector<vector<int>> g(n);atcoder::dsu u1(2*n);for(int i = 0;i<m;i++){if(p[i]==0) continue;if(uf.same(u[i],v[i])){cout<<"No\n";return 0;}int ni = uf.leader(u[i]);int nj = uf.leader(v[i]);g[ni].push_back(nj);g[nj].push_back(ni);u1.merge(ni,n+nj);u1.merge(nj,n+ni);}vector<int> use(n,0);int all = 0;for(int i = 0;i<n;i++) if(u1.same(i,n+i)){cout<<"No\n";return 0;}ll sum = 0;for(int i = 0;i<n;i++){if(uf.leader(i)!=i) continue;if(vis[i]) continue;int a = 0;int b = 0;vector<int> que;que.push_back(i);vis[i] = 1;for(int j = 0;j<que.size();j++){int ni = que[j];if(vis[ni]==1) a += uf.size(ni);else b += uf.size(ni);for(auto&to:g[ni]){if(vis[to]) continue;que.push_back(to);if(vis[ni]==1) vis[to] = 2;else vis[to] = 1;}}int ok = 0;if(a>=b) ok = 1;else ok = 2;for(int j = 0;j<que.size();j++){int ni = que[j];if(vis[ni]==ok) use[ni] = 1;}sum += max(a,b);}if(2*sum<n){cout<<"No\n";return 0;}vector<int> ans;for(int i = 0;i<n;i++){int ni = uf.leader(i);if(use[ni]) ans.push_back(i);}cout<<"Yes\n";cout<<ans.size()<<endl;for(int i = 0;i<ans.size();i++){if(i) cout<<" ";cout<<ans[i]+1;}cout<<endl;}