求助 #32 TLE
查看原帖
求助 #32 TLE
554145
Night_sea_64楼主2024/7/22 18:52

发生了甚么事?只有 #32 T 了

#include<iostream>
#include<vector>
#include<cstdio>
#define lowbit(x) x&-x
using namespace std;
int n,q,a[200010],b[100010];
vector<int>v[100010];
int dep[100010],fa[100010][20];
int num[100010],cur;
int e[200010],ecur,in[100010],out[100010];
void dfs(int x,int last)
{
    e[++ecur]=x,in[x]=ecur;
    fa[x][0]=last;
    dep[x]=dep[last]+1;
    for(int i=1;i<20;i++)
        fa[x][i]=fa[fa[x][i-1]][i-1];
    for(auto y:v[x])
        if(y!=last)dfs(y,x);
    e[++ecur]=x,out[x]=ecur;
}
int LCA(int x,int y)
{
    if(dep[x]<dep[y])swap(x,y);
    for(int i=19;i>=0;i--)
        if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
    if(x==y)return x;
    for(int i=19;i>=0;i--)
        if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
void add(int x,int k){
    while(x<=2*n)a[x]^=k,x+=lowbit(x);
}
int query(int x)
{
    int ans=0;
    while(x)ans^=a[x],x-=lowbit(x);
    return ans;
}
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)scanf("%d",&b[i]);
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1,0);
    for(int i=1;i<=n;i++)
    {
        add(in[i],b[i]);
        if(fa[i][0])add(in[fa[i][0]],b[i]);
    }
    while(q--)
    {
        int op;
        scanf("%d",&op);
        if(op==1)
        {
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            int lca=LCA(x,y);
            add(in[x],k);
            add(in[y],k);
            add(in[lca],k);
            if(fa[lca][0])add(in[fa[lca][0]],k);
        }
        else
        {
            int x,y;
            scanf("%d%d",&x,&y);
            int lca=LCA(x,y);
            int dis=dep[x]+dep[y]-2*dep[lca];
            if(dis<=50)
            {
                cur=0;
                int now=x;
                while(now!=lca)
                {
                    num[++cur]=query(in[now]-1)^query(out[now]);
                    now=fa[now][0];
                }
                now=y;
                while(now!=lca)
                {
                    num[++cur]=query(in[now]-1)^query(out[now]);
                    now=fa[now][0];
                }
                num[++cur]=query(in[lca]-1)^query(out[lca]);
                int flag=0;
                for(int i=1;i<=cur;i++)
                    for(int j=i+1;j<=cur;j++)
                        for(int k=j+1;k<=cur;k++)
                            if((long long)num[i]+num[j]>num[k]&&(long long)num[i]+num[k]>num[j]&&(long long)num[j]+num[k]>num[i])
                            {
                                flag=1;
                                break;
                            }
                printf("%d",flag);
            }
            else printf("1");
        }
    }
    return 0;
}
2024/7/22 18:52
加载中...