結果
| 問題 | No.382 シャイな人たち (2) |
| コンテスト | |
| ユーザー |
xenon_motsu
|
| 提出日時 | 2020-11-02 18:30:08 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 4,593 ms / 8,000 ms |
| コード長 | 2,682 bytes |
| コンパイル時間 | 2,259 ms |
| コンパイル使用メモリ | 203,740 KB |
| 最終ジャッジ日時 | 2025-01-15 19:07:56 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
#include<bits/stdc++.h>
template<class T,class U> inline bool chmin(T&x,U y){if(x>y){x=y;return true;}return false;}
template<class T,class U> inline bool chmax(T&x,U y){if(x<y){x=y;return true;}return false;}
void rec_MIS(int n, std::vector<std::vector<int>>&e, std::vector<bool>&vis, std::vector<int>&d, std::vector<int>&tmp, std::vector<int>&ans){
int D{}, idx{-1};
for(int i{};i<n;++i){
if(vis[i]) continue;
if(d[i] == 0){
vis[i]=true;
tmp.push_back(i);
rec_MIS(n, e, vis, d, tmp, ans);
tmp.pop_back();
vis[i]=false;
return;
}
if(d[i] == 1){
vis[i]=true;
for(auto&j:e[i]) if(!vis[j]){
vis[j]=true;
for(auto&k:e[j]) --d[k];
tmp.push_back(i);
rec_MIS(n, e, vis, d, tmp, ans);
tmp.pop_back();
for(auto&k:e[j]) ++d[k];
vis[j]=false;
break;
}
vis[i]=false;
return;
}
if(D < d[i]){
D = d[i];
idx = i;
}
}
if(idx==-1){
if(ans.size() < tmp.size()) ans = tmp;
return;
}
vis[idx] = true;
std::vector<int> idxs;
idxs.reserve(D);
for(auto&j:e[idx]) if(!vis[j]){
idxs.push_back(j);
vis[j]=true;
for(auto&k:e[j]) --d[k];
}
tmp.push_back(idx);
rec_MIS(n, e, vis, d, tmp, ans);
tmp.pop_back();
for(auto&j:idxs){
vis[j]=false;
for(auto&k:e[j]) ++d[k];
if(D>2) --d[j];
}
if(D>2){
rec_MIS(n, e, vis, d, tmp, ans);
for(auto&j:idxs) ++d[j];
}
vis[idx] = false;
}
std::vector<int> MIS(std::vector<std::vector<int>>&e){
int n = e.size();
std::vector<bool> vis(n);
std::vector<int> d;
d.reserve(n);
for(auto&v:e) d.push_back(v.size());
std::vector<int> tmp,ans;
rec_MIS(n, e, vis, d, tmp, ans);
return ans;
}
int main(){
int64_t s;
constexpr int64_t base = 12345, mod = 1000003;
std::cin>>s;
(s*=base) %= mod;
int n = s%120 + 2;
(s*=base) %= mod;
int p = s;
std::vector<std::vector<int>> e(n);
for(int i{};i<(n);++i){
for(int j{i+1};j<n;++j){
(s*=base) %= mod;
if(s>=p){
e[i].push_back(j);
e[j].push_back(i);
}
}
}
auto v=MIS(e);
int N = v.size();
if(n==N){
std::cout<<-1<<'\n';
return 0;
}
std::cout<<N+1<<'\n';
for(int i{};i<(N-1);++i){
std::cout<<v[i]+1<<" ";
}
std::cout<<v.back()+1<<'\n';
}
xenon_motsu