結果
問題 | No.1153 ねこちゃんゲーム |
ユーザー |
![]() |
提出日時 | 2020-08-07 22:04:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 674 ms / 2,500 ms |
コード長 | 2,540 bytes |
コンパイル時間 | 2,530 ms |
コンパイル使用メモリ | 207,360 KB |
最終ジャッジ日時 | 2025-01-12 16:57:02 |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 40 |
ソースコード
#include <bits/stdc++.h>using namespace std;using Int = long long;const char newl = '\n';template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}template<typename T> void drop(const T &x){cout<<x<<endl;exit(0);}template<typename T=int>vector<T> read(size_t n){vector<T> ts(n);for(size_t i=0;i<n;i++) cin>>ts[i];return ts;}template<typename F>struct FixPoint : F{FixPoint(F&& f):F(forward<F>(f)){}template<typename... Args>decltype(auto) operator()(Args&&... args) const{return F::operator()(*this,forward<Args>(args)...);}};template<typename F>inline decltype(auto) MFP(F&& f){return FixPoint<F>{forward<F>(f)};}//INSERT ABOVE HEREsigned main(){cin.tie(0);ios::sync_with_stdio(0);int n,m;cin>>n>>m;auto as=read(m);for(int &a:as) a--;vector<vector<int>> G(n);for(int i=1;i<n;i++){int u,v;cin>>u>>v;u--;v--;G[u].emplace_back(v);G[v].emplace_back(u);}using ll = long long;auto P = [&](int a,int b){return ((ll)(a)<<30)|(b+1);};unordered_map<ll, int> dp;dp.reserve(n*2);vector<int> used(n,0);vector<int> skip(n,-1);vector<int> grnd(n,0);vector<vector<int>> cnts(n);auto func=MFP([&](auto dfs,int v,int p)->int{if(dp.count(P(v,p))) return dp[P(v,p)];int &res=dp[P(v,p)];res=0;if(~p and G[v].size()==1) return res=0;auto &cnt=cnts[v];if(!used[v]){cnt.assign(G[v].size()+1,0);used[v]=1;skip[v]=p;for(int u:G[v]){if(u==p) continue;int k=dfs(u,v);if(k<(int)cnt.size()) cnt[k]++;}int &g=grnd[v];while(cnt[g]) g++;return res=g;}if(~p) assert(skip[v]!=p);if(~skip[v]){int k=dfs(skip[v],v);if(k<(int)cnt.size()) cnt[k]++;skip[v]=-1;}int &g=grnd[v];while(cnt[g]) g++;if(~p){int cand=dfs(p,v);if(cand<g and cnt[cand]==1) return res=cand;}return res=g;});vector<int> gs(n);for(int i=0;i<n;i++) gs[i]=func(i,-1);int ans=0;for(int a:as) ans^=gs[a];if(ans==0) drop("-1 -1");vector<int> ukuku09(n);for(int i=0;i<m;i++){int a=as[i];if(ukuku09[a]) continue;ukuku09[a]=1;for(int b:G[a]){if(ans^gs[a]^func(b,a)) continue;cout<<i+1<<' '<<b+1<<endl;return 0;}}abort();return 0;}