此题数据急需加强

P3806 【模板】点分治 1

传奇666666 @ 2019-11-27 13:24:17

RT

//这是90分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100005;
inline int read()
{
    int res=0,f=1;char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
        res=res*10+c-48,c=getchar();
    return res*f;
}
int n,m,qur[1005],siz[N],maxx[N],rt,dis[N];
int head[N],to[N<<1],nxt[N<<1],val[N<<1],cnt;
bool vis[1005],sgl[N];
inline void add(int x,int y,int v)
{
    ++cnt;
    nxt[cnt]=head[x];
    head[x]=cnt;
    val[cnt]=v;
    to[cnt]=y;
    return;
}
void find_root(int x,int fa,int tot)
{
    siz[x]=1;maxx[x]=0;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[x];
        if(y!=fa&&!sgl[y])
        {
            find_root(y,x,tot);
            siz[x]+=siz[y];
            maxx[x]=max(maxx[x],siz[y]);
        }
    }
    maxx[x]=max(maxx[x],tot-siz[x]);
    if(maxx[x]<maxx[rt]) rt=x;
    return;
}
int tp,a[N],ff[N];
inline bool cmp(int x,int y){return dis[x]<dis[y];}
void dfs(int x,int fa,int len,int gen)
{
    dis[x]=len;ff[x]=gen;a[++tp]=x;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(!sgl[y]&&y!=fa)
        {
            dfs(y,x,len+val[i],gen);
        }
    }
    return;
}
void calc(int x)
{
    tp=0;a[++tp]=x;dis[x]=0;ff[x]=x;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(!sgl[y])
        {
            dfs(y,x,val[i],y);
        }
    }
    sort(a+1,a+tp+1,cmp);
    for(int i=1;i<=m;i++)
    {
        if(!vis[i])
        {
            int l=1,r=tp;
            while(l<tp&&dis[a[l]]+dis[a[r]]<qur[i]) l++;
            while(l<r)
            {
                if(dis[a[l]]+dis[a[r]]>qur[i]) r--;
                else if(dis[a[l]]+dis[a[r]]<qur[i]) l++;
                else if(ff[a[l]]==ff[a[r]])
                {
                    if(dis[a[r]]==dis[a[r-1]]) r--;
                    else l++;
                }
                else
                {
                    vis[i]=1;
                    break;
                }
            }
        }
    }
    return;
}
void solve(int x)
{
    if(x==0) return;
    sgl[x]=1;
    calc(x);
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(!sgl[y])
        {
            rt=0;
            find_root(y,x,siz[y]);
            solve(rt);
        }
    }
    return;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n-1;i++)
    {
        int x=read(),y=read(),v=read();
        add(x,y,v),add(y,x,v);
    }
    for(int i=1;i<=m;i++) qur[i]=read();
    maxx[0]=N;
    find_root(1,0,n);
    solve(rt);
    for(int i=1;i<=m;i++)
    {
        if(vis[i]) puts("AYE");
        else puts("NAY");
    }
    return 0;
}

100分只需将

void find_root(int x,int fa,int tot)
{
    siz[x]=1;maxx[x]=0;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[x];
        if(y!=fa&&!sgl[y])
        {
            find_root(y,x,tot);
            siz[x]+=siz[y];
            maxx[x]=max(maxx[x],siz[y]);
        }
    }
    maxx[x]=max(maxx[x],tot-siz[x]);
    if(maxx[x]<maxx[rt]) rt=x;
    return;
}

改成

void find_root(int x,int fa,int tot)
{
    siz[x]=1;maxx[x]=0;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(y!=fa&&!sgl[y])
        {
            find_root(y,x,tot);
            siz[x]+=siz[y];
            maxx[x]=max(maxx[x],siz[y]);
        }
    }
    maxx[x]=max(maxx[x],tot-siz[x]);
    if(maxx[x]<maxx[rt]) rt=x;
    return;
}

令人难以置信上面的错误代码竟然有分??


by BFLSTiger @ 2019-11-27 14:12:10

这是平常练习,目的是AC,又不是比赛,怕给你水太多部分分,只要让错误代码别满分就好了。当然你要是光想着写这题90分就当我没说。


by BFLSTiger @ 2019-11-27 14:13:17

@smarthehe 把

int y=to[x];

改成了

int y=to[i];

by smarthehe @ 2019-11-27 14:15:11

@BFLSTiger

woc 这也能有分


by 传奇666666 @ 2019-11-27 15:25:39

当然不是只想写部分分,但这样真的会让人感觉不是这种错误QAQ


by Provicy @ 2019-12-21 17:47:34

@BFLSTiger 他的意思是代码里不该错的错了都有这么高分,,


by loi_hjh @ 2020-01-19 19:56:12

模板题的数据不强是一种极不负责任的行为。。


|