QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#796401#8313. Nim Cheatereggegg185ML 0ms0kbC++141.1kb2024-12-01 18:10:572024-12-01 18:10:57

Judging History

你现在查看的是最新测评结果

  • [2024-12-01 18:10:57]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2024-12-01 18:10:57]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
vector<int> vec[40010]; int a[40010],b[40010],req[40010],ans[40010],siz[40010],son[40010],sum,fa[40005];
void D(int now) {
	siz[now] = 1; for(auto v:vec[now]) {
		D(v); siz[now] += siz[v];
		if(!son[now] || siz[son[now]]<siz[v]) son[now] = v;
	}
}
long long dp[20][17005],tmp[17005]; //sigh
void dfs(int now,int dep) {
	sum ^= a[now]; ans[now] = dp[dep][sum];
	for(auto v:vec[now]) {
		if(v == son[now]) continue;
		for(int i = 0; i < 16384; i++) dp[dep+1][i] = min(dp[dep][i],dp[dep][i^a[v]]+b[v]);
		dfs(v,dep+1);
	} if(son[now]) {
		for(int i = 0; i < 16384; i++) tmp[i] = dp[dep][i];
		for(int i = 0; i < 16384; i++) dp[dep][i] = min(tmp[i],tmp[i^a[son[now]]]+b[son[now]]);
		dfs(son[now],dep);
	} sum ^= a[now];
}
char s[10];
signed main() {
	int n,cnt = 0,cur = 0; scanf("%d",&n); for(int i = 1; i <= n; i++) {
		scanf("%s",s+1);
		if(s[1] == 'A') {cnt++; scanf("%d%d",&a[cnt],&b[cnt]); vec[fa[cnt] = cur].push_back(cnt); cur = cnt;}
		else cur = fa[cur]; req[i] = cur;
	} memset(dp,0x3f,sizeof(dp)); dp[0][0] = 0; dfs(0,0); for(int i = 1; i <= n; i++) printf("%d\n",ans[req[i]]);
	return 0;
}

详细

Test #1:

score: 0
Memory Limit Exceeded

input:

7
ADD 3 10
ADD 2 4
ADD 1 5
ADD 2 1
DEL
DEL
ADD 3 5

output:

10
14
0
1
0
14
4

result: