BZOJ传送门

Luogu传送门

题目:给你一棵树,给你n个询问,每个询问要求输出$\sum_{i=l}^{r}depth(LCA(i,z))$

细看看其实没有想象的那么难

大体思路:

1、对于每个询问,考虑打差分变成$\sum_{i=0}^{r}depth(LCA(i,z))-\sum_{i=0}^{l-1}depth(LCA(i,z))$

2、那么这里就是一个思考点了

如何表示$\sum_{i=0}^{p}depth(LCA(i,z))$?

我也不知道

这种时候就该换一个角度思考了

啥是深度?

不就是从根到他有几个点嘛

对于两个点i,j

从i向根的路径上+1

那么$query(root,j)$就是要求的$dep(LCA(i,j))$了

到这里思路就差不多出来了

①把每个询问分成两个,打差分

②排序询问,逐个插入$add(i,root,1)$

③每个询问查出$query(z,root)$

好了答案出来了

#include<cstdio>
#include<algorithm>
using std::sort;
#define mo 201314
)%mo;}
int n,m;
struct sumireko
{
    int to,ne;
}e[];
],ecnt;
void addline(int f,int t)
{
    e[++ecnt].to=t;
    e[ecnt].ne=he[f];
    he[f]=ecnt;
}

],hop[],size[],dson[],llen[],dep[],idn[],idnar;
void dfs1(int x)
{
    size[x]=;
    ;
    for(int i=he[x],t;i;i=e[i].ne)
    {
        t=e[i].to;
        dfs1(t);
        size[x]+=size[t];
        if(lin<size[t])
        {
            lin=size[t];
            dson[x]=t;
        }
    }
}

void dfs2(int x,int top)
{
    idn[x]=++idnar;
    hop[x]=top;
    llen[top]++;
    if(!dson[x]) return;
    dfs2(dson[x],top);
    for(int i=he[x],t;i;i=e[i].ne)
    {
        t=e[i].to;
        if(t==dson[x]) continue;
        dfs2(t,t);
    }
}

struct usami
{
    int f,id,r,z;
    void set(int u,int i,int o,int p){f=u,id=i,r=o,z=p;}
    bool friend operator < (usami a,usami b)
    {
        return a.r<b.r;
    }
}qqq[];
int qcnt;

];

struct segtree
{
    ],del[],size[];
    void build(int px,int pl,int pr)
    {
        if(pl==pr)
        {
            size[px]=;
            return;
        }
        ;
        build(px<<,pl,mid);
        build(px<<|,mid+,pr);
        size[px]=size[px<<]+size[px<<|];
    }
    void fuckup(int px,int pl,int pr)
    {
        if(pl==pr) return;
        v[px]=v[px<<]+v[px<<|];
        MOD(v[px]);
    }
    void fuckdown(int px,int pl,int pr)
    {
        if(pl==pr) return;
        if(del[px])
        {
            v[px<<]+=del[px]*size[px<<];MOD(v[px<<]);
            del[px<<]+=del[px];MOD(del[px<<]);
            v[px<<|]+=del[px]*size[px<<|];MOD(v[px<<|]);
            del[px<<|]+=del[px];MOD(del[px<<|]);
            del[px]=;
        }
    }
    void add(int px,int pl,int pr,int vin,int ql,int qr)
    {
        if(ql<=pl&&qr>=pr)
        {
            v[px]+=vin*size[px];
            del[px]+=vin;
            MOD(v[px]);
            MOD(del[px]);
            return;
        }
        fuckdown(px,pl,pr);
        ;
        ,pl,mid,vin,ql,qr);
        |,mid+,pr,vin,ql,qr);
        fuckup(px,pl,pr);
    }
    int query(int px,int pl,int pr,int ql,int qr)
    {
        if(ql<=pl&&qr>=pr) return v[px];
        fuckdown(px,pl,pr);
        ;
        ;
        ,pl,mid,ql,qr),MOD(ret);
        |,mid+,pr,ql,qr),MOD(ret);
        return ret;
    }
}tr;

void inp(int x)
{
    ])
    {
        tr.add(,,n,,idn[hop[x]],idn[x]);
        x=fa[hop[x]];
    }
    tr.add(,,n,,idn[],idn[x]);
}

void qq(int x,int id,int f)
{
    ;
    ])
    {
        prt+=tr.query(,,n,idn[hop[x]],idn[x]);
        MOD(prt);
        x=fa[hop[x]];
    }
    prt+=tr.query(,,n,idn[],idn[x]);
    MOD(prt);
    ans[id]+=f*prt;
    MOD(ans[id]);
}

int main()
{
    scanf("%d%d",&n,&m);
    ;i<n;i++) scanf("%d",&fa[i]),addline(fa[i],i);
    dep[]=;
    dfs1();
    dfs2(,);
    tr.build(,,n);
    ,lin,rin,zin;i<=m;i++)
    {
        scanf("%d%d%d",&lin,&rin,&zin);
        qqq[++qcnt].,i,lin-,zin);
        qqq[++qcnt].,i,rin,zin);
    }
    sort(qqq+,qqq+qcnt+);
    ;
    ;i<=qcnt;i++)
    {
        while(tinar<qqq[i].r) {tinar++;inp(tinar);}
        qq(qqq[i].z,qqq[i].id,qqq[i].f);
    }
    ;i<=m;i++)
    printf("%d\n",ans[i]);
    ;
}

精污代码慎入

[LNOI2014]LCA(树链剖分)的更多相关文章

  1. [BZOJ3626] [LNOI2014]LCA(树链剖分)

    [BZOJ3626] [LNOI2014]LCA(树链剖分) 题面 给出一棵N个点的树,要求支持Q次询问,每次询问一个点z与编号为区间[l,r]内的点分别求最近公共祖先得到的最近公共祖先深度和.N, ...

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

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

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

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

  4. BZOJ3626[LNOI2014]LCA——树链剖分+线段树

    题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q次询问,每次询 ...

  5. bzoj 3626 : [LNOI2014]LCA (树链剖分+线段树)

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...

  6. 【bzoj3626】[LNOI2014]LCA 树链剖分+线段树

    题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q次询问,每次询 ...

  7. BZOJ 3626: [LNOI2014]LCA 树链剖分 线段树 离线

    http://www.lydsy.com/JudgeOnline/problem.php?id=3626 LNOI的树链剖分题没有HAOI那么水,学到的东西还是很多的. 我如果现场写,很难想出来这种题 ...

  8. BZOJ 3626 [LNOI2014]LCA ——树链剖分

    思路转化很巧妙. 首先把询问做差分. 然后发现加入一个点就把路径上的点都+1,询问的时候直接询问到根的路径和. 这样和原问题是等价的,然后树链剖分+线段树就可以做了. #include <map ...

  9. bzoj3626 [LNOI2014]LCA——树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3626 思路很巧妙,把区间换成前缀和相减: 把 l ~ r 到根路径上的点的点权都+1,然后 ...

  10. 洛谷 P4211 [LNOI2014]LCA (树链剖分+离线)

    题目:https://www.luogu.org/problemnew/solution/P4211 相当难的一道题,其思想难以用言语表达透彻. 对于每个查询,区间[L,R]中的每个点与z的lca肯定 ...

随机推荐

  1. 依赖注入【转自知乎 PHP】

    第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒…… 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 <img src="https://pic1 ...

  2. Swing的Look And Feel机制研究

    首先,参考了一下这篇文章 里面提到需要自己Override L&F的initClassDefaults方法,但是查看了一下NimbusLookAndFeel, 发现它为了没有实现initCla ...

  3. jquery uploadify在谷歌浏和火狐下无法上传的解决方案(.Net版)

    在项目紧张的进行过程中,jquery uploadify上传不兼容的问题一直没有试着去解决,只幻想着用ie的人越来越多,怎么奈何firefox4刚推出,就有4000万的下载.......仰天长叹,记生 ...

  4. 洛谷 P2822 [ NOIP 2017 ] 组合数问题 —— 数学

    题目:https://www.luogu.org/problemnew/show/P2822 阶乘太大,算不了: 但 k 只有 8 个质因子嘛,暴力60分: #include<iostream& ...

  5. 洛谷P1514 引水入城——dfs

    题目:https://www.luogu.org/problemnew/show/P1514 搜索+DP: 自己想出来的方法第一次80分好高兴! 再改了改就A了,狂喜乱舞: 也就是 dfs,仔细一想第 ...

  6. 【高德地图API】地理编码与逆地理编码

    一.地理编码 该功能实现地理编码服务,即地址匹配,从已知的地址描述到对应的经纬度坐标的转换,即根据地址信息,查询该地址所对应的点坐标等,地址(address) 为必选项,城市(city)为可选项. & ...

  7. 解决Error for wireless request "Set Mode" (8B06) 问题 (转载)

    转自:http://blog.csdn.net/muge0913/article/details/17062871 在运行以下命令的时候,意外的出错,最后google了下,最终才确定了原因,因为在运行 ...

  8. post和get区别,其他答案真的太坑

    原理: get和post都是http定义与服务器交互的方法,还有put,delete url是网络上的资源,那么http中的get,post,put,delete对应的就是对这个资源的查,改,增,删四 ...

  9. servlet setCharacterEncoding setHeader 设置字符区别

    1. response.setCharacterEncoding("UTF-8"); 设置内容的字符集 2. response.setHeader("content-ty ...

  10. 组合数学题 Codeforces Round #108 (Div. 2) C. Pocket Book

    题目传送门 /* 题意:每一次任选i,j行字符串进行任意长度前缀交换,然后不断重复这个过程,问在过程中,第一行字符串不同的个数 组合数学题:每一列不同的字母都有可能到第一行,所以每列的可能值相乘取模就 ...