为什么本机和LuoguIDE可以过样例,交上去就第一个点(样例)都wa???
查看原帖
为什么本机和LuoguIDE可以过样例,交上去就第一个点(样例)都wa???
42082
YZHX楼主2020/5/21 07:33

萌新初学OI,才刚开始用Luogu,不太熟悉

#include<bits/stdc++.h>
using namespace std;
#define re register
#define in inline
#define get getchar()
#define ll long long
in int read()
{
    int t=0,x=1; char ch=get;
    while(ch=='-' && (ch<'0'|| ch>'9') )ch=get;
    if(ch=='-') ch=get,x=-1;
    while(ch<='9' && ch>='0') t=t*10+ch-'0', ch=get;
    return t*x;
}
const int _=1e4+5;
struct edge{
    int to,ne;
}e[_];
int h[_],n,m,a[_],vis[_],f[_][2],tot;
in void add(int x,int y)
{
    e[++tot].ne=h[x],e[tot].to=y,h[x]=tot;
}
in void dfs(int u,int fa)
{
    f[u][1]=a[u],f[u][0]=0;
    for(re int i=h[u];i;i=e[i].ne)
    {
	int v=e[i].to;
	dfs(v,u);
    }
    for(re int i=h[u];i;i=e[i].ne)
    {
	int v=e[i].to;
	f[u][0]+=f[v][1];
	f[u][1]+=f[v][0];
    }
}
int main()
{
    n=read();
    for(re int i=1;i<=n;i++) a[i]=read();
    for(re int i=1;i<n;i++)
    {
	int x=read(),y=read();
	add(y,x);
	vis[x]=1;
    }
    int root=0;
    for(re int i=1;i<=n;i++)
	if(!vis[i]){vis[i]=1,root=i;break;}
    dfs(root,0);
    cout<<max(f[root][1],f[root][0]);
}

2020/5/21 07:33
加载中...