zoukankan      html  css  js  c++  java
  • [Agc008F]Black Radius

    [AGC008F] Black Radius

    Description

    给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1
    "全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为N的字符串s的形式给到你,具体一点就是对于1<=i<=N,si=1表示"全"喜欢节点i,为0表示"全"不喜欢节点i一开始的时候,所有的节点都是白色的,"全"会进行以下操作恰好一次:选择一个他喜欢的节点v和一个非负整数d,然后将所有与节点v距离不超过d的节点全部涂黑问进行操作之后,有多少种不同的涂色情况?两种情况不同当且仅当两种情况存在一个节点i的颜色不同

    Input

    第一行一个正整数N
    接下来N-1行每行两个正整数(x_i,y_i)表示xi到yi有一条边最后一行一个字符串s

    Output

    输出不同染色情况的数量

    Sample Input

    Sample1

    4
    1 2
    1 3
    1 4
    1100

    Sample2

    5
    1 2
    1 3
    1 4
    4 5
    11111

    Sample3

    6
    1 2
    1 3
    1 4
    2 5
    2 6
    100011

    Sample Output

    Sample1

    4

    Sample2

    11

    Sample3

    8

    HINT

    数据范围:对于100%的数据,2<=N<=2?105,1<=xi,yi<=N,s由0或1构成,并且s中最少有一个1

    试题分析

    神题了解一下?
    第一感觉就是每个点与其最远点有关,那不妨就顺着这个思路往下走。
    发现全局的重复情况最多,那么我们就拿出来单独考虑,设(f(x,d))表示从(x)出发走(d)步的黑点集合。
    考虑哪两个情况是重复的,当且仅当这两个点走若干步以后覆盖的点集是相同的。
    由于可操作与不可操作点的区分和去重比较困难,所以先退而求其次:假设所有点都可以操作,那么有多少种情况?
    对于一个状态(f(x,d))相重复的点集(f(y,d_2))(x ightarrow y)上的点都满足(f(x',d-dist(x,x'))=f(x,d))
    证明的话分类讨论证明即可。
    那么我们就可以得出如下结论:

    • (f(x,d))不为全集。
    • (f(x,d))(f(y,d-1))不同,其中((u,v)in E)
      第一个好求,就是(din [0,maxout(x)])
      考虑第二个怎么dp出来:我们思考一种情况重合,是点(x)为根时从它的最大深度子树中来,因为最大深度子树中的点经过拓展可以将剩下的所有分支填满,而没有重合的方案是存在不在最大深度子树中的一个分支还没有被填满,因为这种情况在最大深度子树中的点无论如何也无法重合,所以(d)的区间是(din [0,premaxdis(i)+1])
      下面就来考虑带可操作点的情况,显然可操作点无限制,有距离限制的就是不可操作点。
      不可操作点中, 让一些不可操作点的个数来替代这些可操作点来挽回我们把不可操作点与可操作点去了重。
      当然,一个不可操作点首先要能覆盖一个可操作点才能代表这个可操作点的一部分操作。
      再考虑去重的方式:我们将最大的分支去掉去了一个重,但是实际上这个最大分支中存在白点,这里的白点就需要覆盖半张图,也就是将这个白点置为根,然后将存在黑点的那些分支的深度取(min)就是我们所要的区间下界
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<algorithm>
      
    using namespace std;
    #define LL long long
      
    inline int read(){
        int x=0,f=1; char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
        for(;isdigit(c);c=getchar()) x=x*10+c-'0';
        return x*f;
    }
    const int INF = 2147483600;
    const int MAXN = 300010;
      
    bool vis[MAXN<<1]; int Node[MAXN<<1],Root[MAXN<<1],Next[MAXN<<1],cnt;
    int N,sz[MAXN+1];LL f[MAXN+1][2],g[MAXN+1],all;
    int s[MAXN+1]; char str[MAXN+1]; LL bal[MAXN+1];
      
    inline void insert(int u,int v){
        Node[++cnt]=v; Next[cnt]=Root[u]; Root[u]=cnt; return ;
    }
    inline void dfs(int k,int Fa){
        s[k]=sz[k]=(str[k]=='1'); all+=(str[k]=='1');
        bal[k]=(str[k]=='1')?0:INF;
        for(int x=Root[k];x;x=Next[x]){
            int v=Node[x]; if(v==Fa) continue;
            dfs(v,k);
            if(f[v][0]+1>=f[k][0]){
                f[k][1]=f[k][0];
                f[k][0]=f[v][0]+1; g[k]=v;
            } else if(f[v][0]+1>=f[k][1]){
                f[k][1]=f[v][0]+1;
            } if(sz[v]) bal[k]=min(bal[k],f[v][0]+1);
            sz[k]+=sz[v];
        } return ;
    }
    LL ans=0;
    inline void dfs2(int k,int Fa,LL now){
        ans+=max(min(f[k][0],f[k][1]+2)-bal[k],0LL); LL nowv;
        for(int x=Root[k];x;x=Next[x]){
            int v=Node[x]; if(v==Fa) continue;
            if(g[k]==v) nowv=max(now,f[k][1])+1; 
            else nowv=max(now,f[k][0])+1;
            if(nowv>=f[v][0]){
                f[v][1]=f[v][0]; f[v][0]=nowv;
            } else f[v][1]=max(f[v][1],nowv);
            if(all-sz[v]) bal[v]=min(bal[v],nowv);
            dfs2(v,k,nowv);
        } return ;
    }
      
    int main(){
        //freopen(".in","r",stdin);
        //freopen(".out","w",stdout);
        N=read();
        for(int i=2;i<=N;i++){
            int u=read(),v=read();
            insert(u,v); insert(v,u);
        } scanf("%s",str+1);
        dfs(1,0); dfs2(1,0,0);
        printf("%lld
    ",ans+1);
        return 0;
    }
    
  • 相关阅读:
    IIS: Idle Timeout vs Recycle
    Window.location
    Web technology for developersSee Web APIsStorage
    Know the basics about NTFS permissions
    设置描述性弹性域某个字段为只读
    adb root
    nvme WVLOCK
    模拟器获取root权限
    Android模拟器emulator基本使用技巧和命令
    人工智能可以产生自主意识吗
  • 原文地址:https://www.cnblogs.com/wxjor/p/9483682.html
Copyright © 2011-2022 走看看