結果
問題 | No.1153 ねこちゃんゲーム |
ユーザー | chocorusk |
提出日時 | 2020-08-09 01:30:57 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 623 ms / 2,500 ms |
コード長 | 2,360 bytes |
コンパイル時間 | 1,709 ms |
コンパイル使用メモリ | 135,688 KB |
最終ジャッジ日時 | 2025-01-12 19:14:41 |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 40 |
ソースコード
#include <cstdio> #include <cstring> #include <iostream> #include <string> #include <cmath> #include <bitset> #include <vector> #include <map> #include <set> #include <queue> #include <deque> #include <algorithm> #include <complex> #include <unordered_map> #include <unordered_set> #include <random> #include <cassert> #include <fstream> #include <utility> #include <functional> #include <time.h> #include <stack> #include <array> #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair<int, int> P; int n, m; int a[200020]; vector<int> g[200020]; int dp[200020]; void dfs(int x, int p){ set<int> st; for(auto y:g[x]){ if(y==p) continue; dfs(y, x); st.insert(dp[y]); } for(int i=0; ; i++){ if(st.find(i)==st.end()){ dp[x]=i; break; } } } int dp2[200020]; int gr[200020]; int par[200020]; void dfs2(int x, int p){ par[x]=p; map<int, int> mp; for(auto y:g[x]){ if(y==p) mp[dp2[x]]++; else mp[dp[y]]++; } int mn; for(int i=0; ; i++){ if(mp.find(i)==mp.end()){ mn=i; break; } } gr[x]=mn; for(auto y:g[x]){ if(y==p) continue; if(dp[y]>mn || mp[dp[y]]>1){ dp2[y]=mn; }else{ dp2[y]=dp[y]; } } for(auto y:g[x]){ if(y==p) continue; dfs2(y, x); } } int b[200020]; int main() { cin>>n>>m; for(int i=0; i<m; i++){ cin>>a[i]; a[i]--; b[a[i]]=i+1; } for(int i=0; i<n-1; i++){ int u, v; cin>>u>>v; u--; v--; g[u].push_back(v); g[v].push_back(u); } dfs(0, -1); dfs2(0, -1); int s=0; for(int i=0; i<m; i++){ s^=gr[a[i]]; } if(s==0){ cout<<-1<<" "<<-1<<endl; }else{ for(int i=0; i<n; i++){ if(!b[i]) continue; for(auto y:g[i]){ if(y==par[i]){ if((s^gr[i])==dp2[i]){ cout<<b[i]<<" "<<y+1<<endl; return 0; } }else{ if((s^gr[i])==dp[y]){ cout<<b[i]<<" "<<y+1<<endl; return 0; } } } } } return 0; }