結果
問題 |
No.3219 Ruler to Maximize
|
ユーザー |
![]() |
提出日時 | 2025-08-01 22:13:53 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 4 ms / 2,000 ms |
コード長 | 2,838 bytes |
コンパイル時間 | 3,228 ms |
コンパイル使用メモリ | 287,300 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-08-01 22:13:58 |
合計ジャッジ時間 | 4,834 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 32 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define ll long long const long long mod=998244353; const long long hmod=46216567629137; class UnionFind{ public: int par[200009]; int siz[200009]; UnionFind(int N){ for(int i=1;i<=N;i++) par[i]=-1; for(int i=1;i<=N;i++) siz[i]=1; } int root(int x){ int start=x; while(true){ if(par[x]==-1) break; x=par[x]; } while(true){ if(par[start]==-1) break; int b=start; start=par[start]; par[b]=x; } return x; } void unite(int u,int v){ int RootU=root(u); int RootV=root(v); if(RootU==RootV) return; if(siz[RootU]<siz[RootV]){ par[RootU]=RootV; siz[RootV]=siz[RootU]+siz[RootV]; } else{ par[RootV]=RootU; siz[RootU]=siz[RootU]+siz[RootV]; } } bool same(int u,int v){ if(root(u)==root(v)) return true; return false; } }; int main(){ cin.tie(0)->sync_with_stdio(0); cout.tie(0); int N; cin>>N; int A[N+1]; for(int i=1;i<=N;i++) cin>>A[i]; UnionFind UF(N); for(int i=1;i<=N;i++){ for(int j=i+1;j<=N;j++){ bool u=0; int wari=1; for(int k=0;k<15;k++){ if((A[i]/wari)%2==1 && (A[j]/wari)%2==1) u=1; wari*=2; } if(u) UF.unite(i,j); } } vector<pair<int,int>>UF_dat; for(int i=1;i<=N;i++){ UF_dat.push_back({UF.root(i),A[i]}); } sort(UF_dat.begin(),UF_dat.end()); vector<pair<int,int>>dat; int cnt=0; int last=UF_dat[0].first; rep(i,UF_dat.size()){ if(UF_dat[i].first==last){ cnt|=UF_dat[i].second; } else{ dat.push_back({cnt,last}); last=UF_dat[i].first; cnt=0; cnt|=UF_dat[i].second; } } dat.push_back({cnt,last}); int p=1; for(int i=1;i<=dat.size();i++) p*=2; ll ans=0; int ans_pos=0; for(int i=0;i<p;i++){ ll cnt1=0,cnt2=0; int wari=1; for(int j=0;j<dat.size();j++){ if((i/wari)%2==0) cnt1|=dat[j].first; else cnt2|=dat[j].first; wari*=2; } if(ans<cnt1*cnt2){ ans=cnt1*cnt2; ans_pos=i; } } cout<<ans<<"\n"; char color[N+1]; int wari=1; for(int i=0;i<dat.size();i++){ if((ans_pos/wari)%2==1) color[dat[i].second]='W'; else color[dat[i].second]='B'; wari*=2; } for(int i=1;i<=N;i++){ color[i]=color[UF.root(i)]; } for(int i=1;i<=N;i++) cout<<color[i]; cout<<"\n"; }