妙啊算错时间复杂度了

题目大意:给你一棵$n$个节点的二叉树,每个节点要么是叶子节点,要么拥有恰好两个儿子。

令$m$为叶子节点个数,你需要在这棵二叉树中选择$i$个叶子节点染色,叶节点染色需要一定的代价,非叶子节点代价为两孩子的染色节点数量的异或和乘上一常数。请最小化代价。

数据范围:$n≤4000$。

显然这是一道$dp$题。

令$f[u][i]$表示在以$u$号点为根的子树中,选择$i$个叶子节点染色的最小代价。

若u为叶子节点,不难得出$f[u][0]=0$,$f[u][1]=c[u]$。

我们不难得出$f[u][i+j]=min{f[lc][i]+f[rc][j]+c[u]*(i\ xor\ j)}$,其中$lc$,$rc$表示$u$的左儿子和右儿子,$c[u]$表示$u$号节点的常数。

然后这个$dp$转移,看似是$O(n^3)$的,实际上:

$T(n)=2T(\frac{n}{2})+O(n^2)$。这个实际上还是$O(n^2)$的。。。。。。。。

然后就愉快地做完了,注意卡常。

 #include<bits/stdc++.h>
#define M 4005
#define L long long
#define INF (1<<28)
using namespace std;
int l[M]={},r[M]={},siz[M]={},c[M]={},vis[M]={},f[M][M]={}; void dfs(int x){
if(vis[x]) return; vis[x]=;
if(l[x]==&&r[x]==){
siz[x]=;
f[x][]=; f[x][]=c[x];
return;
}
dfs(l[x]); dfs(r[x]);
siz[x]=siz[l[x]]+siz[r[x]];
for(int i=;i<=siz[l[x]];i++){
for(int j=;j<=siz[r[x]];j++)
f[x][i+j]=min(f[x][i+j],f[l[x]][i]+f[r[x]][j]+c[x]*(i^j));
}
} int Main(){
memset(vis,,sizeof(vis));
int n; scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",l+i,r+i);
for(int i=;i<=n;i++) scanf("%d",c+i);
for(int i=;i<=n;i++) memset(f[i],,(n+)<<);
for(int i=;i<=n;i++) dfs(i);
int rt=; for(int i=;i<=n;i++) if(siz[rt]<siz[i]) rt=i;
for(int i=;i<=siz[rt];i++)
printf("%d ",f[rt][i]);
printf("\n");
}
int main(){
int cas; cin>>cas;
while(cas--) Main();
}

【xsy1120】 支援(assist) dp+卡常的更多相关文章

  1. CH5102/SPOJ?? Mobile Service/P4046 [JSOI2010]快递服务[线性dp+卡常]

    http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%B ...

  2. bzoj5210最大连通子块和 (动态dp+卡常好题)

    卡了一晚上,经历了被卡空间,被卡T,被卡数组等一堆惨惨的事情之后,终于在各位大爹的帮助下过了这个题qwqqq (全网都没有用矩阵转移的动态dp,让我很慌张) 首先,我们先考虑一个比较基础的\(dp\) ...

  3. CodeForces 327E Axis Walking(状压DP+卡常技巧)

    Iahub wants to meet his girlfriend Iahubina. They both live in Ox axis (the horizontal axis). Iahub ...

  4. [CSP-S模拟测试]:卡常题/b(基环树+DP)

    题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...

  5. HDU Typewriter 6583 dp SAM 卡常

    LINK:Typewriter 好久没写SAM了 什么都给忘了. 写了大概2h.感觉被卡常还看了题解. 考虑dp 然后容易想到维护前面的一个j决策 尽可能小. 然后每次考虑向后加一个字符 不过不行就跳 ...

  6. [luogu T71973]卡常者π酱

    [luogu T71973]卡常者π酱 题意 给定一个长度为 \(n\) 的字符串, 要求将字符串分割为若干段, 每一段要么是一个字符要么是前面几段的并的子串. 如果某一段是一个单独字符, 则产生 \ ...

  7. HZOI20190906模拟39 工业,卡常,玄学

    题面:https://www.cnblogs.com/Juve/articles/11484209.html 工业: 推一个式子,AC 没有用组合数....推了2个多小时 我sbsbsbsbsbsbs ...

  8. NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

    工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...

  9. [luogu1972][bzoj1878][SDOI2009]HH的项链【莫队+玄学卡常】

    题目大意 静态区间查询不同数的个数. 分析 好了,成功被这道题目拉低了AC率... 打了莫队T飞掉了,真的是飞掉了QwQ. 蒟蒻想不出主席树的做法,就换成了莫队... 很多人都不知道莫队是什么... ...

随机推荐

  1. java--多线程编程简介

    1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几 ...

  2. 2018.07.30 cogs2632. [HZOI 2016] 数列操作d(线段树)

    传送门 线段树基本操作 区间加等差数列,维护区间和. 对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题. 代码: #include<bits/ ...

  3. SQL查询优化的一些建议

    使用批量查询,而不是N次循环查询! 重复的数据,不要重复获取: 根据需要,按需要获取表字段,而不是SELECT *: 针对频繁的搜索字段,建立必要的索引,以加快查询速度: 使用关联查询,而不是粗暴地类 ...

  4. KindEditor解决上传视频不能在手机端显示的问题

    KindEditor自带的上传视频生成的HTML代码为<embed>,在手机端并不支持.于是可以自己在控件里增加生成video标签相关代码. 参考https://www.jianshu.c ...

  5. js 验证input 输入框

    <h1>js验证输入框内容</h1><br /><br /> 只能输入英文<input type="text" onkeyup ...

  6. spss-非参数检验-K多个独立样本检验( Kruskal-Wallis检验)案例解析

    今天和大家一起探讨和分下一下SPSS-非参数检验--K个独立样本检验 ( Kruskal-Wallis检验). 还是以SPSS教程为例: 假设:HO:   不同地区的儿童,身高分布是相同的 H1: 不 ...

  7. osgearth

    https://max.book118.com/html/2018/0521/167783983.shtm https://baike.1688.com/doc/view-d36134276.html

  8. hdu 1205 吃糖果【鸽巢原理】

    题目 这道题不难,看别人博客的时候发现大家都说用鸽巢原理,这是个什么鬼,于是乎百度之. 1.把某种糖果看做隔板,如果某种糖果有n个,那么就有n+1块区域,至少需要n-1块其他种糖果才能使得所有隔板不挨 ...

  9. nodejs+express+mysql+handsontable

    介绍:做一个医疗数据分析的系统 现在看是写后端的功能,按照PHP的功能,在node上一个个实现. 1.route引用controller,controller引用model,所以会先执行model可以 ...

  10. 【PAT Advanced Level】1015. Reversible Primes (20)

    转换进制&&逆序可以在一起进行,有一点技巧,不要用十进制数来表示低进制,容易溢出. #include <iostream> #include <vector> ...