QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#402550 | #5445. Vulpecula | cqbzly | WA | 2ms | 8344kb | C++14 | 3.0kb | 2024-04-30 21:41:43 | 2024-04-30 21:41:44 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
#define ull unsigned long long
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N=50005;
int n,fa[N];
vector<int>G[N];
struct node{
ull x;
int d;
};
struct node0{
ll g[64];
node f[64];
void ins(ll x){
for(int i=63;i>=0;i--){
if(x>>i&1){
if(!g[i]){
g[i]=x;
return;
}
x^=g[i];
}
}
}
void ins0(node t){
for(int i=63;i>=0;i--){
if(t.x>>i&1){
if(!f[i].x){
f[i]=t;
return;
}
if(f[i].d>t.d)swap(f[i],t);
t.x^=f[i].x;
}
}
}
void build(){
for(int i=63;i>=0;i--){
for(int j=i-1;j>=0;j--){
if(g[i]>>j&1){
g[i]^=g[j];
}
}
}
for(int i=0;i<=63;i++){
if(!g[i]){
f[i].x|=1ull<<i;
for(int j=i+1;j<=63;j++){
if(g[j]>>i&1){
f[i].x|=1ull<<j;
}
}
}
}
}
ull ask(int d){
ull x=0;
for(int i=63;i>=0;i--){
if(f[i].x&&d>=f[i].d){
if(__builtin_parityll(x&f[i].x)){
x|=1ull<<i;
}
}else x|=1ull<<i;
}
return x;
}
}a[N];
void dfs(int u){
for(auto v:G[u]){
dfs(v);
for(int i=63;i>=0;i--){
if(a[v].f[i].x)a[u].ins0({a[v].f[i].x,a[v].f[i].d+1});
}
}
}
vector<int>vec;
ull res[N];
void dfs0(int u){
vec.clear(),vec.pb(n-1);
for(int i=0;i<=63;i++){
if(a[u].f[i].x){
vec.pb(a[u].f[i].d);
}
}
sort(vec.begin(),vec.end());
int lst=-1;
for(int i=0;i<vec.size();i++){
if(vec[i]==lst)continue;
//cout<<"find:"<<u<<" "<<vec[i]<<"\n";
res[u]+=a[u].ask(vec[i])*(vec[i]-lst);
lst=vec[i];
}
for(auto v:G[u]){
for(int i=0;i<=63;i++){
if(a[u].f[i].x)a[v].ins0({a[u].f[i].x,a[u].f[i].d+1});
}
dfs0(v);
}
}
int main(){
//freopen("data.in","r",stdin);
// freopen("own.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=2;i<=n;i++){
cin>>fa[i],G[fa[i]].pb(i);
}
for(int i=1;i<=n;i++){
int K;cin>>K;
for(int j=1;j<=K;j++){
ull x;cin>>x;
a[i].ins(x);
}
a[i].build();
}
dfs(1);
dfs0(1);
// for(int i=0;i<=63;i++){
// if(a[2].f[i].x){
// cout<<"find:"<<i<<" "<<a[2].f[i].x<<" "<<a[2].f[i].d<<"\n";
// }
// }
// cout<<a[1].ask(0);
for(int i=1;i<=n;i++){
cout<<res[i]<<"\n";
}
}
详细
Test #1:
score: 100
Accepted
time: 2ms
memory: 8344kb
input:
2 1 2 2 3 2 1 1
output:
4 2
result:
ok 2 lines
Test #2:
score: -100
Wrong Answer
time: 1ms
memory: 5872kb
input:
5 1 2 2 3 3 83 75 58 4 125 124 58 16 4 39 125 71 112 3 69 66 5 4 48 73 69 6
output:
137 125 125 73 175
result:
wrong answer 1st lines differ - expected: '171', found: '137'