萌新刚学淀粉汁,求助

P3806 【模板】点分治 1

寒冰大大 @ 2020-01-14 10:27:10

今天写博客的时候发现求重心部分和其他不一样,然后注释掉了只能跑60分,但是我这种方法显然错误,因为它并不会求出后面的重心(然而数据过水A了,还跑得和题解差不多),求大佬帮忙康康

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<algorithm>

using namespace std;

struct edge{
    int next,to,dis;
}e[20020];

int head[20020],size,tmp[10001000],judge[10001000];
int k,n,m;
int sz[20020],rt=1;
int maxp[20020],fw[20020],dis[20020];
int que[200200];
int yns[200200],sum;
int q[200200],vis[200200];

inline void addedge(int next,int to,int dis)
{
    e[++size].to=to;
    e[size].next=head[next];
    e[size].dis=dis;
    head[next]=size;
}

inline void getzx(int t,int fat)
{
    sz[t]=1;
    maxp[t]=1;
    int i,j;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        if(j==fat||fw[j]) continue;
        fw[j]=1;  //就是这个地方,理论上后来被一次求重心在根节点就会被continue
        getzx(j,t);
        sz[t]+=sz[j];
        maxp[t]=max(maxp[t],sz[j]);
    }
    maxp[t]=max(maxp[t],sum-sz[t]);
    if(maxp[t]<maxp[rt]) rt=t;
    return ;
}

inline void getdis(int t,int fat)
{
    tmp[++tmp[0]]=dis[t];
    int i,j,k;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        k=e[i].dis;
        if(j==fat||vis[j]) continue;
        dis[j]=dis[t]+k;
        getdis(j,t);
    }
}

inline void calc(int t)
{
    int p=0;
    int i,j,k,l;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        if(vis[j]) continue;
        tmp[0]=0;
        dis[j]=e[i].dis;
        getdis(j,t);
        for(k=tmp[0];k;k--)
        for(l=1;l<=m;l++) if(que[l]>=tmp[k]) yns[l]|=judge[que[l]-tmp[k]]; 
        for(k=tmp[0];k;k--) q[++p]=tmp[k],judge[tmp[k]]=1;
    }
    for(i=1;i<=p;i++) judge[q[i]]=0;
}

inline void slove(int t)
{
    vis[t]=judge[0]=1;calc(t);
    int i,j;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        if(vis[j]) continue;
        rt=0,sum=sz[j],maxp[rt]=0x3f3f3f3f;
        getzx(j,0); slove(j);
    }
} 

int main()
{
    ios::sync_with_stdio(false);
    register int i,j;
    cin>>n>>m;
    int t1,t2,t3;
    sum=n;
    for(i=1;i<n;i++) cin>>t1>>t2>>t3,addedge(t1,t2,t3),addedge(t2,t1,t3);
    for(i=1;i<=m;i++) cin>>que[i];
    getzx(1,0);
    slove(rt);
    for(i=1;i<=m;i++)
    {
        if(yns[i]) cout<<"AYE"<<endl;
        else cout<<"NAY"<<endl;
    }
    return 0;
}

by 寒冰大大 @ 2020-01-14 10:27:47

打错了:理论上后来每一次


by Rogers_wang @ 2020-01-14 10:28:50

...


by lemir3 @ 2020-01-14 10:39:10

阿了

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<vector>
#include<set>
#include<map>
#include<algorithm>

using namespace std;

struct edge{
    int next,to,dis;
}e[20020];

int head[20020],size,tmp[10001000],judge[10001000];
int k,n,m;
int sz[20020],rt=1;
int maxp[20020],fw[20020],dis[20020];
int que[200200];
int yns[200200],sum;
int q[200200],vis[200200];

inline void addedge(int next,int to,int dis)
{
    e[++size].to=to;
    e[size].next=head[next];
    e[size].dis=dis;
    head[next]=size;
}

inline void getzx(int t,int fat)
{
    sz[t]=1;
    maxp[t]=0;
    int i,j;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        if(j==fat||vis[j]) continue;
  //      fw[j]=1;  //就是这个地方,理论上后来被一次求重心在根节点就会被continue
        getzx(j,t);
        sz[t]+=sz[j];
        maxp[t]=max(maxp[t],sz[j]);
    }
    maxp[t]=max(maxp[t],sum-sz[t]);
    if(maxp[t]<maxp[rt]) rt=t;
    return ;
}

inline void getdis(int t,int fat)
{
    tmp[++tmp[0]]=dis[t];
    int i,j,k;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        k=e[i].dis;
        if(j==fat||vis[j]) continue;
        dis[j]=dis[t]+k;
        getdis(j,t);
    }
}

inline void calc(int t)
{
    int p=0;
    int i,j,k,l;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        if(vis[j]) continue;
        tmp[0]=0;
        dis[j]=e[i].dis;
        getdis(j,t);
        for(k=tmp[0];k;k--)
        for(l=1;l<=m;l++) if(que[l]>=tmp[k]) yns[l]|=judge[que[l]-tmp[k]]; 
        for(k=tmp[0];k;k--) q[++p]=tmp[k],judge[tmp[k]]=1;
    }
    for(i=1;i<=p;i++) judge[q[i]]=0;
}

inline void slove(int t)
{
    vis[t]=judge[0]=1;calc(t);
    int i,j;
    for(i=head[t];i;i=e[i].next)
    {
        j=e[i].to;
        if(vis[j]) continue;
        rt=0,sum=sz[j],maxp[rt]=0x3f3f3f3f;
        getzx(j,0); slove(rt);
    }
} 

int main()
{
    ios::sync_with_stdio(false);
    register int i,j;
    cin>>n>>m;
    int t1,t2,t3;
    maxp[rt]=sum=n;
    for(i=1;i<n;i++) cin>>t1>>t2>>t3,addedge(t1,t2,t3),addedge(t2,t1,t3);
    for(i=1;i<=m;i++) cin>>que[i];
    getzx(1,0);
    slove(rt);
    for(i=1;i<=m;i++)
    {
        if(yns[i]) cout<<"AYE"<<endl;
        else cout<<"NAY"<<endl;
    }
    return 0;
}

by 小元勋 @ 2020-01-14 10:44:38

%%%%%%%%


by installb @ 2020-01-14 10:45:57

4178


by starseven @ 2020-01-14 11:09:52

Orz (wowowow)


by 辰星凌 @ 2020-01-14 11:38:10

Orz淀粉质巨捞


by 寒冰大大 @ 2020-01-14 16:02:45

什么意思啊,还没有我后面打的正解快


|