首页 > 其他分享 >2023/7/5学习日记 树部分

2023/7/5学习日记 树部分

时间:2023-07-05 14:13:23浏览次数:34  
标签:int top tree mid pos 学习 void 2023 日记

学习树剖,树上差分,树剖LCA

一.P3038 [USACO11DEC] Grass Planting G

树链剖分点权转边权

#include<cstdio>
#include<algorithm>
#include<iostream>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define lson pos<<1
#define rson pos<<1|1
using namespace std;
const int maxn=1e5+1;
int n,m,tot,cnt;
int a[maxn];
int head[maxn],nxt[maxn<<1],to[maxn<<1];
int deep[maxn],size[maxn],son[maxn],fa[maxn];
int top[maxn],id[maxn],w[maxn];
int tree[maxn<<2],lazy[maxn<<2];
void add(int x,int y)
{
    to[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs1(int x,int f)
{
    deep[x]=deep[f]+1;
    size[x]=1;
    fa[x]=f;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(y==f)
            continue;
        dfs1(y,x);
        size[x]+=size[y];
        if(!son[x]||size[y]>size[son[x]])
            son[x]=y;
    }
}
void dfs2(int x,int t)
{
    id[x]=++cnt;
    w[cnt]=a[x];
    top[x]=t;
    if(!son[x])
        return;
    dfs2(son[x],t);
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(y==fa[x]||y==son[x])
            continue;
        dfs2(y,y);
    }
}
void build(int pos,int l,int r)
{
    int mid=(l+r)>>1;
    if(l==r)
    {
        tree[pos]=w[l];
        return;
    }
    build(lson,l,mid);
    build(rson,mid+1,r);
    tree[pos]=tree[lson]+tree[rson];
}
void mark(int pos,int l,int r,int k)
{
    tree[pos]+=(r-l+1)*k;
    lazy[pos]+=k;
}
void pushdown(int pos,int l,int r)
{
    int mid=(l+r)>>1;
    mark(lson,l,mid,lazy[pos]);
    mark(rson,mid+1,r,lazy[pos]);
    lazy[pos]=0;
}

void update(int pos,int l,int r,int x,int y,int k)
{
    int mid=(l+r)>>1;
    if(x<=l && r<=y)
    {
        mark(pos,l,r,k);
        return;
    }
    pushdown(pos,l,r);
    if(x<=mid)
        update(lson,l,mid,x,y,k);
    if(y>mid)
        update(rson,mid+1,r,x,y,k);
    tree[pos]=tree[lson]+tree[rson];
}

void upd_chain(int x,int y,int k)
{
    while(top[x]!=top[y])
    {
        if(deep[top[x]]<deep[top[y]])
            swap(x,y);
        update(1,1,n,id[top[x]],id[x],k);
        x=fa[top[x]];
    }
    if(deep[x]<deep[y])
        swap(x,y);
    update(1,1,n,id[y]+1,id[x],k);
}
int query(int pos,int l,int r,int x,int y)
{
    int ret=0;
    int mid=(l+r)>>1;
    if(x<=l && r<=y)
        return tree[pos];
    pushdown(pos,l,r);
    if(x<=mid)
        ret+=query(lson,l,mid,x,y);
    if(y>mid)
        ret+=query(rson,mid+1,r,x,y);
    return ret;
}
int q_chain(int x,int y)
{
    int ret=0;
    while(top[x]!=top[y])
    {
        if(deep[top[x]]<deep[top[y]])
            swap(x,y);
        ret+=query(1,1,n,id[top[x]],id[x]);
        x=fa[top[x]];
    }
    if(deep[x]<deep[y])
        swap(x,y);
    ret+=query(1,1,n,id[y]+1,id[x]);
    return ret;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs1(1,0);
    dfs2(1,1);
    build(1,1,n);
    while(m--)
    {
        char ch;
        cin>>ch;
        if(ch=='P')
        {
            int x,y;
            scanf("%d%d",&x,&y);
            upd_chain(x,y,1);
        }
        else
        {
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d\n",q_chain(x,y));
        }
    }
    return 0;
}

标签:int,top,tree,mid,pos,学习,void,2023,日记
From: https://www.cnblogs.com/luguodong/p/17528341.html

相关文章

  • 学习英语给你带来了哪些机会?
    昨天文章发出后,J姐姐给予了一些更正,我希望将来也能够像她那样走出去看一看。Y呢,并不是我说的那样混日子,了解更多之后,才发现他是个王者,顿时肃然起敬。“一起学英语”群里大佬云集,希望他们继续多多分享经验。前两天冰雪读完大神分享的《芯片战争》后,就有了很多的心得体会。我想她的开......
  • 2023年6月17号英语四六级考试倒计时,这些考前准备事项一定要注意
    2023年6月全国大学英语四六级考试将于6月17日(本周六)举行,冰雪为大家总结了四六级考前及考中注意事项,供同学们参考!考试时间四级考试时间:6月17日上午9:00-11:20六级考试时间:6月17日下午15:00-17:25考前一天复习准备:记得多看错题,建议四级考生考前一天刷一套真题,六级考生考试当天早......
  • 2023-03-01-what r u thinkin
    thesetoftricks.13671135581二项式反演\[\begin{aligned}f(n)=\sum_{i=n}^m\dbinom{i}{n}g(i)\\\rightarrowg(n)=\sum_{i=n}^m(−1)^{i-n}\dbinom{i}{n}f(i)\end{aligned}\]欧拉反演\[\begin{aligned}\sum_{d|n}\varphi(d)=n\\\righ......
  • 2023-06-04-Generating-Function-Editor
    You'regrowingdesperatefromthefight.基本策略已知系数的幂级数首先是一些可以通过整体法得到封闭形式的幂级数,所谓整体法,即是通过将幂级数位移,用自己表示自己然后做差。\[\begin{aligned}\left\langle1,1,1,1,1,\dots\right\rangle&\rightarrow\frac{1}{1......
  • 2023-05-20-Probability-Generating-Function
    It'stimetorollthedice.\(\mathtt{Definition}\)令\(X\)为取值非负的随机变量,那么\(X\)的概率生成函数\(\mathtt{Probability\Generating\Function}\)为\[\begin{aligned}G_x(z)=\sum_{k\ge0}\mathrm{Pr}(X=k)z^k\end{aligned}\]根据上式可以得知......
  • 2023-05-02-Unit-Root-Inversion
    Andtryingtofigureoutwhatit'slikemovingon.Summary\[[n\midk]=\frac{1}{n}\sum_{i=0}^{n-1}\omega^{ik}_{n}\]九个太阳\[\begin{aligned}&\sum_{i=0}^{n}\binom{n}{i}\frac{1}{k}\sum_{j=0}^{k-1}\omega_{k}^{ij}\......
  • 2023-04-27-LinerProgramming
    开始吟唱问题引入定义线性规划是在一组线性约束条件下,求一线性目标函数最大或最小的问题。标准形式要求目标函数要求\(\max\)约束条件均为等式决策变量为非负约束形式\[\begin{matrix}\maxz=\sum_{j=1}^{n}c_jx_j\\s.t\begin{cases}\sum_{j......
  • 2023-03-24-CQ 2023 省选前考试记录
    Ihopeitwasenoughtobethewayyouarewheneverything'sfallingapart.2023-03-27我是......
  • 2023-03-24-CQ 2023 省选前复习记录
    伝えに来たよ傷跡を辿ってそれならもう恐れるものはないんだと.CF449D看来我确实只会做板题/kk。一个很naive的想法是定义\(dp_{i,x}\)表示当前到了第\(i\)位,与起来的值为\(x\)的方案数,显然这个做不下去,因为状态数会有重叠,并且这复杂度会爆。一个不那么naiv......
  • 2023-03-17- 后缀自动机
    我直接忽略掉这个玩意的原理。或许我应该从自动机开始,更确切地说我应该从确定有限状态自动机(\(DFA\))开始。\(\mathbb{DFA}\)\(\mathtt{Definition}\)首先给出一些前置的定义。\(Q\),有限状态集合。\(\Sigma\),有限字符集。\(\delta\),转移函数,\(Q\timesE\rightarrow......