一道提高组的题。。。。。
传送门:题目在这里。。。。

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

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

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

但还是要说说的。。。。
首先,题目里说:“无向连通图G 有n 个点,n - 1 条边。”
我们可以知道这是一棵树(怕不是废话。。),这样遍历的时候就能保证是O(n)级别了。。

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

求和 稍微麻烦一点,但也没多麻烦。。
然后呢,“对于图G 上的点对( u, v) ,若它们的距离为2 ”
这就分为两种情况。。。
我们假定以1为根(这样就能分出父子关系),与x距离为2就分为x和x的祖父和x和x的兄弟两种。。
x和x的祖父的联合权值好算(因为只有一个),遍历的时候记录一下父亲然后查一下就完了。
x和x的兄弟稍微麻烦一点,聪明的人是不会一个一个算的,因为这样会是O(n²)级别的。

这就要搬出一个公式来了,(不知道怎么想到这一点的。。但是正确性不言而喻,不信可以自己推推。。)
∑Ri=L∑Rj=i+1ai∗aj=(∑Ri=Lai)2−∑Ri=La2i2 \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 提高组 Day1 T2

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

  2. [NOIP2014]联合权值

    NOIp2014提高组 [题目描述] 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i   ,每条边的长度均为1 .图上两点( u ,  v ) 的距 ...

  3. [Luogu 1351] NOIP2014 联合权值

    [Luogu 1351] NOIP2014 联合权值 存图,对于每一个点 \(u\),遍历它的所有邻接点.以 \(u\) 为中转点的点对中,\((x,y)\) 的联合权值 \(w_x \cdot w_ ...

  4. 【NOIP2014提高组】石头剪子布

    题目背景 NOIP2014提高组 Day1 试题. 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第 8 集中 ...

  5. 【洛谷】P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布(详细代码)

    [洛谷]石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一 样,则不分胜负.在<生活大爆炸>第二季第8集中出现了一种石头剪刀布的升级版游戏. 1.[题目描述] 2 ...

  6. 洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布

    题目链接:P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布 ...

  7. 洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 题解 C/C++

    思路如下 方法一:if else 直接模拟 方法二:初始化一个二维数组 输和平记为0,赢记为1 直接索引 //P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 //#define LO ...

  8. 飞扬的小鸟java分析_刷题总结——飞扬的小鸟(NOIP2014提高组)

    题目: 题目背景 NOIP2014 提高组 Day1 试题. 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面 ...

  9. P1941 [NOIP2014 提高组] 飞扬的小鸟

    题目来源 [NOIP2014 提高组] 飞扬的小鸟 - 洛谷 题目考点 动态规划,dp    枚举,暴力    背包 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点 ...

最新文章

  1. pandas 遍历 series
  2. Centos7 安装 docker-ce
  3. Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现
  4. 【shell】shuf命令,随机排序
  5. myeclipse生成getset注释
  6. EGLSurfaces 和 OpenGL ES
  7. git bash 界面修改成linux界面
  8. linux grub rescue 光盘,Ubuntu9.10用安装光盘如何进入linux rescue方式?
  9. html 的layer的属性,layer属性
  10. C++ 泛型模板进阶
  11. 《游戏编程模式》总结
  12. 苹果华人工程师被捕后续,按“商业间谍”指控,本人不认罪
  13. php 二维数组 根据值 找,PHP编程根据二维数组某个字段的值查找值所在的一维数组...
  14. 【软件工程导论】软件工程学概述
  15. 混淆电路(Garbled Circuit)
  16. Azkaban学习_Azkaban(阿兹卡班)介绍 + Azkaban 安装部署 + Azkaban 实战
  17. ua-parser-js实现获取浏览器信息和操作系统信息
  18. 在工作站计算机中创建策略,禁止任何计算机访问本机 8000 端口
  19. Arduino使用手指测心跳模块
  20. php通过strtotime获取想要的日期

热门文章

  1. 备战省赛--黑暗意志
  2. SpringBoot整合Knife4j替代Swagger
  3. java仿酷狗音乐源码_【附项目源码】仿酷狗音乐客户端,浅淡动感歌词补充
  4. 如何用python写四则运算程序中_四则运算生成程序(python版)
  5. iOS iphonex底部安全区域
  6. App自动化测试工具Uiautomator2
  7. Winscape虚拟窗景结合Kinect:窗前可观看巴厘岛海景
  8. 红米note4x在Android Studio 无法安装应用
  9. win10无法启动print spooler服务,提示1068依赖服务或组无法启动
  10. linux查看刷卡pos机_pos机linux下的对应程序