★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

“有句美国俗语说,如果走起来像鸭子,叫起来像鸭子,那就是一只鸭子。”斯科特·华莱士看着Asm.Def面前屏幕上滚动的绿色字符,若有所思地说。

“什么意思?”

“你的数据。看上去是一棵树。”

“按照保密条令,我什么也不说这是最好的——但见你这么热情,一句话不说也不好。”Asm.Def停下手中的快速数论变换,“确实是树。”

“然后你怎么算出来目标的位置?”

“都需要按照基本算法,按照图论的那一套理论,去产生。听说过LCA吗?不是那个印度飞机,我是说最近公共祖先……”

Asm.Def通过分析无线电信号得到了一棵有n个节点,以1为根的树。除1之外,节点i的父亲是p_i。节点带有权值,节点i的权值是w_i。

我们定义某点的祖先为从根到它路径上的所有点(包括它本身),而两个节点a、b的最近公共祖先是某个点p,使得p同时是a、b的祖先,而且p离根最远。

Asm.Def想要求出

(文字:∑∑w_i*w_j*w_LCA(i,j)),

其中LCA(i,j)是i、j的最近公共祖先,他认为这个值至关重要。由于这个值可能很大,Asm.Def只需要知道它模1,000,000,007(即10^9+7)的结果。

【输入格式】

第1行两个整数:n和w_1.

第2行到第n行,第i行有两个整数p_i和w_i。

【输出格式】

一行一个整数,即答案模1,000,000,007的值。

【样例输入】

2 2
1 1

【样例输出】

17

【提示】

1×1×1+1×2×2+2×1×2+2×2×2=17。

对于30%的数据,n<=100,w_i<=10。

对于60%的数据,n<=1000,w_i<=1000.

对于100%的数据,1<=n<=10^5,0<=w_i<=10^9,1<=p_i<i.

【来源】

在此键入。

Tarjan法求lca我认为是可以过的

但是需要的数组开不下 数组需要 100000*99999/2 这么大 三个

开不下 

屠龙宝刀点击就送

#include <ctype.h>
#include <cstdio>
#include <vector>
#define mod 1000000007
#define N 150000
using namespace std;
vector<int>edge[N];
vector<int>q[N];
inline void read(int &x)
{
register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
}
int y,Answer,u[N<<],v[N<<],ans[N<<],num,n,dep[N],fa[N],dad[N],w[N];
int find_(int x) {return x==fa[x]?x:fa[x]=find_(fa[x]);}
void dfs(int x)
{
fa[x]=x;
for(int i=;i<edge[x].size();i++)
if(dad[x]!=edge[x][i]) dad[edge[x][i]]=x,dfs(edge[x][i]);
for(int i=;i<q[x].size();i++)
if(dad[y=u[q[x][i]]^v[q[x][i]]^x]) ans[q[x][i]]=(w[find_(y)]*)%mod;
fa[x]=dad[x];
}
int main()
{
freopen("asm_algo.in","r",stdin);
freopen("asm_algo.out","w",stdout);
read(n);
read(w[]);
Answer=(Answer%mod+((w[]%mod)*(w[]%mod)*(w[]%mod)%mod))%mod;
for(int p,i=;i<=n;i++)
{
read(p);
read(w[i]);
Answer=(Answer%mod+((w[i]%mod)*(w[i]%mod)*(w[i]%mod)%mod))%mod;
edge[i].push_back(p);
edge[p].push_back(i);
}
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
{
u[++num]=i;
v[num]=j;
q[u[num]].push_back(num);
q[v[num]].push_back(num);
}
}
dfs();
for(int i=;i<=num;i++) Answer=(Answer%mod+((ans[i]%mod)*(w[u[i]]%mod)*(w[v[i]]%mod)%mod))%mod;
printf("%d\n",Answer);
return ;
}

TarjanLCA

#include <ctype.h>
#include <cstdio>
#include <vector>
#define mod 1000000007
#define N 200005
using namespace std;
typedef long long LL;
vector<LL>edge[N]; inline void read(LL &x)
{
register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
}
LL sum[N],ans,n,w[N],siz[N],dep[N],dad[N],top[N];
void dfs(LL x)
{
sum[x]=w[x];
for(LL i=;i<edge[x].size();++i)
{
LL v=edge[x][i];
if(dad[x]!=v)
{
dad[v]=x;
dfs(v);
ans=(ans%mod+sum[x]%mod*sum[v]%mod*w[x]%mod)%mod;
sum[x]=(sum[x]%mod+sum[v]%mod)%mod;
}
}
}
int main()
{
freopen("asm_algo.in","r",stdin);
freopen("asm_algo.out","w",stdout);
read(n);
read(w[]);
for(LL p,i=;i<=n;++i)
{
read(p);
read(w[i]);
edge[p].push_back(i);
edge[i].push_back(p);
}
dfs();
ans=ans%mod*%mod;
for(int i=;i<=n;++i) ans=(ans%mod+w[i]%mod*w[i]%mod*w[i]%mod)%mod;
printf("%lld\n",ans%mod);
return ;
}

最新文章

  1. Git Pro - (2)分支
  2. KETTLE实现数据的删除和更新
  3. mysql 动态新建以及删除分区表
  4. Mysql 设置utf-8 真正一劳永逸的方法
  5. 机器学习技法-GBDT算法
  6. db2常用名词
  7. Tomcat设置自己的项目为默认项目(用IP访问的是自己的项目)
  8. js与C#之间相互调用的一些方法
  9. Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述
  10. spring aop简单日志实例
  11. 【原生js】原生js实现验证码短信发送倒计时
  12. vuex 使用文档
  13. 《天书夜读:从汇编语言到windows内核编程》十 线程与事件
  14. FPGA调试光纤模块
  15. java.util.Date 与 java.sql.Date 之间的转换
  16. Linux网络基本网络配置方法介绍
  17. wget命令使用报错 certificate common name &#39;xxx&#39; doesn&#39;t match requestde host name
  18. 创建一个Django项目的基本步骤
  19. Spark DataFrame列的合并与拆分
  20. Android keystore相关

热门文章

  1. AI—家庭组机器人平台环境配置,高级人工智能实验总结
  2. Codeforces Round #408( Div2)
  3. B - Sea and Islands
  4. ** Error in `./g2o_viewer&#39;: realloc(): invalid pointer:
  5. 3-C++程序的结构1.3
  6. spring基于注解的IOC
  7. 项目中常用的js骚操作
  8. CodeForces Canada Cup 2016【A,B,C,D】
  9. IT行业技术及程序员相关网站荟萃
  10. 如何解决启动Error:com.intellij.util.indexing.StorageException问题?