【JZOJ3601】【广州市选2014】Tree(tree)
╰( ̄▽ ̄)╭
每个非叶子节点,其左右子树叶子节点的权值之和相等。我们称这种二叉树叫平衡二叉树。
我们将一棵平衡二叉树叶子节点的权值从左到右列出来,假如这个权值序列是另一个序列A的子序列,我们称这棵平衡二叉树“隐藏”在序列A当中。在本题中,我们称一个序列S2是另一个序列S1的子序列,当且仅当S2可以由S1中删除0个或多个元素,但不改变S1中剩余元素的相对位置获得。
你的任务是对给定的整数序列,寻找当中隐藏的具有最多叶子节点的平衡二叉树。
n<=1000,1<=ai<=500
(⊙ ▽ ⊙)
显而易见,我们先枚举一个base,并将所有满足a[i]=base∗2j的提取出来,
形成一个新的数列A。
那么原问题就转化为:对于一个只有2的幂数的数列A,求一个最多叶子结点的隐藏平衡二叉树。
容易想到,可以利用动态规划来做。
但问题在于如何写转移方程。
如果我们摒弃时间复杂度不谈,
设f[i][j]表示前i个数中,未合并的数之和为j,的最多合并次数。
显然f[i−1][j]+1⇒f[i][j+A[i]] (A[i]<=lowbit(j))
先明白lowbit()的意义。
lowbit(x)表示x的二进制中,只保留最低位的1及其后面的0,得到的数。
由于A[i]<=lowbit(j),理解为,A[i]可以暂时储存在j中,因此可以转移。
如果不满足A[i]<=lowbit(j),会导致不连续的合并,是不允许的。
f[i][j]的第一维可以滚动;
第二维,可以只枚举可以达到的和的最大值。
这样优化之后,可以勉强卡过。
( ̄~ ̄)
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define ll long long
using namespace std;
const char* fin="tree.in";
const char* fout="tree.out";
const int inf=0x7fffffff;
const int maxn=1007,maxa=507,maxk=300000;
int n,i,j,k,ans=1;
int a[maxn];
int b[maxn],mi[maxn];
int f[maxk];
bool bz[maxa];
void solve(){
int i,j,k,l,MAX=0;
f[0]=0;
for (i=1;i<=b[0];i++){
for (j=MAX;j>=0;j--){
if (j==0 || (j&-j)>=b[i]){
k=j+b[i];
if (k>=maxk) continue;
f[k]=max(f[k],f[j]+1);
if ((k&-k)==k) ans=max(ans,f[k]);
MAX=max(MAX,k);
}
}
}
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
//for (i=1,j=0;i<1<<maxk;i<<=1,j++) po[i]=j;
for (i=1;i<maxa;i++){
memset(bz,0,sizeof(bz));
memset(mi,0,sizeof(mi));
memset(f,128,sizeof(f));
for (j=i,k=0;j<maxa;j=j*2){
bz[j]=true;
mi[j]=++k;
}
b[0]=0;
for (j=1;j<=n;j++)
if (bz[a[j]]) b[++b[0]]=a[j]/i;
if (b[0]) solve();
}
printf("%d",ans);
return 0;
}
(⊙v⊙)
关键点:
1.把原数列中提取出一个新的数列。
通过枚举,来简化问题。
2.运用特殊的DP技巧
本题的具体操作是,发现了题目中的特殊性。
【JZOJ3601】【广州市选2014】Tree(tree)的更多相关文章
- 【2014广州市选day1】JZOJ2020年9月12日提高B组T4 字符串距离
[2014广州市选day1]JZOJ2020年9月12日提高B组T4 字符串距离 题目 Description 给出两个由小写字母组成的字符串 X 和Y ,我们需要算出两个字符串的距离,定义如下: 1 ...
- 【2014广州市选day1】JZOJ2020年9月12日提高B组T3 消除游戏
[2014广州市选day1]JZOJ2020年9月12日提高B组T3 消除游戏 题目 Description 相信大家玩过很多网络上的消除类型的游戏,一般来说就是在一个大拼图内找出相同的部分进行最大程 ...
- 【2014广州市选day1】JZOJ2020年9月12日提高B组T2 导弹拦截
[2014广州市选day1]JZOJ2020年9月12日提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统 V1.0.但是这种导弹拦截系统有一个缺 ...
- BZOJ5465: [APIO 2018] 选圆圈(K-D Tree)
题意 题目链接 Sol 下面是错误做法,正解请看这里 考虑直接用K-D tree模拟.. 刚开始想的是维护矩形最大最小值,以及子树中最大圆的位置,然后... 实际上最大圆的位置是不用维护的,直接把原序 ...
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- jzoj 6797. 【2014广州市选day2】hanoi
Description 你对经典的hanoi塔问题一定已经很熟悉了.有三根柱子,n个大小不一的圆盘,要求大盘不能压在小盘上,初始时n个圆盘都在第一根柱子上,最少要多少步才能挪到最后一根柱子上? 现在我 ...
- jzoj 6798. 【2014广州市选day2】regions
Description 在平面上堆叠着若干矩形,这些矩形的四边与平面X坐标轴或Y坐标轴平行.下图展示了其中一种情况,3个矩形的边将平面划分成8个区域: 下面展示了另一种稍稍复杂一些的情况: 你的任务是 ...
- 100. Same Tree(Tree)
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre ...
- leetcode@ [236] Lowest Common Ancestor of a Binary Tree(Tree)
https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/ Given a binary tree, find the ...
随机推荐
- Python实例2-逗号代码
假定有下面这样的列表: spam = ['apples', 'bananas', 'tofu', 'cats'] 编写一个函数,它以一个列表值作为参数,返回一个字符串.该字符串包含所有表项,表项之间以 ...
- 启用或禁用对 Exchange Server 中的邮箱的 POP3 或 IMAP4 访问
https://docs.microsoft.com/zh-cn/Exchange/clients/pop3-and-imap4/configure-mailbox-access?view=exchs ...
- jquery刷新局部和全页的方法
一.全页面刷新方法: window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.relo ...
- Tuxera ntfs软件如何删除干净
sudo /Library/Filesystems/fusefs_txantfs.fs/Contents/Resources/Support/uninstall-package.sh
- Android App的设计架构:MVC,MVP,MVVM与架构AAAAA
1. 架构设计的目的1.1 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.1.2 这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率,并且更容易进行后续 ...
- Django--csrf跨站请求伪造、Auth认证模块
form表单中使用跨站请求伪造 { % csrf_token % } 会动态生成一个input框,内部的value是随机刷新的 如果不想校验csrf from django.views.decorat ...
- docker启动单节点server模式的consul | Bitdoom
原文:docker启动单节点server模式的consul | Bitdoom docker启动单节点server模式的consul 2017-09-07 环境:MacOSX, consul_0.9. ...
- TensorFlow的安装 (python3.6在有pip的条件下如何安装TensorFlow)
1.Window,MacOS,Linux都已支持Tensorflow. 2.Window用户只能使用python3.5(64bit).MacOS,Linux支持python2.7和python ...
- 整体二分(模板) 求区间第k小
整体二分,将询问与初值一起放入一个结构体里,然后每次二分判断询问在哪边,树状数组维护,时间复杂度O((n+Q)lognlogMAX_a[i] 代码 #include<iostream> # ...
- IOS下的 click 点击失效
当委托给一个元素添加click事件时,如果事件是委托到 document 或 body 上,并且委托的元素是默认不可点击的(如 div, span 等),此时 click 事件会失效. demo: & ...