zoukankan      html  css  js  c++  java
  • NOIP 模拟 $28; m 割海成路之日$

    题解 (by;zjvarphi)

    用两个集合分别表示 (1) 边联通块,(1,2) 边联通块 。

    ( m son_x) 表示当前节点通过 (3) 类边能到的 (2) 联通块的数量,(tw) 表示当前节点 (2) 联通块的大小。

    这些都可以预处理出来,最后在计算答案时不要忘了加上父亲的贡献。

    最后因为并查集只有合并而没有拆开,所以复杂度为 (mathcal O m (nlogn))

    Code
    #include<bits/stdc++.h>
    #define ri register signed
    #define p(i) ++i
    using namespace std;
    namespace IO{
        char buf[1<<21],*p1=buf,*p2=buf,OPUT[100];
        #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++;
        template<typename T>inline void read(T &x) {
            ri f=1;x=0;register char ch=gc();
            while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
            while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
            x=f?x:-x;
        }
        template<typename T>inline void print(T x,char t) {
            if (x<0) putchar('-'),x=-x;
            if (!x) return putchar('0'),(void)putchar(t);
            ri cnt(0);
            while(x) OPUT[p(cnt)]=x%10,x/=10;
            for (ri i(cnt);i;--i) putchar(OPUT[i]^48);
            return (void)putchar(t);
        }
    }
    using IO::read;using IO::print;
    namespace nanfeng{
        #define FI FILE *IN
        #define FO FILE *OUT
        template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
        template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
        static const int N=3e5+7;
        int first[N],w[N],f[N],tw[N],son[N],n,m,t=1;
        struct edge{int v,nxt,w;}e[N<<1];
        inline void add(int u,int v,int w) {
            e[t].v=v,e[t].w=w,e[t].nxt=first[u],first[u]=t++;
            e[t].v=u,e[t].w=w,e[t].nxt=first[v],first[v]=t++;
        }
        struct UDS{
            int fa[N];  
            UDS(){for (ri i(1);i<=N-7;p(i)) fa[i]=i;}
            int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
        }O,T;
        void dfs(int x,int fa) {
            tw[x]=1;
            for (ri i(first[x]),v;i;i=e[i].nxt) {
                if ((v=e[i].v)==fa) continue;
                f[v]=x,w[v]=e[i].w;
                dfs(v,x);
                if (w[v]==1) {
                    O.fa[v]=x;
                    son[x]+=son[v];
                }
                if (w[v]!=3) {
                    T.fa[v]=x;
                    tw[x]+=tw[v];
                }
                if (w[v]==3) son[x]+=tw[v];
            }
        }
        inline void solve2(int u,int v) {
            int k=O.find(u);
            O.fa[v]=u;
            son[k]+=son[v];
        }
        inline void solve3(int u,int v) {
            int k=O.find(u);
            son[k]-=tw[v];
            u=T.find(u);
            T.fa[v]=u;
            tw[u]+=tw[v];
            k=O.find(f[u]);
            if (w[u]==3&&k) son[k]+=tw[v];
        }
        inline int check(int u,int v) {
            return O.find(f[T.find(v)])==O.find(u)||T.find(f[O.find(u)])==T.find(v)
            ||T.find(u)==T.find(v);
        }
        inline int count(int x) {
            int ans=tw[T.find(x)]+son[O.find(x)];
            x=O.find(x);    
            if (w[x]==3) ans+=tw[T.find(f[x])];
            return ans;    
        } 
        inline int main() {
            //FI=freopen("nanfeng.in","r",stdin);
            //FO=freopen("nanfeng.out","w",stdout);
            read(n),read(m);
            for (ri i(1),u,v,nw;i<n;p(i)) read(u),read(v),read(nw),add(u,v,nw);
            dfs(1,0);
            for (ri i(1),u,v,a,b;i<=m;p(i)) {
                read(u),read(v),read(a),read(b);
                if (f[v]!=u) swap(u,v);
                if (w[v]==2) solve2(u,v);
                else if (w[v]==3) solve3(u,v);
                --w[v];
                print(check(a,b),' '),print(count(a),'
    ');       
            }
            return 0;
        }
    }
    int main() {return nanfeng::main();}
    
  • 相关阅读:
    129. Sum Root to Leaf Numbers
    113. Path Sum II
    114. Flatten Binary Tree to Linked List
    112. Path Sum
    100. Same Tree
    300. Longest Increasing Subsequence
    72. Edit Distance
    自定义js标签库
    JS 实现Table相同行的单元格自动合并示例代码
    mysql 高版本only_full_group_by 错误
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/15085964.html
Copyright © 2011-2022 走看看