容易发现答案即$\sum_{S}\sum_{u=1}^{W}[u\le val(S)]=\sum_{u=1}^{W}\sum_{S}[u\le val(S)]$,那么可以枚举权值$u$,并将点权$val<u$的点标为0,$u\le val$的点标为1,相当于统计大于等于k个1的连通子图个数
考虑dp,用$f[u][i][j]$表示权值为u,在以i为根的子树中,选出点中恰好有j个1的方案数,转移方程为$f[u][i][j]=\sum_{a[i]+\sum_{son}b[son]=j}\prod_{son}(f[u][son][b[son]]+[b[son]==0])$,复杂度为$o(w\cdot n^{3})$
令$F[u][i](x)=\sum_{j=0}^{sz[i]}f[u][i][j]\cdot x^{j}$,那么$F[u][i](x)=x^{a[i]}\prod_{son}(F[u][son](x)+1)$,对其插值,最后再用拉格朗日插值法求出系数(先把所有多项式加起来再求),复杂度为$o(w\cdot n^{2})$
调换枚举顺序,对于一个插值,将每一个点i以u为下标建立一棵线段树,由于如果i子树内不存在某一个权值w,那么显然有$F[w][i]=F[w-1][i]$,因此可以线段树合并来实现dp过程,总复杂度$o(n^{2}log W)$
由于线段树合并时还需要实现累加子树内的多项式,这可以通过记录4个标记$(a,b,c,d)$来实现,其中a和b表示这个点的答案,c和d表示累加起来的答案,最后标记都下传后的d标记即为这个位置上所有数的和
  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2005
4 #define mod 64123
5 #define mid (l+r>>1)
6 struct ji{
7 int nex,to;
8 }edge[N<<1];
9 struct tag{
10 int a,b,c,d;
11 }f[N*15];
12 int V,E,n,m,w,v,x,y,ans,head[N],r[N],a[N],b[N],sum[N],ch[N*15][2];
13 void add(int x,int y){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 head[x]=E++;
17 }
18 int ksm(int n,int m){
19 if (!m)return 1;
20 int s=ksm(n,m>>1);
21 s=1LL*s*s%mod;
22 if (m&1)s=1LL*s*n%mod;
23 return s;
24 }
25 int New(){
26 f[++V]=tag{1,0,0,0};
27 ch[V][0]=ch[V][1]=0;
28 return V;
29 }
30 void upd(int &k,tag x){
31 if (!k)k=New();
32 f[k].c=(1LL*f[k].a*x.c+f[k].c)%mod;
33 f[k].d=(1LL*f[k].b*x.c+f[k].d+x.d)%mod;
34 f[k].a=1LL*f[k].a*x.a%mod;
35 f[k].b=(1LL*f[k].b*x.a+x.b)%mod;
36 }
37 void down(int k){
38 upd(ch[k][0],f[k]);
39 upd(ch[k][1],f[k]);
40 f[k]=tag{1,0,0,0};
41 }
42 void update(int &k,int l,int r,int x,int y,tag z){
43 if ((l>y)||(x>r))return;
44 if (!k)k=New();
45 if ((x<=l)&&(r<=y)){
46 upd(k,z);
47 return;
48 }
49 down(k);
50 update(ch[k][0],l,mid,x,y,z);
51 update(ch[k][1],mid+1,r,x,y,z);
52 }
53 int merge(int k1,int k2){
54 if ((!k1)||(!k2))return k1+k2;
55 if ((!ch[k1][0])&&(!ch[k1][1]))swap(k1,k2);
56 if ((!ch[k2][0])&&(!ch[k2][1])){
57 f[k1].a=1LL*f[k1].a*f[k2].b%mod;
58 f[k1].b=1LL*f[k1].b*f[k2].b%mod;
59 f[k1].d=(f[k1].d+f[k2].d)%mod;
60 return k1;
61 }
62 down(k1);
63 down(k2);
64 ch[k1][0]=merge(ch[k1][0],ch[k2][0]);
65 ch[k1][1]=merge(ch[k1][1],ch[k2][1]);
66 return k1;
67 }
68 void dfs(int k,int fa){
69 upd(r[k],tag{0,1,0,0});
70 for(int i=head[k];i!=-1;i=edge[i].nex)
71 if (edge[i].to!=fa){
72 dfs(edge[i].to,k);
73 r[k]=merge(r[k],r[edge[i].to]);
74 }
75 update(r[k],1,w,1,a[k],tag{v,0,0,0});
76 upd(r[k],tag{1,0,1,0});
77 upd(r[k],tag{1,1,0,0});
78 }
79 void tot(int k,int l,int r){
80 if (l==r){
81 sum[v]=(sum[v]+f[k].d)%mod;
82 return;
83 }
84 down(k);
85 tot(ch[k][0],l,mid);
86 tot(ch[k][1],mid+1,r);
87 }
88 int main(){
89 scanf("%d%d%d",&n,&m,&w);
90 memset(head,-1,sizeof(head));
91 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
92 for(int i=1;i<n;i++){
93 scanf("%d%d",&x,&y);
94 add(x,y);
95 add(y,x);
96 }
97 for(v=0;v<=n;v++){
98 V=0;
99 memset(r,0,sizeof(r));
100 dfs(1,0);
101 tot(r[1],1,w);
102 }
103 memset(a,0,sizeof(a));
104 a[0]=1;
105 for(int i=0;i<=n;i++)
106 for(int j=i+1;j>=0;j--)a[j]=(a[j-1]-i*a[j]%mod+mod)%mod;
107 for(int i=0;i<=n;i++){
108 x=1;
109 for(int j=0;j<=n;j++)
110 if (i!=j)x=1LL*x*(i-j+mod)%mod;
111 x=1LL*ksm(x,mod-2)*sum[i]%mod;
112 memcpy(b,a,sizeof(b));
113 for(int j=n+1;j;j--){
114 b[j-1]=(b[j-1]+i*b[j])%mod;
115 if (m<j)ans=(ans+1LL*b[j]*x)%mod;
116 }
117 }
118 printf("%d",ans);
119 }

[loj2473]秘密袭击的更多相关文章

  1. [九省联考2018]秘密袭击coat

    [九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...

  2. 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)

    [BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...

  3. LOJ #2473. 「九省联考 2018」秘密袭击

    #2473. 「九省联考 2018」秘密袭击 链接 分析: 首先枚举一个权值W,计算这个多少个连通块中,第k大的数是这个权值. $f[i][j]$表示到第i个节点,有j个大于W数的连通块的个数.然后背 ...

  4. P4365 [九省联考2018]秘密袭击coat

    $ \color{#0066ff}{ 题目描述 }$ Access Globe 最近正在玩一款战略游戏.在游戏中,他操控的角色是一名C 国士 兵.他的任务就是服从指挥官的指令参加战斗,并在战斗中取胜. ...

  5. [BZOJ5250][九省联考2018]秘密袭击(DP)

    5250: [2018多省省队联测]秘密袭击 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3  Solved: 0[Submit][Status][D ...

  6. [luogu]P4365[九省联考]秘密袭击coat(非官方正解)

    题目背景 警告:滥用本题评测者将被封号 We could have had it all. . . . . . 我们本该,拥有一切 Counting on a tree. . . . . . 何至于此 ...

  7. 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击

    题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...

  8. bzoj5250 [2018多省省队联测]秘密袭击

    博主蒟蒻,目前还不会动态dp,所以下面说的是一个并不优秀的暴力,我会补的! 我们考虑按权值从大到小依次点亮每个点,相同权值可以同时点亮,每次点亮后,我们进行一次树形背包. 处理出$f[i][j]$表示 ...

  9. luogu4365 秘密袭击 (生成函数+线段树合并+拉格朗日插值)

    求所有可能联通块的第k大值的和,考虑枚举这个值: $ans=\sum\limits_{i=1}^{W}{i\sum\limits_{S}{[i是第K大]}}$ 设cnt[i]为连通块中值>=i的 ...

随机推荐

  1. 洛谷3163 CQOI2014危桥 (最大流)

    一开始想了一发费用流做法然后直接出负环了 首先,比较显然的思路就是对于原图中没有限制的边,对应的流量就是\(inf\),如果是危桥,那么流量就应该是\(2\). 由于存在两个起始点,我们考虑直接\(s ...

  2. 项目实战 Prometheus环境搭建

    项目摘要: 本文是搭建一套prometheus环境的教程. 前期准备:准备三台虚拟机,本文以centos7为例. 项目具体实施:分别进入每台虚拟机设置hostname:# hostnamectl se ...

  3. 什么,你还使用 webpack?别人都在用 vite 搭建项目了

    一.vite 到底是干嘛的? vite 实际上就是一个面向现代浏览器,基于 ES module 实现了一个更轻快的项目构建打包工具. vite 是法语中轻快的意思. vite 的特点: 1.轻快的冷服 ...

  4. [对对子队]会议记录4.14(Scrum Meeting 5)

    今天已完成的工作 刘子航 ​ 工作内容:设计第2,3关 ​ 相关issue:设计关卡2,3 吴昭邦 ​ 工作内容:制作场景,暂时解决了坐标错位问题 ​ 相关issue:实现游戏场景中的必要模型 何瑞 ...

  5. 热身训练2 GCD

    题目描述 简要题意:  n个数字,a1,a2,...,an m次询问(l,r),每次询问需回答 1.gcd(al,al+1,al+2,...,ar);2.gcd(ax,ax+1,ax+2,...,ay ...

  6. 前端大牛带你了解JavaScript 函数式编程

    前言 函数式编程在前端已经成为了一个非常热门的话题.在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想. 本文将略去那些晦涩难懂的概念介绍,重点展示在 JavaScript 中到底 ...

  7. 快速了解XML

    1. XML 定义 可扩展标记语言,标准通用标记语言的子集,简称XML.是一种用于标记电子文件使其具有结构性的标记语言. 2. XML 展示 如下是一个xml的标记展示,XML 是不作为的XML 被设 ...

  8. 小白自制Linux开发板 九. 修改开机Logo

    许久不见啊,今天我们继续来修改我们的系统. 通过前面的几篇文章我们已经能轻松驾驭我们的开发板了,但是现在都是追求个性化的时代,我们在开发板上打上了自己的Logo,那我们是否可以改变开机启动的Logo呢 ...

  9. [转]DDR3基础知识介绍

    本文转自:(4条消息) xilinx ddr3 MIG ip核使用详解_admiraion123的博客-CSDN博客 1,DDR3基本内容介绍1.1,DDR3简介DDR3全称double-data-r ...

  10. 深入浅出:了解时序数据库 InfluxDB

    数据模型 1.时序数据的特征 时序数据应用场景就是在时间线上每个时间点都会从多个数据源涌入数据,按照连续时间的多种纬度产生大量数据,并按秒甚至毫秒计算的实时性写入存储. 传统的RDBMS数据库对写入的 ...