zoukankan      html  css  js  c++  java
  • 保卫王国

    洛谷

    ddp板子题呢

    #include<bits/stdc++.h>
    #define re return
    #define inc(i,l,r) for(int i=l;i<=r;++i) 
    using namespace std;
    template<typename T>inline void rd(T&x)
    {
        char c;bool f=0;
        while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
        x=c^48;
        while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
        if(f)x=-x;
    }
    
    #define int long long
    const int maxn=1e5+5;
    int n,m,hd[maxn],p[maxn];
    struct node{
        int to,nt;
    }e[maxn<<1];
    int k;
    inline void add(int x,int y)
    {
        e[++k].to=y;e[k].nt=hd[x];hd[x]=k;
        e[++k].to=x;e[k].nt=hd[y];hd[y]=k;
    }
    
    int siz[maxn],son[maxn],fa[maxn];
    inline void dfs1(int x)
    {
        siz[x]=1;
        for(int i=hd[x];i;i=e[i].nt)
        {
            int v=e[i].to;if(v==fa[x])continue;
            fa[v]=x;dfs1(v);
            siz[x]+=siz[v];
            if(siz[v]>siz[son[x]])son[x]=v;
        }
    }
    int tot,seg[maxn],rev[maxn],top[maxn],bot[maxn];
    inline void dfs2(int x,int fp)
    {
        seg[x]=++tot;rev[tot]=x;
        top[x]=fp; 
        if(son[x])
        {
            dfs2(son[x],fp);bot[x]=bot[son[x]];
            for(int i=hd[x];i;i=e[i].nt)
                if(!top[e[i].to])dfs2(e[i].to,e[i].to);
        }
        else bot[x]=x;
    }
    int f[maxn][2];
    inline void dp(int x)
    {
        f[x][1]=p[x],f[x][0]=0;
        for(int i=hd[x];i;i=e[i].nt)
        {
            int v=e[i].to;
            if(e[i].to==fa[x])continue;
            dp(v);
            f[x][1]+=min(f[v][0],f[v][1]);
            f[x][0]+=f[v][1];
        }
    }
    
    //-------------------------
    struct Matrix{
        int s[2][2];
        inline Matrix operator*(Matrix a)const 
        {
            Matrix ret;
            ret.s[0][0]=min(s[0][0]+a.s[0][0],s[0][1]+a.s[1][0]); 
            ret.s[0][1]=min(s[0][0]+a.s[0][1],s[0][1]+a.s[1][1]); 
            ret.s[1][0]=min(s[1][0]+a.s[0][0],s[1][1]+a.s[1][0]); 
            ret.s[1][1]=min(s[1][0]+a.s[0][1],s[1][1]+a.s[1][1]); 
            re ret;
        }
    }t[maxn<<2],tmp[maxn],be[maxn];
    const int inf=2147483647;
    #define ls rt<<1
    #define rs rt<<1|1
    inline void build(int rt,int l,int r)
    {
        if(l==r)
        {
            int x=rev[l];
            int g1=f[x][1]-min(f[son[x]][0],f[son[x]][1]),g0=f[x][0]-f[son[x]][1];
            be[l]=tmp[l]=t[rt]=(Matrix){g1,g1,g0,inf};
            re ;
        }
        
        int mid=(l+r)>>1;
        build(ls,l,mid);
        build(rs,mid+1,r);
        t[rt]=t[ls]*t[rs];
    }
    
    inline Matrix query(int rt,int l,int r,int x,int y)
    {
        if(x<=l&&r<=y)
            re t[rt];
        int mid=(l+r)>>1;
        if(y<=mid)re query(ls,l,mid,x,y);
        else if(x>mid) re query(rs,mid+1,r,x,y);
        re query(ls,l,mid,x,y)*query(rs,mid+1,r,x,y);
    }
    
    inline void Modify(int rt,int l,int r,int pos)
    {
        if(l==r)
        {
            t[rt]=tmp[l];
            re ;
        }
        int mid=(l+r)>>1;
        if(pos<=mid)Modify(ls,l,mid,pos);
        else Modify(rs,mid+1,r,pos);
        t[rt]=t[ls]*t[rs];
    }
    
    inline Matrix Get_mat(int x){re query(1,1,n,seg[top[x]],seg[bot[x]]);}
    
    inline void modify(int x,int y)
    {
        if(y)tmp[seg[x]].s[0][0]=tmp[seg[x]].s[0][1]=inf;
        else tmp[seg[x]].s[1][0]=inf;
        while(x)
        {
            Matrix a=Get_mat(x);Modify(1,1,n,seg[x]);
            Matrix b=Get_mat(x);
            x=fa[top[x]];
            if(!x)re ;
             tmp[seg[x]].s[0][1]=(tmp[seg[x]].s[0][0]+=min(b.s[1][0],b.s[0][0])-min(a.s[1][0],a.s[0][0]));
             tmp[seg[x]].s[1][0]+=b.s[0][0]-a.s[0][0];
        }
    }
    
    inline void rebuild(int x)
    {
        while(x)
        {
            tmp[seg[x]]=be[seg[x]];
            Modify(1,1,n,seg[x]);
            x=fa[top[x]];
        }
    }
    #undef int
    int main()
    {
        #define int long long
    //    freopen("in.txt","r",stdin);
        int x,y;
        char TY[4];
        rd(n),rd(m);
        scanf("%s",TY);
        inc(i,1,n)rd(p[i]);
        inc(i,2,n)
        {
            rd(x),rd(y);
            add(x,y);
        }
        dfs1(1);dfs2(1,1);dp(1);build(1,1,n);
        
        int a,b;
        inc(i,1,m)
        {
            rd(a),rd(x),rd(b),rd(y);
            x^=1;y^=1;
            if(x&&y&&(fa[a]==b||fa[b]==a))puts("-1");
            else
            {
                modify(a,x);modify(b,y);
                Matrix ans=Get_mat(1);
                int now=min(ans.s[1][0],ans.s[0][0]);
                printf("%lld
    ",now); 
                rebuild(a);rebuild(b);        
            }
        }
        re 0;
    } 
  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/lsyyy/p/11760442.html
Copyright © 2011-2022 走看看