树链剖分+O(n)的差分求最值,不幸低于暴力
查看原帖
树链剖分+O(n)的差分求最值,不幸低于暴力
241036
Afoat楼主2020/10/3 21:00

debug失败

非常难受

伸手求助

#include <bits/stdc++.h>
using namespace std;
int n,k;
struct Node
{
    int dep;
    int st;
    int hson;
    int top;
    int size;
    int fat;
    int dfn;
}node[50001];
struct Edge
{
    int des;
    int next;
}edge[100001];
int cnt;
int cnl;
inline void add(int a,int b)
{
    cnt++;
    edge[cnt].des=b;
    edge[cnt].next=node[a].st;
    node[a].st=cnt;
    return;
}
void dfs1(int poi,int upon,int depth)
{
    int vll=0;
    node[poi].size=1;
    node[poi].fat=upon;
    node[poi].dep=depth;
    for(int i=node[poi].st;i!=0;i=edge[i].next)
    {
        int flag=edge[i].des;
        if(flag!=upon)
        {
            dfs1(flag,poi,depth+1);
            node[poi].size+=node[flag].size;
            if(node[flag].size>vll)
            {
                vll=node[flag].size;
                node[poi].hson=flag;
            }
        }
    }
    return;
}
void dfs2(int poi)
{
    if(node[node[poi].fat].hson!=poi)
    {
        node[poi].top=poi;
    }
    else
    {
        node[poi].top=node[node[poi].fat].top;
    }

    cnl++;
    node[poi].dfn=cnl;

    if(node[poi].hson!=0)
    {
        dfs2(node[poi].hson);
        for(int i=node[poi].st;i!=0;i=edge[i].next)
        {
            int flag=edge[i].des;
            if(flag!=node[poi].hson&&flag!=node[poi].fat)
            {
                dfs2(flag);
            }
        }
    }

    return;
}
int tee[50001];
void Insert(int s,int r)
{
    while(node[s].top!=node[r].top)
    {
        if(node[s].dep>=node[r].dep)
        {
            tee[node[node[s].top].dfn]++;
            tee[node[s].dfn+1]--;
            s=node[node[s].top].fat;
        }
        else
        {
            tee[node[node[r].top].dfn]++;
            tee[node[r].dfn+1]--;
            r=node[node[r].top].fat;
        }
    }

    if(s!=r)
    {
        if(node[s].dep>node[r].dep)
        {
            tee[node[r].dfn]++;
            tee[node[s].dfn+1]--;
        }
        else
        {
            tee[node[s].dfn]++;
            tee[node[r].dfn+1]--;
        }
    }
    else
    {
        tee[node[s].dfn]++;
        tee[node[s].dfn+1]--;
    }
    return;
}
int main()
{
    scanf("%d %d",&n,&k);
    for(int i=1;i<n;i++)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        add(a,b);
        add(b,a);
    }

    dfs1(1,1,1);
    dfs2(1);

    for(int i=1;i<=k;i++)
    {
        int s,t;
        scanf("%d %d",&s,&t);
        Insert(s,t);
    }

    int maxn=-1e9;
    for(int i=1;i<=n;i++)
    {
        tee[i]+=tee[i-1];
        maxn=max(maxn,tee[i]);
        printf("%d ",tee[i]);
    }

    // printf("%d\n",maxn);
    // system("pause");
    return 0;
}
2020/10/3 21:00
加载中...