結果
| 問題 |
No.3034 コーエン-マコーレー抽象単体複体
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-02-21 23:49:38 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,805 bytes |
| コンパイル時間 | 5,000 ms |
| コンパイル使用メモリ | 313,584 KB |
| 実行使用メモリ | 13,760 KB |
| 最終ジャッジ日時 | 2025-02-21 23:49:48 |
| 合計ジャッジ時間 | 8,470 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 4 |
| other | AC * 2 WA * 2 TLE * 1 -- * 31 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define all(a) begin(a),end(a)
#define sz(a) (int)(a).size()
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
const ll mod=998244353;
struct dsu{
vector<int>nec;
dsu(int N):nec(N,-1){}
int leader(int v){while(nec[v]>=0)v=nec[v];return v;}
int size(int v){return -nec[leader(v)];}
int merge(int u,int v){
u=leader(u);
v=leader(v);
if(u==v)return u;
if(nec[u]<nec[v])swap(u,v);
nec[v]+=nec[u];
nec[u]=v;
return v;
}
};
bool LK(vi A,vi B,vi C){
set<int>V;
for(auto a:A)V.insert(a);
for(auto b:B)V.insert(b);
for(auto c:C)V.insert(c);
vector<vector<int>>E(1000);
vector<vector<pii>>F(1000);
int M=sz(A);
rep(i,0,M){
E[A[i]].emplace_back(B[i]);
E[A[i]].emplace_back(C[i]);
E[B[i]].emplace_back(C[i]);
E[B[i]].emplace_back(A[i]);
E[C[i]].emplace_back(A[i]);
E[C[i]].emplace_back(B[i]);
F[A[i]].emplace_back(pii(B[i],C[i]));
F[B[i]].emplace_back(pii(A[i],C[i]));
F[C[i]].emplace_back(pii(A[i],B[i]));
}
vi rev(1000);
for(auto v:V){
vi U;
for(auto u:E[v])U.emplace_back(u);
sort(all(U));
U.erase(unique(all(U)),U.end());
rep(i,0,sz(U))rev[U[i]]=i;
dsu DSU(sz(U));
for(auto[a,b]:F[v])DSU.merge(rev[a],rev[b]);
if(DSU.size(0)!=sz(U))return false;
}
return true;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin.exceptions(cin.failbit);
int N,M;cin>>N>>M;
vector<int>_A(M),_B(M),_C(M);
rep(i,0,M)cin>>_A[i]>>_B[i]>>_C[i];
vector<pii>_E;
rep(i,0,M){
rep(_,0,3){
_E.emplace_back(pii(min(_A[i],_B[i]),max(_A[i],_B[i])));
swap(_A[i],_B[i]);swap(_B[i],_C[i]);
}
}
sort(all(_E));
_E.erase(unique(all(_E)),_E.end());
dsu D(N);
set<int>V;
set<pii>E;
vector<int>A,B,C;
vector<pair<bitset<3000>,int>>base1,base2;
rep(_,0,M){
int a=_A[_],b=_B[_],c=_C[_];
A.emplace_back(a);
B.emplace_back(b);
C.emplace_back(c);
D.merge(a,b);
D.merge(a,c);
V.insert(a);
V.insert(b);
V.insert(c);
rep(_,0,3){
if(!E.count(pii(min(a,b),max(a,b)))){
E.insert(pii(min(a,b),max(a,b)));
bitset<3000>Q;
Q[a]=Q[b]=1;
for(auto[b,c]:base1)if(Q[c])Q=Q^b;
if(Q.any()){
int a=0;
while(!Q[a])a++;
base1.emplace_back(make_pair(Q,a));
}
}
swap(a,b);
swap(b,c);
}
{
bitset<3000>Q;
Q[lower_bound(all(_E),pii(a,b))-_E.begin()]=1;
Q[lower_bound(all(_E),pii(b,c))-_E.begin()]=1;
Q[lower_bound(all(_E),pii(a,c))-_E.begin()]=1;
for(auto[b,c]:base2)if(Q[c])Q=Q^b;
if(Q.any()){
int a=0;
while(!Q[a])a++;
base2.emplace_back(make_pair(Q,a));
}
swap(a,b);
swap(b,c);
}
if(D.size(a)!=sz(V)){cout<<"CO"<<endl;continue;}
else if(sz(base1)==sz(base2))cout<<"H1"<<endl;
else if(!LK(A,B,C))cout<<"LK"<<endl;
else cout<<"CM"<<endl;
}
}