2084. 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.

【超时code】

dalao说没事先打暴力,说不定会想出思路,然而并没有。超时4个点。

用define定义的mod一直错 输出1e009...

然后建边时没有建双边....

树剖写错.....

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
//#define mod 1e9
const int mod=1e9+;
int w[],dad[],size[],top[],deep[];
long long ans;
int n,da;
vector<int>vec[];
void dfs1(int x) {
size[x]=;
deep[x]=deep[dad[x]]+;
for(int i=; i<vec[x].size(); i++) {
if(dad[x]!=vec[x][i]) {
dad[vec[x][i]]=x;
dfs1(vec[x][i]);
size[x]+=size[vec[x][i]];
}
}
}
void dfs2(int x) {
if(!top[x])top[x]=x;
int t=;
for(int i=; i<vec[x].size(); i++) {
if(dad[x]!=vec[x][i]&&size[vec[x][i]]>size[t])
t=vec[x][i];
}
if(t) {
// top[t]=x;
top[t]=top[x];
dfs2(t);
}
for(int i=; i<vec[x].size(); i++) {
if(dad[x]!=vec[x][i]&&vec[x][i]!=t)
dfs2(vec[x][i]);
}
}
int lca(int x,int y) {
for(; top[x]!=top[y];) {
if(deep[x]<deep[y])
swap(x,y);
// top[x]=dad[top[x]];
x=dad[top[x]];
}
if(deep[x]<deep[y])return x;
return y;
}
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",&da,&w[i]);
vec[da].push_back(i);
vec[i].push_back(da);//建双向边
}
dfs1();
dfs2();
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
ans=(ans+w[i]*w[j]*w[lca(i,j)])%mod;
cout<<ans<<endl;
return ;
}

【AC code】

一气之下全改成long long 就过了。

【思路】

如图的矩阵表示i,j的lca。发现对角线两侧是对称的(因为i,j的lca==j,i的lca);

那么我们只要求出对角线的一侧的值再*2+对角线上的值就是答案。

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=1e9+;
const int maxx=1e5;
struct Edge
{
long long x,y,next;
Edge(int x=,int y=,int next=):
x(x),y(y),next(next){}
}edge[maxx<<];
long long head[maxx+],w[maxx+],sum[maxx+],dad[maxx+];
long long n,sumedge,da;
long long ans;
void add(int x,int y)
{
edge[++sumedge]=Edge(x,y,head[x]);
head[x]=sumedge;
}
void dfs(int x)
{
sum[x]=w[x];
for(long long i=head[x];i;i=edge[i].next)
{
if(!dad[edge[i].y])
{
dad[edge[i].y]=x;dfs(edge[i].y);
ans=(ans%mod+sum[x]%mod*sum[edge[i].y]%mod*w[x]%mod)%mod;
sum[x]=(sum[x]%mod+sum[edge[i].y]%mod)%mod;
}
}
}
int main()
{
freopen("asm_algo.in","r",stdin);
freopen("asm_algo.out","w",stdout);
scanf("%lld%lld",&n,&w[]);
for(long long i=;i<=n;i++)
{
scanf("%d%d",&da,w+i);//not &w+i;
add(da,i);
}
dfs();
ans=ans*%mod;
for(long long i=;i<=n;i++)
ans=(ans%mod+w[i]%mod*w[i]%mod*w[i]%mod)%mod;
printf("%lld\n",ans%mod);
return ;
}

2084. Asm.Def的基本算法的更多相关文章

  1. cogs——2084. Asm.Def的基本算法

    2084. Asm.Def的基本算法 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “有句 ...

  2. COGS 2084. Asm.Def的基本算法

    ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “有句美国俗语说,如果走起来像鸭子,叫起来像 ...

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

    http://cogs.pro/cogs/problem/problem.php?pid=2084 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间 ...

  4. Asm.Def点大兵

    syzoj上的题,收货很多,orz天天学长 原题: Asm.Def奉命组建一支m人的特种作战小队前往圣迭戈.他有n名候选人,可以在其中任意挑选.由于小队中每个人都有独特的作用,所以次序不同的两种选法被 ...

  5. cogs——2098. Asm.Def的病毒

    2098. Asm.Def的病毒 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就 ...

  6. COGS2090 Asm.Def找燃料

    时间限制:1 s   内存限制:256 MB [题目描述] “听说咱们要完了?”比利·海灵顿拨弄着操纵杆,头也不回地问Asm.Def. “不要听得风就是雨.” “开个玩笑嘛.不就是打机器人,紧张啥,你 ...

  7. COGS2085 Asm.Def的一秒

    时间限制:1 s   内存限制:256 MB [题目描述] “你们搞的这个导弹啊,excited!” Asm.Def通过数据链发送了算出的疑似目标位置,几分钟后,成群结队的巡航导弹从“无蛤”号头顶掠过 ...

  8. COGS 2091. Asm.Def的打击序列

    ★★★   输入文件:asm_lis.in   输出文件:asm_lis.out   简单对比时间限制:4 s   内存限制:256 MB [题目描述] 白色圆柱形的“蓝翔”号在虚空中逐渐变大,一声沉 ...

  9. COGS 2082. Asm.Def谈笑风生

    ★   输入文件:asm_talk.in   输出文件:asm_talk.out   简单对比时间限制:2 s   内存限制:256 MB [题目描述] “人呐都不知道,自己不可以预料,直升机刚一出圣 ...

随机推荐

  1. 应对ie双外边距,不使用hack

    1.在浮动元素内层加一层div 2.使用不浮动的内层外边距来定义距离 ie在浮动时,并且使用外边距,会产生双倍外边距.

  2. 无刷新URL 更新

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. java中异或加密

    static String simple_xor(String base_data, String encrypt_key) throws UnsupportedEncodingException { ...

  4. python学习(五)列表

    #!/usr/bin/python # 列表的学习, 列表的概念不陌生, 就是熟悉一下python中的列表是如何操作的 # 1. 序列的操作 L = [ 123, 'spam', 1.23] # 里面 ...

  5. 五分钟了解 Service Mesh

      1 背景   1.1 多语言   微服务理念是提倡不同业务使用最适合它的语言开发,现实情况也确实如此,尤其是AI的兴起,一般大型互联网公司存在 C/C++.Java.Golang.PHP.Pyth ...

  6. opensearch空查询

    query子句不支持为空的查询,可以使用filter子句:filter=area=""   或者 filter=filedlen(area)=0 可以使用相关性函数实现:https ...

  7. C# WinForm退出方法

    1.this.Close();   只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit();  强制所有消息中 ...

  8. Runnable 和 Callable的区别

    Runnable 与 Callable的区别: (1)Callable规定的方法是call(),Runnable规定的方法是run(). (2)Callable的任务执行后可返回值,而Runnable ...

  9. css多余字符显示省略号

    width:300px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; ;

  10. Android开发之ListView添加多种布局效果演示

    在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...