【前缀和】【前缀MAX】洛谷 P1351 NOIP2014提高组 day1 T2 联合权值

不难发现,树中与某个点距离为2的点只可能是它的父亲的父亲、儿子的儿子 或者 兄弟,分类讨论一下即可。

只有对于兄弟我们不能暴力搞,维护一下每个节点的所有儿子的前缀和、前缀MAX就行了。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<vector>
 4 using namespace std;
 5 #define N 200001
 6 #define MOD 10007
 7 int n;
 8 vector<int>G[N],son[N];
 9 typedef long long ll;
10 typedef vector<int>::iterator ITER;
11 int x,y,fa[N],dep[N],maxv,sumv,w[N];
12 void dfs(int U)
13 {
14     for(ITER it=G[U].begin();it!=G[U].end();it++)
15       if((*it)!=fa[U])
16         {
17           fa[*it]=U;
18           dep[*it]=fa[U]+1;
19           son[U].push_back(*it);
20           dfs(*it);
21         }
22 }
23 void dfs2(int U)
24 {
25     if(dep[U]>=2) sumv=(sumv+w[U]*w[fa[fa[U]]]%MOD)%MOD;
26     ll All=0,t=0;
27     for(ITER it=son[U].begin();it!=son[U].end();it++) All+=(ll)w[*it];
28     for(ITER it=son[U].begin();it!=son[U].end();it++)
29       {
30           t+=(ll)w[*it];
31           sumv=(sumv+w[*it]*(int)(All-t)%MOD)%MOD;
32           dfs2(*it);
33       }
34 }
35 void dfs3(int U)
36 {
37     if(dep[U]>=2) maxv=max(maxv,w[U]*w[fa[fa[U]]]);
38     int t=0;
39     for(int i=0;i<son[U].size();i++)
40       {
41           if(i)
42             {
43                 t=max(t,w[son[U][i-1]]);
44                 maxv=max(maxv,w[son[U][i]]*t);
45             }
46           dfs3(son[U][i]);
47       }
48 }
49 int main()
50 {
51     scanf("%d",&n);
52     for(int i=1;i<n;i++)
53       {
54           scanf("%d%d",&x,&y);
55           G[x].push_back(y);
56           G[y].push_back(x);
57       }
58     for(int i=1;i<=n;i++) scanf("%d",&w[i]);
59     dfs(1); dfs2(1); dfs3(1);
60     printf("%d %d\n",maxv,(sumv<<1)%MOD);
61     return 0;
62 }
时间: 2024-08-06 05:47:11

【前缀和】【前缀MAX】洛谷 P1351 NOIP2014提高组 day1 T2 联合权值的相关文章

NOIP2014提高组第二题联合权值

还是先看题吧: 试题描述  无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离.对于图 G 上的点对(u, v),若它们的距离为 2,则它们之间会产生Wu * Wv 的联合权值.请问图 G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入 第一行包含 1 个整数 n.接下来 n-1 行,每行包含 2 个用空格隔开的正整数 

【暴力】洛谷 P1328 NOIP2014提高组 day1 T1 生活大爆炸版石头剪刀布

把所有情况打表,然后随便暴力. 1 #include<cstdio> 2 using namespace std; 3 int n,an,bn,p1,p2; 4 int a[10001],b[10001]; 5 bool f[6][6]; 6 int ans1,ans2; 7 void init() 8 { 9 f[0][0]=0; f[0][0]=0; 10 f[0][1]=0; f[1][0]=1; 11 f[1][1]=0; f[1][1]=0; 12 f[0][2]=1; f[2][0

【DFS】【最短路】【spfa】【BFS】洛谷P2296 NOIP2014提高组 day2 T2 寻找道路

存反图,从终点dfs一遍,记录下无法到达的点. 然后枚举这些记录的点,把他们的出边所连的点也全部记录. 以上这些点都是无法在最短路中出现的. 所以把两个端点都没被记录的边加进图里,跑spfa.BFS什么的随意. 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 #define N 10001 7 vector

【NOIP之旅】NOIP2014 day1 T2 联合权值

2.联合权值 (link.cpp/c/pas) [问题描述] 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi  ,每条边的长度均为1.图上两点(u, v)的距离定义为u点到v点的最短距离.对于图G上的点对(u, v),若它们的距离为2,则它们之间会产生Wu×Wv的联合权值. 请问图G上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? [输入] 输入文件名为link.in. 第一行包含1个整数n. 接下来n-1行,每行包含2个用空格隔开

【暴力】洛谷 P2038 NOIP2014提高组 day2 T1 无线网络发射器选址

暴力枚举. 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int a[130][130],d,n,x,y,z,num,ans=-2147483647; 5 int main() 6 { 7 scanf("%d%d",&d,&n); 8 for(int i=1;i<=n;i++) 9 { 10 scanf("%d%d%d",&x,

洛谷P1312 [NOIOP2011提高组 Day1T3]Mayan游戏

Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有的方块,消除方块的规则如下: 1 .每步移动可以且仅可以沿横向(即向左或向右)拖动某一方块一格:当拖动这一方块时,如果拖动后到达的位置(以下称目标位置)也有方块,那么这两个方块将 交换位置(参见输入输出样例说明中的图6 到图7 ):如果目标位置上没有方块,那么被拖动的

【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入输出格

二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)

在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即对于每份

洛谷P1083 [NOIP2012提高组Day2T2]借教室

P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室