2 solutions
-
1
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; bool b[N]; vector<int> v[N]; int c[N]; void dfs(int u) { b[u]=1-b[u]; for(auto j:v[u]) { dfs(j); } } int main() { int n; cin>>n; if(n<=1000) { for(int i=1;i<=n-1;i++) { int a; cin>>a; v[a].push_back((i+1)); } for(int i=1;i<=n;i++) { char c; cin>>c; if(c=='1') { b[i]=1;//黑 } else { b[i]=0;//白 } } int q; cin>>q; while(q--) { int t; cin>>t; dfs(t); } for(int i=1;i<=n;i++) { cout<<b[i]; } } else { for(int i=2;i<=n;i++) { int x; cin>>x; } for(int i=1;i<=n;i++) { char c; cin>>c; if(c=='1') { b[i]=1;//黑 } else { b[i]=0;//白 } } int q; cin>>q; for(int i=1;i<=q;i++) { int x; cin>>x; c[x]++; } for(int i=1;i<=n;i++) { c[i]=c[i-1]+c[i]; if(c[i]%2==1) { b[i]=1-b[i]; } else { ; } } for(int i=1;i<=n;i++) { cout<<b[i]; } } return 0; } -
1
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; vector<int> g[N]; bool w[N]; int s[N]; void dfs(int u,int now) //遍历以u为根的子树 { now+=s[u]; //累加操作次数 if(now&1) w[u]=!w[u]; //操作了奇数次 for(auto x:g[u]) //遍历所有的孩子节点 { dfs(x,now); } } int main() { int n; cin>>n; for(int i=1;i<n;i++) //构建树 { int x; cin>>x; g[x].push_back(i+1); } for(int i=1;i<=n;i++) //获取节点颜色 { char ch; cin>>ch; w[i]=ch-'0'; } int q; cin>>q; while(q--) //处理每个操作 { int x; cin>>x; s[x]++; } dfs(1,0);//开始遍历 for(int i=1;i<=n;i++) { cout<<w[i]; } return 0; }
- 1
Information
- ID
- 2188
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 5
- Tags
- # Submissions
- 22
- Accepted
- 3
- Uploaded By