【BZOJ3696】化合物 树形DP+暴力
【BZOJ3696】化合物
Description
首长NOI惨跪,于是去念文化课了。现在,他面对一道化学题。
这题的来源是因为在一个奇怪的学校两个化竞党在玩一个奇怪的博弈论游戏。这个游戏很蛋疼,我相信你们也没有兴趣听。
由于这个游戏涉及博弈论,因此化竞的同学就要求首长求一个类似SG函数的值。
他们手中有一种非常神奇的化合物,它的分子由N个原子组成(不要在意一个原子可能和及其多个原子成键这个细节)。这个分子构成一个树结构,1号分子为根。 若两个原子i、j到它们的最近公共祖先的距离分别是Li和Lj,定义它们的Aij值为:
Aij=Li xor Lj
题目要求对于每一个k(k∈N),求出两两A值为k的原子对个数。
Input
第一行一个整数N。
接下来N-1行,每行一个整数p,第新亍的整数表示第i个原子的父亲为p。
Output
从K=0开始,第k+1行输出两两A值为K的原子对个数,输出到第一个不为零的数为止。
Sample Input
1
1
Sample Output
2
HINT
【数据规模与约定】
用h表示树结构分子的最大深度。
N<=10^5,H<=500
题解:第一直觉是某种树形DP,但是想不出来,看到H很小,感觉暴力可过,发现正解真的是暴力~
对于每一层,我们用f[i]表示当前子树中深度为i的点的个数,然后我们用下一层的f'[j]和当前的f[i]来暴力更新答案ans[i^j],然后用f'[j]来更新f[i]就行了。
注意要输出到第一个为0的数,而不是输出所有不为0的数。
随手写了一发rank1了什么鬼~可能因为数组开的比较小吧?
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=100010;
int n,mx,cnt;
int fa[maxn],dep[maxn],md[maxn],f[520][520],to[maxn],head[maxn],next[maxn],ans[520];
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x)
{
md[x]=dep[x],f[dep[x]][dep[x]]=1;
int i,j,k;
for(i=head[x];i!=-1;i=next[i])
{
dep[to[i]]=dep[x]+1,dfs(to[i]);
for(j=dep[x];j<=md[x];j++)
for(k=dep[x];k<=md[to[i]];k++)
ans[(j-dep[x])^(k-dep[x])]+=f[dep[x]][j]*f[dep[x]+1][k];
for(j=dep[x];j<=md[to[i]];j++)
f[dep[x]][j]+=f[dep[x]+1][j],f[dep[x]+1][j]=0;
md[x]=max(md[x],md[to[i]]);
}
}
int main()
{
n=rd();
int i;
memset(head,-1,sizeof(head));
for(i=2;i<=n;i++) fa[i]=rd(),add(fa[i],i);
dep[1]=2,dfs(1);
for(i=0;i<512;i++)
{
if(!ans[i]) return 0;
printf("%d\n",ans[i]);
}
}
【BZOJ3696】化合物 树形DP+暴力的更多相关文章
- 【BZOJ-3696】化合物 树形DP + 母函数(什么鬼)
3696: 化合物 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 165 Solved: 85[Submit][Status][Discuss] D ...
- 【bzoj3696】化合物 树形dp
题目描述 首长NOI惨跪,于是去念文化课了.现在,他面对一道化学题.这题的来源是因为在一个奇怪的学校两个化竞党在玩一个奇怪的博弈论游戏.这个游戏很蛋疼,我相信你们也没有兴趣听.由于这个游戏涉及博弈论, ...
- C. Ilya And The Tree 树形dp 暴力
C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...
- [Bzoj3696]化合物【暴力+树形Dp】
Online Judge:Bzoj3696 Label:暴力,树形Dp 题目描述 首长NOI惨跪,于是去念文化课了.现在,他面对一道化学题. 这题的来源是因为在一个奇怪的学校两个化竞党在玩一个奇怪的博 ...
- BZOJ5341[Ctsc2018]暴力写挂——边分治+虚树+树形DP
题目链接: CSTC2018暴力写挂 题目大意:给出n个点结构不同的两棵树,边有边权(有负权边及0边),要求找到一个点对(a,b)满足dep(a)+dep(b)-dep(lca)-dep'(lca)最 ...
- VIJOS1476 旅行规划(树形Dp + DFS暴力乱搞)
题意: 给出一个树,树上每一条边的边权为 1,求树上所有最长链的点集并. 细节: 可能存在多条最长链!最长链!最长链!重要的事情说三遍 分析: 方法round 1:暴力乱搞Q A Q,边权为正-> ...
- [JLOI2015]战争调度【暴力+树形Dp】
Online Judge:Bzoj4007,Luogu P3262 Label:暴力,树形Dp 题解 参考了这篇blog https://www.cnblogs.com/GXZlegend/p/830 ...
- 树形dp专题总结
树形dp专题总结 大力dp的练习与晋升 原题均可以在网址上找到 技巧总结 1.换根大法 2.状态定义应只考虑考虑影响的关系 3.数据结构与dp的合理结合(T11) 4.抽直径解决求最长链的许多类问题( ...
- 【BZOJ-4455】小星星 容斥 + 树形DP
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 204 Solved: 137[Submit][Status] ...
随机推荐
- HDU 1060 Leftmost Digit【log10/求N^N的最高位数字是多少】
Leftmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- Java开发笔记(一百零三)线程间的通信方式
前面介绍了多线程并发之时的资源抢占情况,以及利用同步.加锁.信号量等机制解决资源冲突问题,不过这些机制只适合同一资源的共享分配,并未涉及到某件事由的前因后果.日常生活中,经常存在两个前后关联的事务,像 ...
- 打包python脚本为exe
更新pip 安装
- 聊聊、Zookeeper Linux 启动
Zookeeper 在 windows 下安装比较简单,属于无脑式安装,下载下来双击脚本就可以了.前面的文章中也有介绍,今天我来写写 Linux 下的安装,以及所碰到的坑. 首先,登陆 Linux 系 ...
- 8 Most Required Examples Reference For Oracle Forms
Check the following 8 Links for best Oracle Forms examples with source code (Fmb files), which will ...
- Flutter接入极光推送
(1)搜索 https://pub.dartlang.org/packages/jpush_flutter ,安装插件,并且按照官方配置 /android/app/build.gradle andro ...
- SpringMVC项目中web.xml中的节点载入顺序问题
SpringMVC项目中web.xml中的节点载入顺序问题,之前以为web.xml中就是一些配置信息,和节点的顺序没有关系.后来才发现初始化时的载入顺序是和节点的顺序相关的. 完整的web.xml文件 ...
- 贴几个spark提交任务的小脚本
spark单个master节点的提交方式 spark-submit --master spark://hadoop-namenode-02:7077 \ --class com.dinpay.bdp. ...
- HTML5 Canvas 绘制英国国旗
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- Siteserver平台搭建
本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 一开始什么也不懂真痛 ...