結果

問題 No.1153 ねこちゃんゲーム
ユーザー tarattata1
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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 2140000000
const long long MOD = 1000000007;
//const long long MOD = 998244353;
using namespace std;
vector<vector<pair<int, int> > > g; // to, edgeid
vector<int> parent;
vector<int> val; // val[2*i]:val for downward dir, val[2*i+1]: val for upward dir
vector<map<int, int> > z; // z[i]: vals conter for directed edges from vertex i
vector<int> ans; // ans[i]: Grundy number for vertex i
int 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 1
solve();
#else
int T;
scanf("%d", &T);
int t;
for(t=0; t<T; t++) {
//printf("Case #%d: ", t+1);
solve();
}
#endif
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0