COGS——T2084. Asm.Def的基本算法
http://cogs.pro/cogs/problem/problem.php?pid=2084
★☆ 输入文件: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.
裸LCA只能拿60分后面就超时了
#include <algorithm>
#include <cstdio> #define mod 1000000007 using namespace std; const int N(1e6+);
int n,x,ans,w[N],a[N]; int sumedge,head[N];
struct Edge
{
int from,to,next;
Edge(int from=,int to=,int next=):from(from),to(to),next(next){}
}edge[N];
void ins(int from,int to)
{
edge[++sumedge]=Edge(from,to,head[from]);
head[from]=sumedge;
} int deep[N],size[N],dad[N],top[N];
void DFS(int x)
{
deep[x]=deep[dad[x]]+;size[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int to=edge[i].to;
if(dad[x]!=to)
dad[to]=x,DFS(to),size[x]+=size[to];
}
}
void DFS_(int x)
{
int t=;if(!top[x]) top[x]=x;
for(int i=head[x];i;i=edge[i].next)
{
int to=edge[i].to;
if(dad[x]!=to&&size[t]<size[to]) t=to;
}
if(t) top[t]=top[x],DFS_(t);
for(int i=head[x];i;i=edge[i].next)
{
int to=edge[i].to;
if(dad[x]!=to&&t!=to) DFS_(to);
}
} int LCA(int x,int y)
{
for(;top[x]!=top[y];x=dad[top[x]])
if(deep[top[x]]<deep[top[y]]) swap(x,y);
return deep[x]>deep[y]?y:x;
} int main()
{
freopen("asm_algo.in","r",stdin);
freopen("asm_algo.out","w",stdout);
scanf("%d%d",&n,&w[]);
for(int i=;i<=n;i++)
scanf("%d%d",&x,w+i),ins(i,x),ins(x,i);
DFS(); DFS_();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
ans=(ans%mod+(w[i]*w[j]*w[LCA(i,j)])%mod)%mod;
printf("%d",ans);
return ;
}
AAAAAATTTT
#include <algorithm>
#include <cstdio> #define mod 1000000007
#define LL long long using namespace std; const LL N(1e5+);
LL n,x,w[N]; LL sumedge,head[N];
struct Edge
{
LL from,to,next;
Edge(LL from=,LL to=,LL next=):from(from),to(to),next(next){}
}edge[N];
void ins(LL from,LL to)
{
edge[++sumedge]=Edge(from,to,head[from]);
head[from]=sumedge;
} LL sum[N],dad[N],ans;
void DFS(LL x)
{
sum[x]=w[x];
for(LL i=head[x];i;i=edge[i].next)
{
LL to=edge[i].to;
if(!dad[to])
{
dad[to]=x; DFS(to);
ans=(ans%mod+sum[x]%mod*sum[to]%mod*w[x]%mod)%mod;
sum[x]=(sum[x]%mod+sum[to]%mod)%mod;
}
}
} int main()
{
freopen("asm_algo.in","r",stdin);
freopen("asm_algo.out","w",stdout);
scanf("%lld%lld",&n,&w[]);
for(LL i=;i<=n;i++)
scanf("%lld%lld",&x,w+i), ins(x,i);
DFS(); ans=ans%mod*%mod;
for(LL i=;i<=n;i++)
ans=(ans%mod+w[i]%mod*w[i]%mod*w[i]%mod)%mod;
printf("%lld",ans%mod);
return ;
}
AAAAAAAAAA
COGS——T2084. Asm.Def的基本算法的更多相关文章
- cogs——2084. Asm.Def的基本算法
2084. Asm.Def的基本算法 ★☆ 输入文件:asm_algo.in 输出文件:asm_algo.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “有句 ...
- COGS 2084. Asm.Def的基本算法
★☆ 输入文件:asm_algo.in 输出文件:asm_algo.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “有句美国俗语说,如果走起来像鸭子,叫起来像 ...
- 2084. Asm.Def的基本算法
2084. Asm.Def的基本算法 传送门 ★☆ 输入文件:asm_algo.in 输出文件:asm_algo.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] ...
- COGS——C2098. Asm.Def的病毒
http://www.cogs.pro/cogs/problem/problem.php?pid=2098 ★☆ 输入文件:asm_virus.in 输出文件:asm_virus.out ...
- cogs——2098. Asm.Def的病毒
2098. Asm.Def的病毒 ★☆ 输入文件:asm_virus.in 输出文件:asm_virus.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “这就 ...
- COGS 2091. Asm.Def的打击序列
★★★ 输入文件:asm_lis.in 输出文件:asm_lis.out 简单对比时间限制:4 s 内存限制:256 MB [题目描述] 白色圆柱形的“蓝翔”号在虚空中逐渐变大,一声沉 ...
- COGS 2082. Asm.Def谈笑风生
★ 输入文件:asm_talk.in 输出文件:asm_talk.out 简单对比时间限制:2 s 内存限制:256 MB [题目描述] “人呐都不知道,自己不可以预料,直升机刚一出圣 ...
- COGS 2098. Asm.Def的病毒
★☆ 输入文件:asm_virus.in 输出文件:asm_virus.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持 ...
- cogs 2098. [SYOI 2015] Asm.Def的病毒 LCA 求两条路径是否相交
2098. [SYOI 2015] Asm.Def的病毒 ★☆ 输入文件:asm_virus.in 输出文件:asm_virus.out 简单对比时间限制:1 s 内存限制:256 M ...
随机推荐
- 阿里巴巴战略投资印度最大支付平台Paytm
腾讯科技讯 9月29日,据路透社报道,阿里巴巴和印度最大移动支付和商务平台Paytm今天发布联合声明,宣布阿里巴巴集团及其旗下金融子公司蚂蚁金服将向Paytm注入新资金.阿里称这是一项“战略性的”投资 ...
- Swift 中的协议
Swift 中的协议协议是为方法.属性等定义一套规范,没有具体的实现,类似于Java中的抽象接口,它只是描述了方法或属性的骨架,而不是实现.方法和属性实现还需要通过定义类,函数和枚举完成. 协议定义 ...
- js常见语法错误
“Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...
- go语言简单的执行shell命令
package main import( "fmt" "os/exec" "os" "string ...
- 关于python 中的偏函数转载
Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function).要注意,这里的偏函数和数学意义上的偏函数不一样. 在介绍函数参数的时候,我们讲到,通过 ...
- centeros 7开机自动挂载磁盘
场景: 使用mount命令将新发现的磁盘/dev/sdb挂载给/liu后,但是重启后又看不到磁盘? 问题导致原因: 虽然我们可以使用mount命令去挂载磁盘,但是此操作只对服务器运行期间有效,也就是临 ...
- Java多线程-基础知识
一. 进程是执行中的程序,程序是静态的(我们写完以后不运行就一直放在那里),进程是执行中的程序,是动态概念的.一个进程可以有多个线程. 二. 多线程包含两个或两个以上并发运行的部分,把程序中每个这样并 ...
- [Test] Easy automated testing in NodeJS with TestCafe
Quickly get up and running with sensible automated testing scenarios written in ES6. Installing and ...
- 【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)
好早的时候就打算写这篇文章,可是还是參加阿里大数据竞赛的第一季三月份的时候实验就完毕了.硬生生是拖到了十一假期.自己也是醉了... 找工作不是非常顺利,希望写点东西回想一下知识.然后再攒点人品吧,仅仅 ...
- hdu 5277 YJC counts stars
hdu 5277 YJC counts stars 题意: 给出一个平面图,n个点,m条边,直线边与直线边之间不相交,求最大团的数目. 限制: 1 <= n <= 1000 思路: 因为平 ...