首页 > fwt优化+树形DP HDU 5909

fwt优化+树形DP HDU 5909

 1 //fwt优化+树形DP HDU 5909
 2 //见官方题解
 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/
 4 
 5 #include 
 6 // #include 
 7 // #include 
 8 // #include 
 9 // #include 
10 // #include 
11 // #include 
12 // #include 
13 using namespace std;
14 #define LL long long
15 typedef pair<int,int> pii;
16 const int inf = 0x3f3f3f3f;
17 const int MOD =1e9+7;
18 const int N =1e3+50;
19 #define clc(a,b) memset(a,b,sizeof(a))
20 const double eps = 1e-8;
21 void fre() {freopen("in.txt","r",stdin);}
22 void freout() {freopen("out.txt","w",stdout);}
23 inline int read() { int x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0') { if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
24 const int rev = (MOD+1)>>1;
25 int a[N],tem[N];
26 int n,m;
27 vector<int> g[N];
28 int dp[N][N];
29 int ans[N];
30 void FWT(int *a,int n)  {  
31     for(int d=1; d1)  
32         for(int m=d<<1,i=0; im)  
33             for(int j=0; j)  {  
34                 int x=a[i+j],y=a[i+j+d];  
35                 a[i+j]=(x+y)%MOD,a[i+j+d]=(x-y+MOD)%MOD;   
36             }  
37 }  
38   
39 void UFWT(int *a,int n)  {  
40     for(int d=1; d1)  
41         for(int m=d<<1,i=0; im)  
42             for(int j=0; j) {  
43                 int x=a[i+j],y=a[i+j+d];  
44                 a[i+j]=1LL*(x+y)*rev%MOD,a[i+j+d]=(1LL*(x-y)*rev%MOD+MOD)%MOD;   
45             }  
46 }  
47   
48 void solve(int *a,int *b,int n)  {  
49     FWT(a,n);  
50     FWT(b,n);  
51     for(int i=0; iMOD;  
52     UFWT(a,n);  
53 }  
54 
55 void dfs(int u,int f){
56     dp[u][a[u]]=1;
57     for(int i=0;i<(int)g[u].size();i++){
58         int v=g[u][i];
59         if(v==f) continue;
60         dfs(v,u);
61         for(int j=0;jdp[u][j];
62         solve(dp[u],dp[v],m);
63         for(int j=0;jMOD;
64     }
65     for(int i=0;iMOD;
66 }
67 int main(){
68     // fre();
69     int T;
70     scanf("%d",&T);
71     while(T--){
72         clc(dp,0);
73         clc(ans,0);
74         scanf("%d%d",&n,&m);
75         for(int i=1;i<=n;i++) {
76             scanf("%d",&a[i]);
77             g[i].clear();
78         }
79         for(int i=1;i<=n-1;i++){
80             int u,v;
81             scanf("%d%d",&u,&v);
82             g[u].push_back(v);
83             g[v].push_back(u);
84         }
85         dfs(1,0);
86         for(int i=0;i){
87             printf("%d%c",ans[i],i==m-1 ? '
':' ');
88         }
89     }
90     return 0;
91 }

 

转载于:https://www.cnblogs.com/ITUPC/p/5929299.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 用python编写乘法口诀表的方法 发布时间:2020-08-25 11:46:35 来源:亿速云 阅读:60 作者:小新 用python编写乘法口诀表的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧! 第一种:使用for遍历循环嵌套for x in...

  • //很长一段时间我都只使用以下方式做数组循环,具体原因看数据 var aa = for (var i = 0, l = aa.length; i < l; i++) { var a = aa[i];} 数据采集图片来源于网友 很明显,for循环第二种方式完胜!!! 至于for in、forEach什么的,不知道甩他们多少...

  • 目录 1. Scene Graph Generation with External Knowledge and Image Reconstruction 2. Knowledge Acquisition for Visual Question Answering via Iterative Querying Author...

  • 基础题1: 输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出“Yes”, 否则,输出“No”。主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有i, k,a[i][k]和a[k][i]相等。输入输出示例如下: 输入: 3 1 2 3 4 5 6 7...

  • 程序流程控制 分支 顺序 循环 if switch&case 1 2 3 调整 break 1.6 前 switch(byte、short、char、int) 1.7 可放String 循环 while(次数不确定) do while for(确定次数) break(跳出本层循环) continue(跳出本次循环)     *   2...

  • 关于点云的分割算是我想做的机械臂抓取中十分重要的俄一部分,所以首先学习如果使用点云库处理我用kinect获取的点云的数据,本例程也是我自己慢慢修改程序并结合官方API 的解说实现的,其中有很多细节如果直接更改源程序,可能会因为数据类型,或者头文件等各种原因编译不过,会导致我们比较难得找出其中的错误,首先我们看一下我自己设定的一个场景,...

  • /* 使用正态分布变换进行配准的实验 。其中room_scan1.pcd room_scan2.pcd这些点云包含同一房间360不同视角的扫描数据 */ #include #include #include #include

  • #include #include #include #include ...

  • #include #include #include #include #include #include...

  • #include #include #include #include int main (int argc,...