CodeChef:Company and Club Hierarchies(树形dp & 技巧)
来源:互联网 发布:解放军土鳖 知乎 编辑:程序博客网 时间:2024/06/14 07:12
题意:一棵树,每个节点有个权值k[i]和颜色c[i],定义以节点u为根节点的序列为“好的序列”条件是:能够找到一条有序链,该链以u节点开始,链的长度为k[i]+1,链的成员颜色均为c[i],对于链上第j个元素,j-1和j+1个元素必须是其祖先和子孙,问对每个节点求出它的好的序列数。
思路:官方题解 树形dp,dp[i][j]为i颜色j长度的链数,ans[u]为u节点的好序列数,那么ans[u] = dp[c[u]][k[i]-1],这里dp没有保存当前结点,因为搜索到节点v时,先记录s = dp[c[v]][k[v]-1],回溯时减回这个s就能保证结果是从子树得到了。
//reference: Pawel# include <bits/stdc++.h>using namespace std;const int maxn = 5e5+30;const int mod = 1e9+7;vector<int>dp[maxn], v[maxn];int club[maxn], cnt[maxn], level[maxn];int ans[maxn];void dfs(int u){ int s = (level[u]>0&&level[u]<cnt[club[u]])?dp[club[u]][level[u]-1]:0; for(auto to : v[u]) dfs(to); if(level[u] >= cnt[club[u]]) return; if(level[u] == 0) ans[u] = 1; else ans[u] = (dp[club[u]][level[u]-1] - s + mod)%mod; dp[club[u]][level[u]] += ans[u]; dp[club[u]][level[u]] %= mod;}int main(){ int t, x, n; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&x); for(int i=0; i<n; ++i) { v[i].clear(); dp[i].clear(); ans[i] = cnt[i] = 0; } for(int p, i=1; i<n; ++i) { scanf("%d",&p); v[p].push_back(i); } for(int i=0; i<n; ++i) { scanf("%d",&club[i]); ++cnt[club[i]]; } for(int i=0; i<n; ++i) scanf("%d",&level[i]); for(int i=0; i<n; ++i) dp[i] = vector<int>(cnt[i]); dfs(0); for(int i=0; i<n; ++i) printf("%d\n",ans[i]); } return 0;};
阅读全文
0 0
- CodeChef:Company and Club Hierarchies(树形dp & 技巧)
- CodeChef:Sereja and Tree 2(树形dp)
- 【codechef】Magical Transformation(dp,技巧题)
- 【codechef】Kisses(dp,技巧题)
- sicily1822 Fight club(dp)
- 【codechef】Chef and Bracket-Pairs (分层dp)
- 【codechef】Chef and the Cards(dp,推论)
- CodeChef:Girl Friend and String Gift(dp)
- 【codechef】Chef and A Large Permutation(技巧题)
- [DP] Codechef .Chef And Fibonacci Array
- hdu5416 CRB and Tree(树形DP)
- E. Ostap and Tree(树形dp)
- SOJ 1822. Fight Club(区间DP)
- CodeChef STRSUB(dp+二分)
- 【codechef】Steady tables(dp)
- ZOJ 3805 Machine(搜索+技巧)【树形DP模板】
- Codeforces Round #405 Div. 1 Bear and Company(DP)
- CodeChef Cards, bags and coins (dp+组合+优化)
- 如何在eclipse上简历maven项目
- GLSL 基础量定义
- Sift中尺度空间、高斯金字塔、差分金字塔(DOG金字塔)、图像金字塔
- PAT-L1-003. 个位数统计
- 图像处理与计算机视觉 基础、经典以及最近发展
- CodeChef:Company and Club Hierarchies(树形dp & 技巧)
- HDU-1166敌兵布阵(线段树)
- linux 用宏区分函数的一个常用技巧
- hw random的实现
- 欢迎使用CSDN-markdown编辑器
- JavaScript封装缓动动画函数
- Linux 下清空文件的命令
- eclipse 安装weblogic插件
- C# 通过DataTable插入大量数据,50万数据只需要3秒