一道提高组的题。。。。。

传送门:题目在这里。。。。

现在都懒得更自己的blog了,怕是太颓废了_ (:з」∠) _

好久没做题了,手都生了。(好吧其实是做题方面手太生了)

这题我都不想讲了,把代码一贴就算了呗。。

但还是要说说的。。。。

首先,题目里说:“无向连通图G 有n 个点,n - 1 条边。”

我们可以知道这是一棵树(怕不是废话。。),这样遍历的时候就能保证是O(n)级别了。。

找最大值 很简单,遍历树的时候找一下与每个点相连的点的最大值和次大值一乘就完了。。。显然这么贪心是没问题的。。。

求和 稍微麻烦一点,但也没多麻烦。。

然后呢,“对于图G 上的点对( u, v) ,若它们的距离为2 ”

这就分为两种情况。。。

我们假定以1为根(这样就能分出父子关系),与x距离为2就分为x和x的祖父和x和x的兄弟两种。。

x和x的祖父的联合权值好算(因为只有一个),遍历的时候记录一下父亲然后查一下就完了。

x和x的兄弟稍微麻烦一点,聪明的人是不会一个一个算的,因为这样会是O(n²)级别的。

这就要搬出一个公式来了,(不知道怎么想到这一点的。。但是正确性不言而喻,不信可以自己推推。。)

\[\sum_{i=L}^{R}\sum_{j=i+1}^{R}a_i*a_j=\frac{(\sum_{i=L}^{R}a_i)^2-\sum_{i=L}^{R}a_i^2}{2}
\]

其实就是这个意思(我拿3个点举个例子吧~)

有3个点abc我们要求ab+ac+bc的时候,我们可以求出a+b+c①和a²+b²+c²②,然后(①²-②)/2即得。。

这个和和平方和我们是可以在能接受的时间内算出的。。

以上加起来就得到了代码。。我用bfs写的。。不过建议你们用dfs写就行了(这又不是会爆栈的什么省选)

然后题目说的是 “有序点对”(说明里就能看出来) 所以ans最后要2。。。(2后记得再取一次模不然会被卡到50)

然后就是最大值不用取模而求和需要取模(语文问题),这样用代码实现就可以AC啦(≧▽≦)/

然后这次的程序我是用QtCreator写的(Windows啦)。。。。(好像还配置了半天,调试器还没弄好)个人感觉界面很友好。。字体看着非常顺眼,补全也挺贴心的。。似乎也不像vs毛病特别多。。

(但换一个IDE就要换一下编译运行的快捷键也是很醉)

以上一段算是广告(当然没有广告费)纯属给大家安利一下,没有任何卵用,并不重要。。

我们上代码吧。。

#include <cstdio>
#include <queue> using std::queue;
queue<int> q;
const int p=10007;
const int N=200020;
struct edge{
int to,next;
};
edge e[N<<1]; int v[N],tot=0;
int fa[N],w[N];
bool vis[N];
int ans=0,maxn=0; inline int max(const int &a,const int &b){
if(a<b) return b; return a;
} inline int getnum(){
int a=0;char c=getchar();bool f=0;
for(;(c<'0'||c>'9')&&c!='-';c=getchar());
if(c=='-') c=getchar(),f=1;
for(;c>='0'&&c<='9';c=getchar()) a=(a<<1)+(a<<3)+c-'0';
if(f) return -a; return a;
} void build(int from, int to){
e[++tot].to=to; e[tot].next=v[from]; v[from]=tot;
} void bfs(){
while (!q.empty()) {
int x=q.front(); q.pop(); vis[x]=1;
long long numa=0,numb=0;
int mx1=0,mx2=0;
ans=(ans+w[x]*w[fa[fa[x]]])%p;
for(int i=v[x];i;i=e[i].next){
int y=e[i].to;
if(w[y]>mx1) mx2=mx1,mx1=w[y];
else mx2=max(mx2,w[y]);
if(!vis[y]){
q.push(y); fa[y]=x;
numa+=w[y]; numb+=w[y]*w[y];
}
}
long long _=(numa*numa-numb)>>1;
ans=(ans+_)%p;
maxn=max(maxn,mx1*mx2);
}
} int main(){
int n=getnum();
for(int i=1;i<n;i++){
int a=getnum(),b=getnum();
build(a,b); build(b,a);
}
for(int i=1;i<=n;i++) w[i]=getnum();
q.push(1); bfs();
printf("%d %d",maxn,(ans<<1)%p);
}

唔 就是这样。。

TG组的题对我来说还是太难了。。

我还是太弱了。。

【学术篇】luogu1351 [NOIP2014提高组] 联合权值的更多相关文章

  1. NOIP2014提高组 联合权值(距离为2的树形dp)

    联合权值 题目描述 无向连通图 GG 有 nn 个点,n-1n−1 条边.点从 11 到 nn 依次编号,编号为 ii 的点的权值为 W_iWi​,每条边的长度均为 11.图上两点 (u, v)(u, ...

  2. [NOIP2014提高组]联合权值

    题目:洛谷P1351.Vijos P1906.codevs3728.UOJ#16. 题目大意:有一个无向连通图,有n个点n-1条边,每个点有一个权值$W_i$,每条边长度为1.规定两个距离为2的点i和 ...

  3. [NOIp2014] luogu P1351 联合权值

    哎我博 4 了. 题目描述 无向连通图 GGG 有 nnn 个点,n−1n−1n−1 条边.点从 111 到 nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi​,每条边的长度均为 111 ...

  4. [NOIP2014] 提高组 洛谷P1351 联合权值

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  5. Noip2014 提高组 T2 联合权值 连通图+技巧

    联合权值 描述 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 WiWi, 每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的 ...

  6. NOIP2014提高组第二题联合权值

    还是先看题吧: 试题描述  无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 ...

  7. 【NOIP2014提高组】联合权值

    https://www.luogu.org/problem/show?pid=1351 既然是一棵树,就先转化成有根树.有根树上距离为2的点对,路径可能长下面这样: 枚举路径上的中间点X. 第一种情况 ...

  8. NOIP 提高组 2014 联合权值(图论???)

    传送门 https://www.cnblogs.com/violet-acmer/p/9937201.html 题解: 相关变量解释: int n; int fa[maxn];//fa[i] : i的 ...

  9. 题解【luoguP1351 NOIp提高组2014 联合权值】

    题目链接 题意:给定一个无根树,每个点有一个权值.若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\).求所有的联合权值的和与最大值 分析: 暴力求,每个 ...

随机推荐

  1. Spring IOC源码分析(二):Bean工厂体系结构设计

    一. 概述 Spring容器通常指的是ApplicationContext的体系结构设计,即整个Spring框架的IOC功能,是通过ApplicationContext接口实现类来提供给应用程序使用的 ...

  2. 牛客网多校训练第八场A All one Matrix

    题目链接:https://ac.nowcoder.com/acm/contest/888/A 题意:求出有多少个不被包含的全1子矩阵 解题思路:首先对列做处理,维护每个位置向上1的个数,然后我们从最后 ...

  3. URL&HTTP协议&GET请求&POST请求

    1.什么是URL URL的全称是Uniform Resource Locator(统一资源定位符) 通过1个URL,能找到互联网上唯一的1个资源 URL就是资源的地址.位置,互联网上的每个资源都有一个 ...

  4. 【第二次个人作业】结对作业Core第一组:四则运算生成PB16061082+PB16120517

    [整体概况] 1.描述最终的代码的实现思路以及关键代码. 2.结对作业两个人配合的过程和两个人分工. 3.API接口文档和两个组的对接. 4.效能分析,优化分析和心得体会. [代码实现] 一. 实现功 ...

  5. AF_UNIX

    3.SOCK_SEQPACKET SOCK_SEQPACKET提供一个顺序确定的,可靠的,双向基于连接的socket endpoint. 与SOCK_STREAM不同的是,它保留消息边界.(表明发送两 ...

  6. 笔记36 Spring Web Flow——配置

    Spring Web Flow是一个Web框架,它适用于元素按规定流程运行的程序.Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程 序.它将流程的定义与实现流程行 ...

  7. 每天进步一点点-WPF-根据数据类型加载控件

    目的,根据数据类型的不同,动态的加载适用于不同数据类型的控件(布局) 原理:为自定义的数据类型添加数据魔板,绑定的时候绑定这些数据类型的实例. 例子: 数据类型: 数据模板: <DataTemp ...

  8. Dubbo从拜师到入坟

    第一个Dubbo程序:Hello world 创建业务接口工程 我们将这个接口单独抽取出来,打成jar包被多个服务锁依赖 创建服务提供者Provider Provider工程的pom文件如下: < ...

  9. FFT的应用

    FFT的应用 --讲稿 概述 FFT的模板很简单,大家都会背,于是出题的空间就在于建模了.FFT的题目难在建模,往往需要将问题抽象出来,经过一系列转化后得到乘积式的和,再赋予式子各个项的系数一定的意义 ...

  10. NX二次开发-UFUN高亮显示对象UF_DISP_set_highlight

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_disp.h> UF_initializ ...