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. Spring学习十一----------Bean的配置之基于Java的容器注解@Bean

    © 版权声明:本文为博主原创文章,转载请注明出处 @Bean -@Bean标识一个用于配置和初始化一个由SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/> -可 ...

  2. xcode常见报错调试【原创】

    BMKGeoCodeSearch 反向地理编码一直失败 Location 申请的key的安全码与代码中build id不一样,修改成一样就OK了 新建一个类,将百度地图的定位功能封装起来以后,定位的代 ...

  3. 在PHP中,通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。如果要转换文件大小的单位,可以自己定义函数来实现。

    <?php function getsize($size, $format) { $p = 0; if ($format == 'kb') { $p = 1; } elseif ($format ...

  4. XMPP资源绑定(Resource Binding)

    一个XMPP的账号由三部分组成: 用户名(user/node),域名(domain)和资源(resource) .例如 alice@xmpp.irusher.com/mobile ,user部分(或n ...

  5. 【WPF】ComboBox:根据绑定选取、设置固定集合中的值

    问题场景 我有一个对象,里面有一个属性叫Limit,int类型.虽然int可取的范围很大,我想要在用户界面上限制Limit可取的值,暂且限制为5.10.15.20. 所以ComboBox绑定不是绑定常 ...

  6. AppICon设置

  7. cocos2d-x 3.2 for wp8-xaml应用商店提交应用时出现的API错误(不能用CreateEventExA)解决的方法

    好不easy做完一个游戏.提交到商店显示"本地API不支持CreateEventExA"之类的错误提示 于是我在整个解决方式里查找CreateEventExA,发现没有,却在Aud ...

  8. 【BZOJ1124】[POI2008]枪战Maf 贪心+思路题

    [BZOJ1124][POI2008]枪战Maf Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开 ...

  9. maven工作的过程

    1 建立各个module之间的依赖关系 2 越底层的依赖的module先生成 3 下载远程库中的依赖 4 先生成本地被依赖的module 问题是,如何保证本次module和远程库中的包不重名?

  10. The Log-Structured Merge-Tree (LSM-Tree

    https://www.cs.umb.edu/~poneil/lsmtree.pdf [Log-Structured Merge-Tree ][结构化日志归并树][要解决的问题]The   Log-S ...