社区讨论
倍增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 条回复,欢迎继续交流。
正在加载回复...