【xsy1120】 支援(assist) dp+卡常
妙啊算错时间复杂度了
题目大意:给你一棵$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+卡常的更多相关文章
- 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 ...
- bzoj5210最大连通子块和 (动态dp+卡常好题)
卡了一晚上,经历了被卡空间,被卡T,被卡数组等一堆惨惨的事情之后,终于在各位大爹的帮助下过了这个题qwqqq (全网都没有用矩阵转移的动态dp,让我很慌张) 首先,我们先考虑一个比较基础的\(dp\) ...
- CodeForces 327E Axis Walking(状压DP+卡常技巧)
Iahub wants to meet his girlfriend Iahubina. They both live in Ox axis (the horizontal axis). Iahub ...
- [CSP-S模拟测试]:卡常题/b(基环树+DP)
题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...
- HDU Typewriter 6583 dp SAM 卡常
LINK:Typewriter 好久没写SAM了 什么都给忘了. 写了大概2h.感觉被卡常还看了题解. 考虑dp 然后容易想到维护前面的一个j决策 尽可能小. 然后每次考虑向后加一个字符 不过不行就跳 ...
- [luogu T71973]卡常者π酱
[luogu T71973]卡常者π酱 题意 给定一个长度为 \(n\) 的字符串, 要求将字符串分割为若干段, 每一段要么是一个字符要么是前面几段的并的子串. 如果某一段是一个单独字符, 则产生 \ ...
- HZOI20190906模拟39 工业,卡常,玄学
题面:https://www.cnblogs.com/Juve/articles/11484209.html 工业: 推一个式子,AC 没有用组合数....推了2个多小时 我sbsbsbsbsbsbs ...
- NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」
工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...
- [luogu1972][bzoj1878][SDOI2009]HH的项链【莫队+玄学卡常】
题目大意 静态区间查询不同数的个数. 分析 好了,成功被这道题目拉低了AC率... 打了莫队T飞掉了,真的是飞掉了QwQ. 蒟蒻想不出主席树的做法,就换成了莫队... 很多人都不知道莫队是什么... ...
随机推荐
- 2018.09.28 牛客网contest/197/C期望操作数(状态转移+前缀和递推)
传送门 比赛手动打了四项感觉有规律,调了40min+之后重新手算了后面几项发现只有前四项满足规律233. 首先这道题只跟q−xq-xq−x有关. 我们尝试找找递推关系. 我们令f[i]f[i]f[i] ...
- HDU 3177 Crixalis's Equipment (贪心,差值)
题意:判断 n 件物品是否可以搬进洞里,每件物品有实际体积A和移动时的额外体积 B . 析:第一反应就是贪心,一想是不是按B从大到小,然后一想,不对,比如体积是20,第一个 是A=11, B=19.第 ...
- 静态代码块和this
/* 静态代码块.随着类的加载而执行.而且只执行一次. 作用: 用于给类进行初始化. */class StaticCode{ static int num ; static { num = 10;// ...
- [转]谈谈 Mifare Classic 破解
Mifare Classic 提供 1 Kb - 4Kb 的容量,现在国内采用的多数是 Mifare Classic 1k(S50)[后面简称 M1 卡] M1 卡有从 0 到 15 共 16 个扇区 ...
- afx_msg解释
以前一直不知道AFX_MSG是什么意思,只是觉得它应该是个消息映射函数,但是具体代表什么意思,会返回一个什么样的值是一点都不清楚,今天查了下资料,把查到的东西放这,以免以后忘了还得再查. 在头文件(D ...
- hdu 2845 Beans 2016-09-12 17:17 23人阅读 评论(0) 收藏
Beans Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- cried me a river--kristinia debarge
cried me a river--kristinia debarge I still remember the day that we metI hold on to every word you ...
- java递归和反向递归
1. 递归查询树tree结构有两种做法: 第一种,递归查询数据库结构, 第二种,一次性将数据库表中的所有数据查出来,然后再递归查出来的list集合, 第一种做法适合数据量较少的tree结构,因为要一直 ...
- echarts呈现数据表图形
讲一下echarts的用法,列举了两个图表,一个是单柱图,一个是多柱图,至于饼状图,只许更改echarts的类型就好了 一.首先是要两个div,用来存放两个图表 <div class=" ...
- c# 调用短信平台接口,给手机发送短信
项目上要做个发手机短信的功能.网上找找了,用的微米的短信接口. 注册后,获得UID和UID key,C#代码中需要这个 调用代码很简单 ", con = "[微米]您的验证码是:6 ...