QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#796401 | #8313. Nim Cheater | eggegg185 | ML | 0ms | 0kb | C++14 | 1.1kb | 2024-12-01 18:10:57 | 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