这题考验我们构造模型的能力。
考虑构造一棵树,树上有3个节点,节点1和节点2连一条权值为a的边,节点1和节点3连一条权值为b的边,显然答案就是节点2到节点3的最短路径。
但这样还不够。考虑加法的性质,我们每次给节点1和节点2,节点1和节点3的连边随机加上一个数k,节点2到节点3的最短路径上所有边减去这个数k,显然答案不变。
因为要更新和查询链的信息,写个树链剖分搞搞就行了。
上代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=100002;
inline int gi(){
    int x=0,o=1;
    char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')ch=getchar(),o=-1;
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
struct edge{
    int to,w,next;
}e[MAXN<<1];
struct tree{
    int val,add;
}t[MAXN<<4];
int tot=0,head[MAXN];
void add(int u,int v,int w){
    e[++tot].to=v;e[tot].w=w;e[tot].next=head[u];head[u]=tot;
    e[++tot].to=u;e[tot].w=w;e[tot].next=head[v];head[v]=tot;
}
int a,b,cnt=0,son[MAXN],fa[MAXN],siz[MAXN],dep[MAXN],top[MAXN],id[MAXN],d[MAXN<<1][3];
void DFS1(int u,int f,int d){
    son[u]=0;fa[u]=f;siz[u]=1;dep[u]=d;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(v==f)continue;
        DFS1(v,u,d+1);
        siz[u]+=siz[v];
        if(siz[son[u]]<siz[v])son[u]=v;
    }
}
void DFS2(int u,int tp){
    top[u]=tp;id[u]=++cnt;
    if(son[u])DFS2(son[u],tp);
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(v==fa[u]||v==son[u])continue;
        DFS2(v,v);
    }
}
void pushdown(int rt,int l,int r){
    int mid=(l+r)>>1;
    t[rt<<1].add+=t[rt].add;
    t[rt<<1|1].add+=t[rt].add;
    t[rt<<1].val+=(mid-l+1)*t[rt].add;
    t[rt<<1|1].val+=(r-mid)*t[rt].add;
    t[rt].add=0;
}
void update(int rt,int l,int r,int ul,int ur,int add){
    if(ul>r||ur<l)return;
    if(ul<=l&&ur>=r){
        t[rt].add+=add;
        t[rt].val+=(r-l+1)*add;
        return;
    }
    if(t[rt].add)pushdown(rt,l,r);
    int mid=(l+r)>>1;
    update(rt<<1,l,mid,ul,ur,add);
    update(rt<<1|1,mid+1,r,ul,ur,add);
    t[rt].val=t[rt<<1].val+t[rt<<1|1].val;
}
int query(int rt,int l,int r,int ql,int qr){
    if(ql>r||qr<l)return 0;
    if(ql<=l&&qr>=r)return t[rt].val;
    if(t[rt].add)pushdown(rt,l,r);
    int mid=(l+r)>>1;
    return query(rt<<1,l,mid,ql,qr)+query(rt<<1|1,mid+1,r,ql,qr);
}
int ask(int x,int y){
    int ans=0;
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        ans+=query(1,1,cnt,id[top[x]],id[x]);
        x=fa[top[x]];
    }
    if(x==y)return ans;
    if(dep[x]>dep[y])swap(x,y);
    ans+=query(1,1,cnt,id[son[x]],id[y]);
    return ans;
}
void add_path(int x,int y,int k){
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        update(1,1,cnt,id[top[x]],id[x],k);
        x=fa[top[x]];
    }
    if(x==y)return;
    if(dep[x]>dep[y])swap(x,y);
    update(1,1,cnt,id[son[x]],id[y],k);
    return;
}
int main(){
    a=gi();b=gi();
    add(1,2,a);
    add(1,3,b);
    d[1][0]=1;d[1][1]=2;d[1][2]=a;
    d[2][0]=1;d[2][1]=3;d[2][2]=b;
    DFS1(1,0,1);
    DFS2(1,1);
    for(int i=1;i<3;i++){
        if(dep[d[i][0]]>dep[d[i][1]])swap(d[i][0],d[i][1]);
        update(1,1,cnt,id[d[i][1]],id[d[i][1]],d[i][2]);
    }
    for(int i=1;i<=1000000;i++){
        int k=rand()%2666;
        add_path(1,2,k);
        add_path(1,3,k);
        add_path(2,3,-k);
    }
    cout<<ask(2,3);
    return 0;
}

1 AC 132ms/2085kB

2 AC 132ms/2015kB

3 AC 132ms/1960kB

4 AC 132ms/1960kB

5 AC 132ms/1917kB

怎么样?是不是很快啊!拿下全站rank1不是梦!

(PS:当然,解法不止上面这一种,下面是正解:)

#include<bits/stdc++.h>
using namespace std;
int main(){
    scanf("%d%d",new int,new int);
    printf("%d",*(new int-8)+*(new int-24));
    return 0;
}

P1001 A+B Problem (树链剖分)的更多相关文章

  1. FZOJ 2176 easy problem ( 树链剖分 )

    pid=2176" target="_blank">题目链接~~> 做题感悟:感觉做多了树链剖分的题目,有很多是树链剖分 + 想法.. 解题思路: 这题非常明 ...

  2. HDU 5293 Train chain Problem - 树链剖分(树状数组) + 线段树+ 树型dp

    传送门 题目大意: 一颗n个点的树,给出m条链,第i条链的权值是\(w_i\),可以选择若干条不相交的链,求最大权值和. 题目分析: 树型dp: dp[u][0]表示不经过u节点,其子树的最优值,dp ...

  3. FZU2176---easy problem (树链剖分)

    http://acm.fzu.edu.cn/problem.php?pid=2176 Problem 2176 easy problem Accept: 9    Submit: 32Time Lim ...

  4. (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。

    Problem Description   Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...

  5. Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组

    Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...

  6. HDU 4729 An Easy Problem for Elfness(树链剖分边权+二分)

    题意 链接:https://cn.vjudge.net/problem/HDU-4729 给你n个点,然你求两个点s和t之间的最大流.而且你有一定的钱k,可以进行两种操作 1.在任意连个点之间建立一个 ...

  7. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  8. USACO 2015 December Contest, Platinum Problem Max Flow【树链剖分】

    题意比较难理解,就是给你n个点的树,然后给你m个修改操作,每一次修改包括一个点对(x, y),意味着将x到y所有的点权值加一,最后问你整个树上的点权最大是多少. 比较裸的树链剖分了,感谢Haild的讲 ...

  9. 【bzoj4999】This Problem Is Too Simple! 树链剖分+动态开点线段树

    题目描述 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x. 2. Q i j x(0<=x<2^31) ...

随机推荐

  1. [SoapUI] 怎样确定一个应答报文的格式是不是标准的JSON

    有一个网站 : http://jsonviewer.stack.hu/ 将Response的文本贴进去,如果是标准的JSON格式,就可以以JSON的view显示出来

  2. Go 网络编程笔记

    前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...

  3. 用nodejs搭建最简单、轻量化的http server(转)

    出处:http://www.cnblogs.com/wangfupeng1988/p/4143996.html 1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后 ...

  4. 【图解HTTP】第一章 了解web及网络基础

    [图解HTTP]了解Web及网络基础 Web页面是如何呈现的?根据Web浏览器地址栏中指定的URL,Web浏览器从Web服务器端获取文件资源(resource)等信息,从而显示出Web页面. 这种通过 ...

  5. 【小梅哥SOPC学习笔记】设置Eclipse在编译(build)前自动保存源代码文件

    设置Eclipse在编译(build)前自动保存源代码文件 Eclipse 常用设置之让Eclipse在编译(build)前自动保存源代码文件 一.让Eclipse在编译(build)前自动保存源代码 ...

  6. hibernate:对于java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误解决办法

    在J2EE框架下开发web网站,这种问题经常遇到,只要我们网上搜一下,就可以看到很多版本的,我整理一下:  第一种可能性解决:看看我的项目:主要 是里面的Structs 1.3 (structs 2) ...

  7. CSS选择器与jQuery选择器的异同:一些特殊的选择器

    在CSS3选择器标淮草案定义的选择器语法中,jQuery支持相当完整的一套子集,同时还添加了一些非标准但很有用的伪类.下面是一些jQuery扩展的选择器:(来自http://www.cnblogs.c ...

  8. java中介者模式

    中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改.如果使用中介者模式,只需关心和Mediator类的关系 ...

  9. django+echarts

    思路: 统一返回数据类型为json,然后前端发起Ajax请求后台数据接口 views.py def count_blog(request): # 下面等价于:select distinct auth, ...

  10. WPF判断当前窗体是否为模态

    WPF判断当前窗体是否为模态   1.使用System.Windows.Interop.ComponentDispatcher.IsThreadModal来判断 参照:https://social.m ...