直接遍历 40 pts,subtask1 和 subtask3 都没过,TLE
求调,顺便讲下优化思路
#include<bits/stdc++.h>
using namespace std;
struct node {
int color;
int leftson, rightson;
} tree[100005];
int n, m;
string s;
void dfs(int x) {
if (tree[x].color == 1) {
tree[x].color = 0;
} else {
tree[x].color = 1;
}
if (tree[x].leftson != 0) {
dfs(tree[x].leftson);
}
if (tree[x].rightson != 0) {
dfs(tree[x].rightson);
}
return ;
}
bool fl = 1;
int vis[100005];
int main() {
scanf("%d", &n);
for (int i = 2; i <= n; i++) {
int k;
scanf("%d", &k);
if (tree[k].leftson == 0) {
tree[k].leftson = i;
} else {
tree[k].rightson = i;
}
if (k != i + 1) {
fl = 0;
}
}
cin >> s;
for (int i = 1; i <= n; i++) {
tree[i].color = s[i - 1] - '0';
}
scanf("%d", &m);
if (fl) { // 特殊性质
while (m--) {
int v;
scanf("%d", &v);
vis[v] += 1;
}
for (int i = 1; i <= n; i++) {
vis[i] += vis[i - 1];
cout << (tree[i].color + vis[i]) % 2;
}
return 0;
}
while (m--) {
int v;
scanf("%d", &v);
dfs(v);
}
for (int i = 1; i <= n; i++) {
cout << tree[i].color;
}
return 0;
}
玄关