結果
問題 | No.1153 ねこちゃんゲーム |
ユーザー |
![]() |
提出日時 | 2020-07-11 16:10:41 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 317 ms / 2,500 ms |
コード長 | 4,076 bytes |
コンパイル時間 | 1,574 ms |
コンパイル使用メモリ | 100,820 KB |
実行使用メモリ | 65,408 KB |
最終ジャッジ日時 | 2024-11-08 18:01:42 |
合計ジャッジ時間 | 20,020 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 40 |
ソースコード
#include <cstdio>#include <string>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>#include <set>#include <map>#include <queue>#include <stack>#include <list>#include <iterator>#include <cassert>#include <numeric>#include <functional>#include <time.h>#pragma warning(disable:4996)typedef long long ll;typedef unsigned long long ull;#define MIN(a, b) ((a)>(b)? (b): (a))#define MAX(a, b) ((a)<(b)? (b): (a))#define LINF 9223300000000000000#define LINF2 1223300000000000000#define LINF3 1000000000000#define INF 2140000000const long long MOD = 1000000007;//const long long MOD = 998244353;using namespace std;vector<vector<pair<int, int> > > g; // to, edgeidvector<int> parent;vector<int> val; // val[2*i]:val for downward dir, val[2*i+1]: val for upward dirvector<map<int, int> > z; // z[i]: vals conter for directed edges from vertex ivector<int> ans; // ans[i]: Grundy number for vertex iint dfs(int par, int curr){parent[curr] = par;int i;for (i = 0; i < (int)g[curr].size(); i++) {int next = g[curr][i].first;int edge = g[curr][i].second;if (next == par) continue;int tmp = dfs(curr, next);val[edge * 2] = tmp;z[curr][tmp]++;}for (i = 0; i < INF; i++) {if (z[curr].empty()) {break;}auto it = z[curr].find(i);if (it == z[curr].end()) {break;}}return i;}void dfs2(int par, int curr){int i;for (i = 0; i < (int)g[curr].size(); i++) {int next = g[curr][i].first;int edge = g[curr][i].second;if (next == par) continue;int k;for (k = 0; k < INF; k++) {if (z[curr].empty()) {break;}auto it = z[curr].find(k);if (it == z[curr].end()) {break;}int num=it->second;if (val[edge*2]==k) num--;if (num < 1) {break;}}val[edge * 2 + 1] = k;z[next][k]++;dfs2(curr, next);}for (i = 0; i < INF; i++) {if (z[curr].empty()) {break;}auto it = z[curr].find(i);if (it == z[curr].end()) {break;}}ans[curr] = i;return;}void solve(){int n, m;scanf("%d%d", &n, &m);vector<int> a(m);int i;for (i = 0; i < m; i++) {scanf("%d", &a[i]); a[i]--;}g.resize(n);parent.resize(n);z.resize(n);ans.resize(n);val.resize((n-1) * 2);for (i = 0; i < n - 1; i++) {int p, q;scanf("%d%d", &p, &q); p--; q--;g[p].push_back(make_pair(q, i));g[q].push_back(make_pair(p, i));}int ret = dfs(-1, 0);dfs2(-1, 0);int sum = 0;for (i = 0; i < m; i++) {sum ^= ans[a[i]];}if (sum == 0) {printf("-1 -1\n");}else {int save = -1;int kk = 0;for (kk = 0; kk < 20; kk++) {if (sum & (1 << kk)) {save = kk;}}for (i = 0; i < m; i++) {if (ans[a[i]] & (1 << save))break;}int maxi = i;int target = ans[a[maxi]]^sum;int nextvtx = -1;for (i = 0; i < (int)g[a[maxi]].size(); i++) {int next = g[a[maxi]][i].first;int edge = g[a[maxi]][i].second;int tmpval = (next == parent[a[maxi]] ? val[2 * edge + 1] : val[2 * edge]);if (target == tmpval) {nextvtx = next;break;}}printf("%d %d\n", maxi + 1, nextvtx + 1);}return;}int main(int argc, char* argv[]){#if 1solve();#elseint T;scanf("%d", &T);int t;for(t=0; t<T; t++) {//printf("Case #%d: ", t+1);solve();}#endifreturn 0;}