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

求所有可能联通块的第k大值的和,考虑枚举这个值:

$ans=\sum\limits_{i=1}^{W}{i\sum\limits_{S}{[i是第K大]}}$

设cnt[i]为连通块中值>=i的个数

$ans=\sum\limits_{i=1}^{W}{i\sum\limits_{S}{[cnt[i]>=K]-[cnt[i+1]>=K]}}$

$ans=\sum\limits_{i=1}^{W}{\sum\limits_{S}{[cnt[i]>=K]}}$

于是先考虑树上dp,设f[i][j][k]表示以i为根的连通块中,值>=j的数量为k的情况数

然后$ans=\sum\limits_{i=1}^{N}{\sum\limits_{j=1}^{W}{\sum\limits_{k=K}^{N}{f[i][j][k]}}}$

转移和背包类似,所以这样做是$O(N^2W)$的

考虑使用生成函数优化,设$F[i][j]=\sum{f[i][j][k]x^k}$,再设$G[i][j]=\sum{F[s][j]},i是s的祖先$

于是转移就变成了$F[i][j]*=(F[s][j]+1),G[i][j]+=G[s][j],G[i][j]+=F[i][j]$,其中s是i的孩子

同时有初值$F[i][j]=(d[i]>=j?x:1)$,答案就是G[1][*]的K~N项系数的和

然后当然不能真的去乘了..

考虑先将F和G用点值表达,最后再插回来

首先枚举x=1..N+1,然后给每个点i开动态开点的线段树维护F[i][j]和G[i][j]的值

然后用线段树合并来做对应位置的相乘和相加

具体来说,我们让线段树上的结点维护一个作用在$(f,g)$上的变换$(a,b,c,d)$,使得最终得到$(af+b,cf+d+g)$

然后也不难得到变换的乘法(有结合律但没有交换律)

然后就可以做了 复杂度我也不会分析 反正有可能跑的比暴力还慢

别忘了回收掉不用的点

 

  1 #include<bits/stdc++.h>
  2 #define pa pair<int,int>
  3 #define CLR(a,x) memset(a,x,sizeof(a))
  4 #define MP make_pair
  5 #define fi first
  6 #define se second
  7 using namespace std;
  8 typedef long long ll;
  9 typedef unsigned long long ull;
 10 typedef unsigned int ui;
 11 typedef long double ld;
 12 const int maxn=1700,maxp=3e6;
 13 const int P=64123;
 14 
 15 inline char gc(){
 16     return getchar();
 17     static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
 18     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
 19 }
 20 inline ll rd(){
 21     ll x=0;char c=gc();bool neg=0;
 22     while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
 23     while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
 24     return neg?(~x+1):x;
 25 }
 26 
 27 struct Node{
 28     int a,b,c,d;
 29     Node(int _a=1,int _b=0,int _c=0,int _d=0){a=_a,b=_b,c=_c,d=_d;}
 30 }val[maxp];
 31 Node operator *(Node x,Node y){
 32     return Node(1ll*x.a*y.a%P,(1ll*x.b*y.a+y.b)%P,(1ll*x.a*y.c+x.c)%P,(1ll*x.b*y.c+x.d+y.d)%P);
 33 }
 34 
 35 int N,K,W,dan[maxn],eg[maxn*2][2],egh[maxn],ect;
 36 int ch[maxp][2],stk[maxp],sh,rt[maxn];
 37 int yy[maxn];
 38 
 39 inline void adeg(int a,int b){
 40     eg[++ect][0]=b,eg[ect][1]=egh[a],egh[a]=ect;
 41 }
 42 
 43 inline int newnode(){
 44     int p=stk[sh--];
 45     assert(sh>=1);
 46     ch[p][0]=ch[p][1]=0;
 47     val[p]=Node();
 48     return p;
 49 }
 50 
 51 inline void delall(int &p){
 52     if(!p) return;
 53     delall(ch[p][0]);delall(ch[p][1]);
 54     stk[++sh]=p;p=0;
 55 }
 56 
 57 inline void pushdown(int p){
 58     if(!ch[p][0]) ch[p][0]=newnode();
 59     if(!ch[p][1]) ch[p][1]=newnode();
 60     val[ch[p][0]]=val[ch[p][0]]*val[p];
 61     val[ch[p][1]]=val[ch[p][1]]*val[p];
 62     val[p]=Node();
 63 }
 64 
 65 void mul(int &p,int l,int r,int x,int y,Node z){
 66     if(!p) p=newnode();
 67     if(x<=l&&r<=y){
 68         val[p]=val[p]*z;
 69     }else{
 70         int m=(l+r)>>1;pushdown(p);
 71         if(x<=m) mul(ch[p][0],l,m,x,y,z);
 72         if(y>=m+1) mul(ch[p][1],m+1,r,x,y,z);
 73     }
 74 }
 75 
 76 int merge(int &p,int &q){
 77     if(!p||!q) return p|q;
 78     if(!ch[p][0]&&!ch[p][1]) swap(p,q);
 79     if(!ch[q][0]&&!ch[q][1]){
 80         val[p]=val[p]*Node(val[q].b,0,0,val[q].d);
 81         return p;
 82     }
 83     pushdown(p),pushdown(q);
 84     ch[p][0]=merge(ch[p][0],ch[q][0]);
 85     ch[p][1]=merge(ch[p][1],ch[q][1]);
 86     return p;
 87 }
 88 
 89 void dfs(int x,int f,int id){
 90     mul(rt[x],1,W,1,W,Node(0,1,0,0));
 91     for(int i=egh[x];i;i=eg[i][1]){
 92         int b=eg[i][0];if(b==f) continue;
 93         dfs(b,x,id);
 94         merge(rt[x],rt[b]);
 95         delall(rt[b]);
 96     }
 97     mul(rt[x],1,W,1,dan[x],Node(id,0,0,0));
 98     mul(rt[x],1,W,1,W,Node(1,0,1,0));
 99     mul(rt[x],1,W,1,W,Node(1,1,0,0));
100 }
101 
102 int query(int p,int l,int r){
103     if(!p) return 0;
104     if(l==r) return val[p].d;
105     int m=(l+r)>>1;pushdown(p);
106     return (query(ch[p][0],l,m)+query(ch[p][1],m+1,r))%P;
107 }
108 
109 int fpow(int x,int y){
110     int r=1;
111     while(y){
112         if(y&1) r=1ll*r*x%P;
113         x=1ll*x*x%P,y>>=1;
114     }return r;
115 }
116 
117 int l[maxn],tmp[maxn],ans[maxn];
118 void calc(){
119     l[0]=1;
120     for(int i=1;i<=N+1;i++){
121         for(int j=i-1;j>=0;j--){
122             l[j+1]=(l[j+1]+l[j])%P;
123             l[j]=-1ll*i*l[j]%P;
124         }
125     }
126     for(int i=1;i<=N+1;i++){
127         int ib=-fpow(i,P-2);
128         tmp[0]=1ll*l[0]*ib%P;
129         for(int j=1;j<=N;j++){
130             tmp[j]=1ll*(l[j]-tmp[j-1])*ib%P;
131         }
132         int k=0,x=1;
133         for(int j=0;j<=N;j++){
134             k=(1ll*x*tmp[j]+k)%P;
135             x=1ll*x*i%P;
136         }
137         k=1ll*fpow(k,P-2)*yy[i]%P;
138         for(int j=0;j<=N;j++){
139             ans[j]=(1ll*tmp[j]*k+ans[j])%P;
140         }
141     }
142 }
143 
144 int main(){
145     //freopen("","r",stdin);
146     N=rd(),K=rd(),W=rd();
147     for(int i=1;i<=N;i++) dan[i]=rd();
148     for(int i=1;i<N;i++){
149         int a=rd(),b=rd();
150         adeg(a,b);adeg(b,a);
151     }
152     for(int i=1;i<maxp-5;i++) stk[++sh]=i;
153     
154     for(int i=1;i<=N+1;i++){
155         dfs(1,0,i);
156         yy[i]=query(rt[1],1,W);
157         delall(rt[1]);
158     }
159     calc();
160     int a=0;
161     for(int i=K;i<=N;i++) a=(a+ans[i])%P;
162     printf("%d\n",(a+P)%P);
163     return 0;
164 }

 

转载于:https://www.cnblogs.com/Ressed/p/10504966.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习程序开发的方法,仅供参考吧

感觉很多学习程序开发的新手&#xff0c;方法不对&#xff0c;浪费了大量时间。而j2ee由于技术分支多&#xff0c;学习的人更是找不到主线。其实很多东西&#xff0c;说白了很简单的。 还是那句老话&#xff0c;怕就怕走错路&#xff0c;走对了其实很容易。 j2ee害人的地方就是…

[vue] vue常用的修饰符有哪些?列举并说明

[vue] vue常用的修饰符有哪些&#xff1f;列举并说明 .trim .number .stop .prevent个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

java对象流读取完毕_从Java 8流中获取具有最大频率的对象

我有一个带有city和zip字段的对象,我们称之为Record.public class Record() {private String zip;private String city;//getters and setters}现在,我有一些这些对象的集合,我使用以下代码通过zip对它们进行分组&#xff1a;final Collection records; //populated collection…

Jenkins二 安装gitlab及其使用

git --version 如果没有安装git直接源码安装即可&#xff0c;如果安装了先删除原来的git。 yum -y remove git先安装编译git需要的包。 yum install zlib-devel perl-CPAN gettext curl-devel expat-devel gettext-devel openssl-devel下载&安装 去gitlab官网 https://abou…

编程使用资源文件实现多语言页面(In Action)

需求&#xff1a;我们的ASP.NET站点需要提供多语言支持&#xff0c;考虑到我们使用的是ASP.NET2.0&#xff0c;我们可以利用资源文件来实现。 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />NOTE:这里我们使用编程的方法实现&a…

[vue] vue怎么获取DOM节点?

[vue] vue怎么获取DOM节点&#xff1f; 1、document.getElementById("id")2、this.$refs.xx还有一些特殊的&#xff0c;比如this.$root、this.$parent、this.$children个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

java final内存机制_Java中的内存处理机制和final、static、final static总结

装载自&#xff1a;http://blog.csdn.net/wqthaha/article/details/20923579Java程序运行在JVM上&#xff0c;可以把JVM理解成Java程序和操作系统之间的桥梁&#xff0c;JVM实现了Java的平台无关性&#xff0c;由此可见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记…

[vue] vue过渡动画实现的方式有哪些?

[vue] vue过渡动画实现的方式有哪些&#xff1f; 1.使用vue的transition标签结合css样式完成动画 2.利用animate.css结合transition实现动画 3.利用 vue中的钩子函数实现动画个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很…

MySQL中的字符集涵义及使用方法总结(二)

五.乱码的避免最好让上述9个字符集变量值保持一致&#xff0c;或者至少“兼容”&#xff0c;同时也要考虑到OS中locale的值。当然&#xff1a;character_set_system例外&#xff0c;它是存储和表示元信息使用的字符集&#xff0c;一般都是ascii串&#xff0c;使用utf8和使用lat…

vim 多行添加注释,取消注释

转发 已经验证 https://blog.csdn.net/SuiXin_123/article/details/81393397转载于:https://www.cnblogs.com/pingg/p/10509301.html

c java c时间格式处理_c:foreach 对时间类型进行格式化

程序(三)Input parameters:Date: 2004/04/01:13:30:00Java format: Thu Apr 01 13:30:00 CST 2004isoDate: 20040531T235959Java format: Mon May 31 23:59:59 CDT 200DatesTag OutputAttribute: value; required. Tag has no body. 注释&#xff1a;value属性 日期对象200…

[vue] vue父子组件双向绑定的方法有哪些?

[vue] vue父子组件双向绑定的方法有哪些&#xff1f; 1.利用对象的引用关系来实现 2.父子组件之间的数据传递 3.使用.sync修饰符个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通…

调用未知DLL中的导出函数

不知道诸位看官是否有过这样的经历&#xff1a;在不经意之间发现一个DLL文件&#xff0c;它里边有不少有趣的导出函数——但是由于你不知道如何调用这些函数&#xff0c;所以只能大发感慨而又无能为力焉。固然有些知名的DLL可以直接通过搜索引擎来找到它的使用方式&#xff08;…

Sqlserver内存管理:限制最大占用内存(转载)

https://blog.csdn.net/donghustone/article/details/83338185?tdsourcetags_pcqq_aiomsg 转载于:https://www.cnblogs.com/wangjunwei/p/10510138.html

批处理 java环境_java环境配置简单批处理方法一键OK

Java编程首要工作就是安装JDK(Java Development Kit)。一通NEXT点完安装包后就是最重要的环境变量设置了。也许有人会问为什么要设置环境变量&#xff0c;要理解这点&#xff0c;首先要明白环境变量的作用。环境变量可以简单的理解为路径导向。例如Windows里面的临时文件夹存放…

[vue] vue部署上线前需要做哪些准备工作?

[vue] vue部署上线前需要做哪些准备工作&#xff1f; router 是不是hash 是否需要配置nginx , publicPath , 是不是要配置cdn个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关…

c#2.0的新特性--泛型

c#2.0中引入了许多新的语言特性&#xff1a;比较重要的有4个&#xff0c;泛型&#xff08;Generics&#xff09;、匿名方法&#xff08;Annorymous Methods&#xff09;、迭代器&#xff08;Iterators&#xff09;、和局部类&#xff08;Partial Types&#xff09;. 泛型 是c…

构建之法与博客首秀

问题一&#xff1a;软件的安全功能是指什么呢&#xff1f; 我看了《构建之法》第七页对飞机安全功能的的描述&#xff0c;想知道在软件中是否有类似飞机的安全功能&#xff1f;如果有&#xff0c;具体是指什么功能呢&#xff1f;我在查阅资料后只找到对软件安全的的总结(软件安…

java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...

ImportSelector&#xff1a;返回需要导入的组件的全类名数组创建一个实现了ImportSelector接口的类&#xff0c;然后让入Import中。ImportSelector的实现类包含了所有需要导入到容器中的组件。public class StuConfigurationImportSerlect implements ImportSelector {Override…

[vue] 说说你觉得认为的vue开发规范有哪些?

[vue] 说说你觉得认为的vue开发规范有哪些&#xff1f; 风格指南个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题