zoukankan      html  css  js  c++  java
  • BZOJ3331 BZOJ2013 压力

    考前挣扎

    圆方树这么早就出现了嘛。。。

    要求每个点必须被经过的次数 所以就是路径上的割点/端点++

    由于圆方树上所有非叶子圆点都是割点 所以就是树上差分就可以辣。

    实现的时候出了一点小问题。

    就是这里

    if(low[y] == dfn[x])
    {
        int r = ++poi,w;
        do
        {
            w = stk.top(); stk.pop();
            att(r,w);//printf("QAQ");
        }while(w!=y);
        att(r,x);
    }
    if(low[y] == dfn[x])
    {
        int r = ++poi;
        while(stk.top()!=x)
        {
            int w = stk.top(); stk.pop();
            att(r,w);//printf("QAQ");
        }
        att(r,x);
    }

    后面这个是错哒 因为x与y之间可以有别的未弹栈的点的qwq

    要注意!

    //Love and Freedom.
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<stack>
    #define ll long long
    #define inf 20021225
    #define mxn 210000
    using namespace std;
     
    struct edge{int to,lt;}e[mxn<<1],t[mxn<<2];
    int in[mxn],cnt,it[mxn<<1],tnt,poi;
    void add(int x,int y)
    {
        e[++cnt].to = y; e[cnt].lt=in[x]; in[x] = cnt;
        e[++cnt].to = x; e[cnt].lt=in[y]; in[y] = cnt;
    }
     
    void att(int x,int y)
    {
        t[++tnt].to = y; t[tnt].lt=it[x]; it[x] = tnt;
        t[++tnt].to = x; t[tnt].lt=it[y]; it[y] = tnt;
    }
     
    int dfn[mxn],low[mxn],tot;
    stack<int> stk;
    void dfs(int x)
    {
        dfn[x] = low[x] = ++tot; stk.push(x);
        for(int i=in[x];i;i=e[i].lt)
        {
            int y = e[i].to;
            if(dfn[y])  low[x] = min(low[x],dfn[y]);
            else
            {
                dfs(y);
                if(low[y] == dfn[x])
                {
                    int r = ++poi,w;
                    do
                    {
                        w = stk.top(); stk.pop();
                        att(r,w);//printf("QAQ");
                    }while(w!=y);
                    att(r,x);
                }
                low[x] = min(low[x],low[y]);
            }
        }
    }
    int key[mxn<<1],ans[mxn<<1],fa[mxn][20];
    int dep[mxn<<1];
    void build(int x,int f)
    {
        dep[x] = dep[f]+1;
        for(int i=1;i<20;i++)
            fa[x][i] = fa[fa[x][i-1]][i-1];
        for(int i=it[x];i;i=t[i].lt)
        {
            int y = t[i].to;
            if(y == f)  continue;
            fa[y][0] = x;build(y,x);
        }
    }
     
    void dfs(int x,int f)
    {
        //if(x<=n)   dis[x] = dis[f] +1;
        //else  dis[x] = dis[f];
        //int flag = 0;
        for(int i=it[x];i;i=t[i].lt)
        {
            int y = t[i].to; if(y==f)   continue;
            dfs(y,x); ans[x] += ans[y];
        }
        ans[x] += key[x];
        //if(!flag) dis[x] --;
    }
     
    int lca(int x,int y)
    {
        if(dep[x] < dep[y])  swap(x,y);
        int del = dep[x] - dep[y];
        for(int i=19;~i;i--)    if(del&(1<<i))
            x = fa[x][i];
        //printf("%d %d
    ",dep[x],dep[y]);
        if(x==y)    return x;
        for(int i=19;~i;i--)    if(fa[x][i]!=fa[y][i])
            x=fa[x][i],y=fa[y][i];
        //printf("%d
    ",x);
        return fa[x][0];
    }
     
    int main()
    {
        int n,m,q,x,y;
        scanf("%d%d%d",&n,&m,&q);
        poi = n;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            add(x,y);
        }
        dfs(1); build(1,1);
        //printf("%d
    ",poi);
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&x,&y);
            key[x]++; key[y]++;
            int LCA = lca(x,y);
            key[fa[LCA][0]]--;
            key[LCA]--;
        }
        dfs(1,1);
        for(int i=1;i<=n;i++)
            printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    python time 转换&运算tips
    Web.py session用户认证
    简单的内存池实现gko_alloc
    cpp(第十章)
    cpp(第九章)
    cpp(第八章)
    cpp(第七章)
    cpp(第六章)
    cpp(第五章)
    结构中的位字段
  • 原文地址:https://www.cnblogs.com/hanyuweining/p/10321873.html
Copyright © 2011-2022 走看看