为什么我连暴力都写不对?
  • 板块题目总版
  • 楼主Night_sea_64
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/7/21 18:03
  • 上次更新2024/7/21 19:31:45
查看原帖
为什么我连暴力都写不对?
554145
Night_sea_64楼主2024/7/21 18:03

刚才 T3 的暴力:

#include<iostream>
#include<vector>
using namespace std;
int n,q,a[100010];
vector<int>v[100010];
int dep[100010],fa[100010][20];
int num[100010],cur;
void dfs(int x,int last)
{
    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);
}
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];
}
int main()
{
    cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    int root=0;
    for(int i=1;i<=n;i++)
        if(v[i].size()==n-1)root=i;
    if(root)
    {
        while(q--)
        {
            int op;
            cin>>op;
            if(op==1)
            {
                int x,y,k;
                cin>>x>>y>>k;
                if(x==y)a[x]^=k;
                else if(x==root||y==root)a[x]^=k,a[y]^=k;
                else a[x]^=k,a[y]^=k,a[root]^=k;
            }
            else
            {
                int x,y;
                cin>>x>>y;
                if(x==y)cout<<0;
                else if(x==root||y==root)cout<<0;
                else
                {
                    if(a[x]+a[y]>a[root]&&a[x]+a[root]>a[y]&&a[y]+a[root]>a[x])
                        cout<<1;
                    else cout<<0;
                }
            }
        }
    }
    else
    {
        dfs(1,0);
        while(q--)
        {
            int op;
            cin>>op;
            if(op==1)
            {
                int x,y,k;
                cin>>x>>y>>k;
                if(x==y)
                {
                    a[x]^=k;
                    continue;
                }
                int now=x,lca=LCA(x,y);
                while(now!=lca)a[now]^=k,now=fa[now][0];
                now=y;
                while(now!=lca)a[now]^=k,now=fa[now][0];
                a[lca]^=k;
            }
            else
            {
                int x,y;
                cin>>x>>y;
                int lca=LCA(x,y);
                int dis=dep[x]+dep[y]-2*dep[lca];
                if(dis<=10)
                {
                    cur=0;
                    int now=x;
                    while(now!=lca)
                        num[++cur]=a[now],now=fa[now][0];
                    now=y;
                    while(now!=lca)
                        num[++cur]=a[now],now=fa[now][0];
                    num[++cur]=a[lca];
                    bool 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(num[i]+num[j]>num[k]&&num[i]+num[k]>num[j]&&num[j]+num[k]>num[i])
                                {
                                    flag=1;
                                    break;
                                }
                    cout<<flag;
                }
                else cout<<1;
            }
        }
    }
    return 0;
}

0 分。哪位大佬能看看 if(root) 里面菊花的情况怎么也没对,不用看后面

2024/7/21 18:03
加载中...