COGS——T2084. Asm.Def的基本算法

★☆   输入文件: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分后面就超时了

 1 #include <algorithm>
 2 #include <cstdio>
 3
 4 #define mod 1000000007
 5
 6 using namespace std;
 7
 8 const int N(1e6+15);
 9 int n,x,ans,w[N],a[N];
10
11 int sumedge,head[N];
12 struct Edge
13 {
14     int from,to,next;
15     Edge(int from=0,int to=0,int next=0):from(from),to(to),next(next){}
16 }edge[N];
17 void ins(int from,int to)
18 {
19     edge[++sumedge]=Edge(from,to,head[from]);
20     head[from]=sumedge;
21 }
22
23 int deep[N],size[N],dad[N],top[N];
24 void DFS(int x)
25 {
26     deep[x]=deep[dad[x]]+1;size[x]=1;
27     for(int i=head[x];i;i=edge[i].next)
28     {
29         int to=edge[i].to;
30         if(dad[x]!=to)
31             dad[to]=x,DFS(to),size[x]+=size[to];
32     }
33 }
34 void DFS_(int x)
35 {
36     int t=0;if(!top[x]) top[x]=x;
37     for(int i=head[x];i;i=edge[i].next)
38     {
39         int to=edge[i].to;
40         if(dad[x]!=to&&size[t]<size[to]) t=to;
41     }
42     if(t) top[t]=top[x],DFS_(t);
43     for(int i=head[x];i;i=edge[i].next)
44     {
45         int to=edge[i].to;
46         if(dad[x]!=to&&t!=to) DFS_(to);
47     }
48 }
49
50 int LCA(int x,int y)
51 {
52     for(;top[x]!=top[y];x=dad[top[x]])
53         if(deep[top[x]]<deep[top[y]]) swap(x,y);
54     return deep[x]>deep[y]?y:x;
55 }
56
57 int main()
58 {
59     freopen("asm_algo.in","r",stdin);
60     freopen("asm_algo.out","w",stdout);
61     scanf("%d%d",&n,&w[1]);
62     for(int i=2;i<=n;i++)
63         scanf("%d%d",&x,w+i),ins(i,x),ins(x,i);
64     DFS(1); DFS_(1);
65     for(int i=1;i<=n;i++)
66       for(int j=1;j<=n;j++)
67         ans=(ans%mod+(w[i]*w[j]*w[LCA(i,j)])%mod)%mod;
68     printf("%d",ans);
69     return 0;
70 }

AAAAAATTTT

容易发现每个点自身的值都会加上,剩下的可以用记忆化搜索求出来

 1 #include <algorithm>
 2 #include <cstdio>
 3
 4 #define mod 1000000007
 5 #define LL long long
 6
 7 using namespace std;
 8
 9 const LL N(1e5+15);
10 LL n,x,w[N];
11
12 LL sumedge,head[N];
13 struct Edge
14 {
15     LL from,to,next;
16     Edge(LL from=0,LL to=0,LL next=0):from(from),to(to),next(next){}
17 }edge[N];
18 void ins(LL from,LL to)
19 {
20     edge[++sumedge]=Edge(from,to,head[from]);
21     head[from]=sumedge;
22 }
23
24 LL sum[N],dad[N],ans;
25 void DFS(LL x)
26 {
27     sum[x]=w[x];
28     for(LL i=head[x];i;i=edge[i].next)
29     {
30         LL to=edge[i].to;
31         if(!dad[to])
32         {
33             dad[to]=x; DFS(to);
34             ans=(ans%mod+sum[x]%mod*sum[to]%mod*w[x]%mod)%mod;
35             sum[x]=(sum[x]%mod+sum[to]%mod)%mod;
36         }
37     }
38 }
39
40 int main()
41 {
42     freopen("asm_algo.in","r",stdin);
43     freopen("asm_algo.out","w",stdout);
44     scanf("%lld%lld",&n,&w[1]);
45     for(LL i=2;i<=n;i++)
46         scanf("%lld%lld",&x,w+i), ins(x,i);
47     DFS(1); ans=ans%mod*2%mod;
48     for(LL i=1;i<=n;i++)
49         ans=(ans%mod+w[i]%mod*w[i]%mod*w[i]%mod)%mod;
50     printf("%lld",ans%mod);
51     return 0;
52 }

AAAAAAAAAA

时间: 2024-11-08 21:44:41

COGS——T2084. Asm.Def的基本算法的相关文章

2084. Asm.Def的基本算法

2084. Asm.Def的基本算法 传送门 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] "有句美国俗语说,如果走起来像鸭子,叫起来像鸭子,那就是一只鸭子."斯科特·华莱士看着Asm.Def面前屏幕上滚动的绿色字符,若有所思地说. "什么意思?" "你的数据.看上去是一棵树." "按照保密条令,我什么也不说这是最好的--但见你

COGS——C2098. Asm.Def的病毒

http://www.cogs.pro/cogs/problem/problem.php?pid=2098 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持久化动态计算机病毒,‘创世纪’.”方教授介绍道. “哦.”主席面无表情地点点头. “‘创世纪’无法真正杀死透明计算网络,但是可以把它变成傻子.可惜透明计算网络能轻松地辨认出病毒,所以我建议……

COGS 2098. Asm.Def的病毒

★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持久化动态计算机病毒,‘创世纪’.”方教授介绍道. “哦.”主席面无表情地点点头. “‘创世纪’无法真正杀死透明计算网络,但是可以把它变成傻子.可惜透明计算网络能轻松地辨认出病毒,所以我建议……” “为什么不伪装呢?”Asm.Def说. “当然不行,它比我们更懂伪装.” “我是说,把我们的病毒伪装成杀

COGS2085 Asm.Def的一秒

时间限制:1 s   内存限制:256 MB [题目描述] “你们搞的这个导弹啊,excited!” Asm.Def通过数据链发送了算出的疑似目标位置,几分钟后,成群结队的巡航导弹从“无蛤”号头顶掠过,布满了天空. “一共发射了多少导弹?” “十亿美元.”斯科特·华莱士回答,“单价100万,现在天上有1000多枚.这玩意能自动搜索10个可疑点,找到目标就发动攻击.” “什么?10个?我给了它10万个点!” “这会让它的程序崩溃的.好在你还有时间手动输入路径.” “多久?” “零……还有一秒,他们

【算法日记】广度优先算法

广度优先算法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止.广度优先搜索让你能够找出两样东西之间最短的距离.在学习这个算法之前我们要了解图的概念 1.什么是图 如上图所示.图是有节点和边组成的.一个节点可能和很多节点直接相连,这些相

cogs 1695. 梦游仙境

★☆   输入文件:XTTMYXJ.in   输出文件:XTTMYXJ.out   简单对比 时间限制:5 s   内存限制:512 MB [题目描述] 在Asm.def仍然在与人工智能进行艰苦的斗争时,雪甜甜小公主仍然在亚特兰蒂斯里自娱自乐,她不小心误闯了玛丽奥的世界. 她感觉十分有趣,她闯关到了一行有n个小块上面有傻币的地面(可以看成一个数轴),地面上有许多,假如雪甜甜的起点为l,终点为r,跳跃能力为jump,从左往右跳 针对雪甜甜皇家公主给出的q组询问l,r,jump,你需要计算他获得的傻

字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置.比如原字符串为"ABCDEFG",子串为"DEF",则算法返回3.常见的算法包括:BF(Brute Force,暴力检索).RK(Robin-Karp,哈希检索).KMP(教科书上最常见算法).BM(

字符串相似度算法——Levenshtein Distance算法

Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.一般来说,编辑距离越小,两个串的相似度越大. 算法实现原理图解: a.首先是有两个字符串,这里写一个简单的 abc 和 abe b.将字符串想象成下面的结构. A 处 是一个标记,为了方便讲解,不是这个表的内容.   abc a b c abe 0 1 2 3 a 1 A处  

编译原理课程作业1 消除无用产生式

前言: 一年前在知乎上看到一个回答,答主说自己学了两天Python,用十几个小时做完了全部的编译原理课程作业,当时吓傻了我,现在看来,虽然两天学会比不上,但Python做课程作业的速度简直是快,课程作业1里我还傻傻的用list的extend和append,加上set函数,到第二次作业里我才发现, 没有什么结构体是一个list不能解决的,如果有,那就再套一个list 课程作业题: 消除无用产生式 # -*- coding: utf-8 -*- class Solution: def __init_