社区讨论

倍增T了4个点,求助

P1351[NOIP 2014 提高组] 联合权值参与者 6已保存回复 22

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
22 条
当前快照
1 份
快照标识符
@mi7pb5q8
此快照首次捕获于
2025/11/21 01:24
4 个月前
此快照最后确认于
2025/11/21 01:55
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;
vector <int> dep[200005];
int n;
int b[200005][20];
long long a[200005];
struct Node
{
	int v;
	Node *next;
}*h[200005],pool[400005];
int tot=0;
void adde(int u,int v)
{
	Node *p=&pool[++tot];
	p->v=v;
	p->next=h[u];
	h[u]=p;
}
int d[200005];
int vis[200005];
inline int read()
{
    int sum=0,fg=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') 
            fg=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        sum=(sum*10)+c-'0';
        c=getchar();
    }
    return sum*fg;
}
void dfs(int u)
{
	dep[d[u]].push_back(u);
    vis[u]=1;
    int v;
    for(int i=1;(1<<i)<=d[u];i++)
    {
    	b[u][i]=b[b[u][i-1]][i-1];
    }
    for(Node *p=h[u];p;p=p->next)
    {
        if(vis[v=p->v]==0)
        {
            d[v]=d[u]+1;
            b[v][0]=u;
            dfs(v); 
        }
    }
}

int main()
{
	n=read();
	for(int i=1;i<n;i++)
	{
		int x,y;
		x=read();
		y=read();
		adde(x,y);
		adde(y,x);
	}
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
	} 
	d[1]=1;
	dfs(1);
	long long ans=0;
	long long maxans=0;
	for(int i=1;i<=n;i++)
	{
		if(d[i]>2)
		{
			ans=(a[i]*a[b[i][1]]+ans)%10007;
			maxans=max(maxans,a[i]*a[b[i][1]]);
		}
	}
	ans*=2;
	for(int i=1;i<=n;i++)
	{
		int depth=d[i];
		for(int j=0;j<dep[depth].size();j++)
		{
			if(dep[depth][j]!=i&&b[dep[depth][j]][0]==b[i][0])
			{
				ans=(ans+a[dep[depth][j]]*a[i])%10007;
				maxans=max(maxans,a[dep[depth][j]]*a[i]);
			}
		}
	}
	cout << maxans << " " << ans%10007;
	return 0;
} 

回复

22 条回复,欢迎继续交流。

正在加载回复...