hdu5458 LCA+并查集+dfs序+树状数组

神题,看着别人代码学习

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
typedef long long LL;
typedef unsigned long long ULL;

#define rep(i,k,n) for(int i=(k);i<=(n);i++)
#define rep0(i,n) for(int i=0;i<(n);i++)
#define red(i,k,n) for(int i=(k);i>=(n);i--)
#define sqr(x) ((x)*(x))
#define clr(x,y) memset((x),(y),sizeof(x))
#define pb push_back
#define mod 1000000007
const int maxn=30010;
const int maxq=100010;
const int N=15;

int n,m,q;
int fa[maxn][N];
int beg[maxn],ed[maxn],dtime,dep[maxn],ans[maxq];

struct edge
{
    int to,del;
    edge(int x):to(x),del(0){}
    bool operator < (const edge &x) const
    {
        if(to!=x.to)return tox.del;
    }
};

vector e[maxn];

struct QUERY
{
    int op,u,v;
    void read()
    {
        scanf("%d%d%d",&op,&u,&v);
        if(op==1)
        {
            lower_bound(e[u].begin(),e[u].end(),edge(v))->del=1;
            lower_bound(e[v].begin(),e[v].end(),edge(u))->del=1;
        }
    }
}Q[maxq];

struct BIT
{
    int v[maxn];
    void init()
    {
        clr(v,0);
    }
    void add(int x,int k)
    {
        for(;x<=n;x+=x&-x)v[x]+=k;
    }
    void update(int L,int R,int k)
    {
        add(L,k);
        add(R+1,-k);
    }
    int qry(int x)
    {
        int ret=0;
        for(;x;x-=x&-x)ret+=v[x];
        return ret;
    }
}B;

void dfs(int u,int F,int deep)
{
    if(F)e[u].erase(lower_bound(e[u].begin(),e[u].end(),edge(F)));
    beg[u]=++dtime;
    dep[u]=deep;
    fa[u][0]=F;

    for(int i=0;i=0;i--)
    {
        if(fa[u][i]!=fa[v][i])
        {
            u=fa[u][i];
            v=fa[v][i];
        }
    }
    return fa[u][0];
}

struct UNION
{
    int f[maxn];
    void init()
    {
        rep(i,1,n)f[i]=i;
        rep(i,1,n)for(int j=0;j


你可能感兴趣的:(hdu5458 LCA+并查集+dfs序+树状数组)