题目链接http://xcacm.hfut.edu.cn/problem.php?id=1103

题目大意:链更新。链查询,求树链的最大子段和。(子段可以为空)

解题思路

将所有Query离线存储,并且注明哪个是更新,哪个是查询。

Tarjan离线处理中,记录每个结点的前驱,p[v]=u。

若更新,从u点回溯到LCA,从v点回溯到LCA,逐个修改。

若查询,将u点回溯到LCA,LCA,v点回溯到LCA的倒序拼成一个序列,求最大子段和。

值得注意的是,子段和全为负值的时候,ans=max(0,ans),即不要任何插线板(原题意思不明)。

#include "cstdio"
#include "cstring"
#include "vector"
#include "algorithm"
using namespace std;
#define maxn 100005
#define inf 0x3f3f3f3f
int head[maxn],qhead[maxn],lag[maxn],kth[maxn],tot1,tot2,f[maxn],vis[maxn],ancestor[maxn],p[maxn],s1[maxn],s2[maxn];
bool isUpdate[maxn];
struct Edge
{
    int to,next;
}e[maxn*];
struct Query
{
    int from,to,next,idx,c;
}q[maxn*];
void addedge(int u,int v)
{
    e[tot1].to=v;
    e[tot1].next=head[u];
    head[u]=tot1++;
}
void addquery(int u,int v,int idx,int c=inf)
{
    q[tot2].from=u;
    q[tot2].to=v;
    q[tot2].next=qhead[u];
    q[tot2].idx=idx;
    if(c!=inf) q[tot2].c=c;
    qhead[u]=tot2++;
}
int find(int x) {return x!=f[x]?f[x]=find(f[x]):x;}
void Union(int u,int v)
{
    u=find(u),v=find(v);
    if(u!=v) f[v]=u;
}
void LCA(int u)
{
    vis[u]=true;
    f[u]=u;
    ;i=e[i].next)
    {
        int v=e[i].to;
        if(!vis[v])
        {
            p[v]=u;
            LCA(v);
            Union(u,v);
        }
    }
    ;i=q[i].next)
    {
        int v=q[i].to;
        if(vis[v]) ancestor[q[i].idx]=find(v);
        //or storage e[i].lca=e[i^1].lca=find(v)
    }
}
int sum(int num)
{
    s2[]=s1[];
    ];
    ; i<num; i++)
    {
        ]>) s2[i]=s2[i-]+s1[i];
        else s2[i]=s1[i];
        if(s2[i]>Max) Max=s2[i];
    }
    ,Max);
}
int main()
{
    //freopen("in.txt","r",stdin);
    ;
    scanf("%d",&n);
    tot1=tot2=;
    memset(head,-,sizeof(head));
    memset(qhead,-,sizeof(qhead));
    memset(vis,,sizeof(vis));
    memset(isUpdate,,sizeof(isUpdate));
    ;i<=n;i++) scanf("%d",&lag[i]);
    ; i<n-; i++)
    {
        scanf("%d%d",&u,&v);
        addedge(u,v);
        addedge(v,u);
    }
    scanf("%d",&m);
    ; i<m; i++)
    {
        scanf("%d",&cmd);
        )
        {
            scanf("%d%d%d",&u,&v,&c);
            addquery(u,v,i,c);
            addquery(v,u,i,c);
            isUpdate[i]=true;
        }
        else
        {
            scanf("%d%d",&u,&v);
            addquery(u,v,i);
            addquery(v,u,i);
        }
    }
    LCA();
    vector<int> ans;
    ; i<tot2; i=i+)
    {
        int u=q[i].from,v=q[i].to,idx=q[i].idx;
        ;
        if(isUpdate[qcnt])
        {
            int c=q[i].c;
            while(u!=ed) lag[u]=c,u=p[u];
            lag[ed]=c;
            while(v!=ed) lag[v]=c,v=p[v];
        }
        else
        {
            while(u!=ed) s1[cnt++]=lag[u],u=p[u];
            s1[cnt++]=lag[ed];
            vector<int> rev;
            while(v!=ed) rev.push_back(lag[v]),v=p[v];
            ; j>=; j--) s1[cnt++]=rev[j];
            int x=sum(cnt);
            ans.push_back(x);
        }
        qcnt++;
    }
    ;i<ans.size()-;i++) printf("%d ",ans[i]);
    printf(]);
}

XCOJ 1103 (LCA+树链最大子段和)的更多相关文章

  1. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  2. Codeforces Round #329 (Div. 2) D. Happy Tree Party LCA/树链剖分

    D. Happy Tree Party     Bogdan has a birthday today and mom gave him a tree consisting of n vertecie ...

  3. HDU 3078 (LCA+树链第K大)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3078 题目大意:定点修改.查询树中任意一条树链上,第K大值. 解题思路: 先用离线Tarjan把每个 ...

  4. BZOJ 3626: [LNOI2014]LCA( 树链剖分 + 离线 )

    说多了都是泪啊...调了这么久.. 离线可以搞 , 树链剖分就OK了... -------------------------------------------------------------- ...

  5. [CodeVS2370] 小机房的树 (LCA, 树链剖分, LCT)

    Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花 ...

  6. hdu Dylans loves tree [LCA] (树链剖分)

    Dylans loves tree view code#pragma comment(linker, "/STACK:1024000000,1024000000") #includ ...

  7. 【BZOJ-3626】LCA 树链剖分

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1428  Solved: 526[Submit][Status ...

  8. Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST

    E. Minimum spanning tree for each edge   Connected undirected weighted graph without self-loops and ...

  9. poj 3237 Tree [LCA] (树链剖分)

    poj 3237 tree inline : 1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高. 2. 很明显,类 ...

随机推荐

  1. 简单实用的Log4net帮助类

    一直使用Log4net,进行日志记录.今天把实用的帮助类,在博客园进行一下公布 首先,添加一个log4net配置文件 <?xml version="1.0"?> < ...

  2. hashicorp/consul

    https://github.com/hashicorp/consul/tree/master/vendor/github.com/boltdb/bolt

  3. 《我是一只IT小小鸟》读书笔记

    大一进来的第一个学期 我对我所读的软件工程专业感到迷茫与不知.就这么昏昏沉沉的度过了一个学期,第二个学期一开始,在上第一节新增加的“大学生创业与指导”课程充满了好奇,在课上老师推荐的一本书<我是 ...

  4. Android中pullToRefresh使用

    pullToRefresh的导入 首先,点击new按钮 -> import Module 然后在 New Module界面选择已经在本地的含有源代码的pullToRefresh. 打开如下图所示 ...

  5. 【python】Python遍历dict的key最高效的方法是什么?

    来源:https://segmentfault.com/q/1010000002581747 方法一:直接遍历 速度快 for key in _dict: pass 方法二:iterkeys() 速度 ...

  6. linux上安装php+gd扩展

    515 cd zlib-1.2.3 516 ./configure --prefix=/usr/local/zlib2 517 make && make install 518 cd ...

  7. .Net AppDomain.CurrentDomain.AppendPrivatePath(@&quot;Libs&quot;);

    今天就说说.Net中通过反射取得某个类型时,我们怎么知道这个类型在硬盘上的哪个角落?比如说,假如我们需要要求服务端动态载入某个数据源,那服务端怎么知道数据源在哪?网上大部分的教程都写着,可以使用Ass ...

  8. Azure平台 对Twitter 推文关键字进行实时大数据分析

    Learn how to do real-time sentiment analysis of big data using HBase in an HDInsight (Hadoop) cluste ...

  9. 论文笔记之:MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching

    MatchNet: Unifying Feature and Metric Learning for Patch-Based Matching CVPR  2015 本来都写到一半了,突然笔记本死机了 ...

  10. python命令行下tab键补全命令

    在python命令行下不能使用tab键将命令进行补全,手动输入又很容易出错. 解决:tab.py #/usr/bin/env python # -*- coding:utf-8 -*- ''' 该模块 ...