求助,嘤嘤嘤,IDE下数据是对的,一交就RE

P3806 【模板】点分治 1

Wyxrg @ 2020-07-23 15:11:47

rt,巨佬救救我

#include<bits/stdc++.h>
using namespace std;

const int maxn=10010;

int n,m,rt,size[maxn],vis[maxn],max_part=1<<30,len[maxn],js,ans[maxn],size_part;
int ask[maxn],now[maxn],blo[maxn];
int ver[maxn<<1],head[maxn],nxt[maxn<<1],edge[maxn<<1],tot;

bool cmp(int x,int y)
{
    return len[x]<len[y];
}

void add(int u,int v,int w)
{
    ver[++tot]=v;
    nxt[tot]=head[u];
    head[u]=tot;
    edge[tot]=w;    
} 

void findrt(int x,int fa)
{
    size[x]=1;
    int maxp=0;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=ver[i];
        if(y!=fa&&!vis[y])
        {
            findrt(y,x);
            size[x]+=size[y];
            maxp=max(maxp,size[y]);
        }
    }
    maxp=max(maxp,size_part-size[x]);
    if(maxp<max_part)
    {
        max_part=maxp;
        rt=x;
    }
}

void dis(int x,int fa,int dist,int from)
{
    len[x]=dist;now[++js]=x;blo[x]=from;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=ver[i];
        if(y!=fa&&!vis[y]) dis(y,x,dist+edge[i],from);
    }
}

int calc(int x)
{
    js=1;
    now[1]=x;
    len[x]=0;
    blo[x]=x;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=ver[i];
        if(!vis[y]) dis(y,x,edge[i],y);
    }
    sort(now+1,now+js+1,cmp);
    for(int i=1;i<=m;i++)
    {
        int l=1,r=js;
        if(!ans[i])
        {
            while(l<r)
            {
                int ll=now[l],rr=now[r];
                if(len[ll]+len[rr]<ask[i]) l++;
                else if(len[ll]+len[rr]>ask[i]) r--;
                else 
                {
                    if(blo[ll]==blo[rr])
                    {
                        if(blo[rr]==blo[now[r-1]]) r--;
                        else l++;
                    }
                    else 
                    {
                        ans[i]=1;
                        break;
                    }
                }
            }
        } 
    }
}

void divide(int x)
{
    max_part=1<<30;
    findrt(x,0);
    vis[rt]=1;
    calc(rt);
    for(int i=head[rt];i;i=nxt[i])
    {
        int y=ver[i];
        if(!vis[y])
        {
            size_part=size[y];
            divide(y);
        }
    }
}

int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<n;i++)
    {
        int x,y,z;
        scanf("%d %d %d",&x,&y,&z);
        add(x,y,z),add(y,x,z);
    }
    for(int i=1;i<=m;i++) 
    {
        scanf("%d",&ask[i]);
        if(ask[i]==0) ans[i]=1;
    }
    size_part=n;
    divide(1); 
    for(int i=1;i<=m;i++) 
    {
        if(ans[i]) printf("AYE\n");
        else printf("NAY\n");
    }
    return 0;
}

by Wyxrg @ 2020-07-23 15:15:11

全部 RE QwQ


by CherryPockyOvO @ 2020-07-23 15:15:50

巨佬


by Wyxrg @ 2020-07-23 15:16:58

已解决,是 zz 错误,此贴终结


by 彭天宇 @ 2020-07-23 15:19:17

高宇同志,建议你下次提交程序时将自动选择语言关闭,选择C++。

版本太高会有许多恶心的问题


by 彭天宇 @ 2020-07-23 15:22:03

还有,打开C++编译器,在工具——编译选项——勾选编译时加入以下命令

输入“-Wall”

可以避免很多恶心错误


by 彭天宇 @ 2020-07-23 15:22:43

谢谢,已解决


by 彭天宇 @ 2020-07-23 15:22:51

再见


by 今天可爱了吗 @ 2020-07-23 15:44:18

惊现嘤嘤怪


by xiechengzhan @ 2020-07-23 21:29:10

你好嘤嘤怪


|