码迷,mamicode.com
首页 > 其他好文 > 详细

[乱搞]JZOJ 5913 林下风气

时间:2018-10-19 20:48:30      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:input   put   alt   div   一个   ace   最小值   gif   问题   

Description

里口福因有林下风气,带领全国各地高校掀起了一股AK风,大家都十分痴迷于AK。里口福为了打击大家的自信心,出了一道自以为十分困难的题目。
里口福有一棵树,第i个节点上有点权ai,他的问题就是这棵树中有多少个不同的连通块满足连通块的最大值与最小值之差=k,两个连通块不同当且仅当至少存在一个节点在一个连通块中出现而另一个连通块中没有出现。
痴迷于AK的你马上接下这道题目,在里口福狂妄的笑声中,你切掉这道题的决心更加坚定了,现在就差你的代码了。
 

Input

第一行两个整数n,k,表示树的大小以及题目中的k。
第二行n个整数,第i个整数表示ai。
接下来n-1行,每行两个整数x,y表示树边(x,y)。

Output

一行一个整数,表示答案,答案对19260817取模。
 

Sample Input

5 3
1 2 3 4 5
1 2
1 3
2 4
2 5

Sample Output

4
 
 

Data Constraint

对于30%的数据,n<=22
对于另外20%的数据,树是一条链
对于另外20%的数据,ai只有0和1两种
对于100%的数据,N<=3333,0<=ai<=N,K>=0

分析

我们把差值小于等于k的方案数和插值小于k的方案数相减就是等于k的方案数嘛

然后我们每次对以i为根的子树求方案数,但是有问题:如果值相等,可能会算多次,所以我们只算比编号根大的点,就避免了重复。

 

技术分享图片
#include <iostream>
#include <cstdio>
using namespace std;
const int N=3333+10;
const int P=19260817;
struct Edge {
    int u,v,nx;
}g[2*N];
int cnt,list[N];
int w[N];
int n,k;

void Add(int u,int v) {
    g[++cnt].u=u;g[cnt].v=v;g[cnt].nx=list[u];list[u]=cnt;
}

int Dfs(int u,int fa,int mxid) {
    long long ans=1;
    for (int i=list[u];i;i=g[i].nx)
        if (g[i].v!=fa&&w[mxid]>=w[g[i].v]&&w[mxid]-w[g[i].v]<=k&&(mxid<g[i].v||w[mxid]!=w[g[i].v]))
            (ans*=1ll*Dfs(g[i].v,u,mxid)+1)%=P;
    return ans;
}

int main() {
    freopen("lkf.in","r",stdin);
    freopen("lkf.out","w",stdout);
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++) scanf("%d",&w[i]);
    for (int i=1;i<n;i++) {
        int u,v;
        scanf("%d%d",&u,&v);
        Add(u,v);Add(v,u);
    }
    int smaller_or_equals_k=0,smaller_or_equals_k_1=0;
    for (int i=1;i<=n;i++) (smaller_or_equals_k+=Dfs(i,-1,i))%=P;
    if (k) {
        k--;
        for (int i=1;i<=n;i++) (smaller_or_equals_k_1+=Dfs(i,-1,i))%=P;
    }
    printf("%d",(smaller_or_equals_k-smaller_or_equals_k_1+P)%P);
    
}
View Code

 

[乱搞]JZOJ 5913 林下风气

标签:input   put   alt   div   一个   ace   最小值   gif   问题   

原文地址:https://www.cnblogs.com/mastervan/p/9818598.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!