题目
样例
数据范围
解题
乍一看是图,但是并查集。其实画个图就知道了
用微软白板画的,鼠标作画。
可以看到3和5之间是5705的人气值,当询问6000时,就会有
(5,3)和(3,5)这两个组合满足题目条件,像这种求连通的题呢,就可以用并查集了,不难发现,3和5一开始属于两个并查集,但满足条件之后贡献出了两个答案,那么3和5这个并查集与2这个并查集合并之后的贡献是多少呢?
是2乘1再考虑反方向走再乘2对吧,所以现在就有了6个答案(2+4)。
但是这题如果每次询问都去重做一遍,可能会爆掉,所以考虑离线做法,具体看代码
代码
#include<bits/stdc++.h>
using namespace std;
int fa [400086];//fa[i]是i的大哥
int cnt[400086];//cnt[i]是i的帮派规模
int result=0;//单次结果
int ans[400086];
struct EDGE
{
int u;
int v;
int w;
}edge[100086];//从u走到v的人气值w
struct QUESTION
{
int w;
int num;
}que[