首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
[APIO2007]风铃 --- 贪心
】的更多相关文章
[APIO2007]风铃 --- 贪心
[APIO2007]风铃 题目描述 你准备给弟弟 Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能被他排成有序形状的东西. 你准备给 Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风铃都包含一些由竖直线连起来的水平杆.每根杆的两头都有线连接,下面或者挂着另一根水平杆,或者挂着一个玩具.下面是一个风铃的例子: 为了满足弟弟,你需要选一个满足下面两个条件的风铃: (1) 所有的玩具都在同一层(也就是说,每个玩具到天花板之间的杆的个数是一样的)或至多相差一层…
洛谷 P3621 [APIO2007]风铃【贪心】
没有算法,但是要注意细节. 首先无解的情况,显然的是最小深度的叶子节点和最大深度的叶子节点的深度差大于1:还有一种比较难想,就是如果一个点的左右子树都有最大和最小深度的叶子节点,这样交换左右子树也不行. 答案比较容易,就是统计一下右子树size>左子树size的节点个数即可. #include<iostream> #include<cstdio> using namespace std; const int N=200005; int n,h[N],cnt,tot,c[N][…
BZOJ1149:[CTSC/APIO2007]风铃——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1149 https://www.luogu.org/problemnew/show/P3621 sb贪心,然而跪了两次才A……一次还是我自己出的样例都没过结果就交了…… dep[i]表示i子树最深深度,up[i]表示i子树是否有不同层的风铃. 那么深搜一下就行了,判断方法看我代码吧……懒得讲了. #include<cmath> #include<queue> #include<…
题解:[APIO2007]风铃
你需要选一个满足下面两个条件的风铃:(1) 所有的玩具都在同一层(也就是说,每个玩具到天花板之间的杆的个数是一样的)或至多相差一层.(2) 对于两个相差一层的玩具,左边的玩具比右边的玩具要更靠下一点.风铃可以按照下面的规则重新排列:任选一根杆,将杆两头的线“交换”.也就是解开一根杆左右两头的线,然后将它们绑到杆的另一头.这个操作不会改变更下面的杆上线的排列顺序. 其实看着这个题目我第一反应是平衡树,像splay,fhq之类的可以完成的区间翻转操作,但是这个题目不同的是,他改变两个之后其内部的顺序…
[洛谷P3621] [APIO2007] 风铃
Description 你准备给弟弟 Ike 买一件礼物,但是,Ike 挑选礼物的方式很特别:他只喜欢那些能被他排成有序形状的东西. 你准备给 Ike 买一个风铃.风铃是一种多层的装饰品,一般挂在天花板上. 每个风铃都包含一些由竖直线连起来的水平杆.每根杆的两头都有线连接,下面或者挂着另一根水平杆,或者挂着一个玩具.下面是一个风铃的例子: 为了满足弟弟,你需要选一个满足下面两个条件的风铃: (1) 所有的玩具都在同一层(也就是说,每个玩具到天花板之间的杆的个数是一样的)或至多相差一层. (2)…
[APIO2007] 风铃
题目链接 可能是个树上 DP?指针真好玩 23333. 首先对于所有玩具如果有深度差超过 1 的就是无解(在这里贡献 WA * 3),所以 dfs 一遍记录深度是有必要的…… 然后如果有一个点的两颗子树中都含有最小.最大深度,那么这种情况也是无解,可以令同时含有两种深度的子树 tag = 1. 然后考虑最少交换次数,对于每一个节点的左右子树,三种情况需要交换: 1. 左边全是小深度的,右边全是大深度的 2. 左边全是小深度的,右边大小深度都有 3. 左边大小深度都有,右边全是大深度的 root-…
LuoguP3621 [APIO2007]风铃
https://zybuluo.com/ysner/note/1140124 题面 题面复杂,戳我 解析 看着这道题... 似乎与[HNOI/AHOI2018]道路有不可言妙的相似之处. (题面吓人,但是题本身很水) 首先明确每个交汇处只能转一次. 那转还是不转呢? 只要转了能使状态更优,就转嘛... 设每个子树有三种状态:\(0\)为只有高玩具,\(1\)为只有低玩具,\(2\)为两者兼备. 于是: 当\(l=2,r=1\)时,转 当\(l=0,r=1\)时,转 当\(l=0,r=2\)时,转…
dp式子100个……
1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2------01背包问题F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]); 3. 线性动态规划1-----朴素最长非降子序列F:=max{f[j]+1} 4. 剖分问题1-----石子合并F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]); 5. 剖分问题2-----多…
dp方程
1. 资源问题1 -----机器分配问题 F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2 ------01背包问题 F[I,j]:=max(f[i-1,j-v]+w,f[i-1,j]); 3. 线性动态规划1 -----朴素最长非降子序列 F:=max{f[j]+1} 4. 剖分问题1 -----石子合并 F[i,j]:=min(f[i,k]+f[k+1,j]+sum[i,j]); 5. …
【apio2007】【ctsc2007】 数据备份 贪心+链表+堆
题目大意:有n个点,k条链,每个点离原点有一定的距离.要你用k条链连接2k个点,使得k条链的长度最短. 首先每次肯定是链相邻的2个点,所以我们先把相邻2个点的差值求出来,得到有n-1个数的数列. 然后问题就变成“在这个数列中寻找k个互不相邻的点,使得它们的和最小”. 我们把所有的数扔进一个堆里,每次贪心找出最小的数,在答案里把它加上. 这时就会出现一个问题:假设我们贪心出了第i个数,那么有可能选第i-1个数和第i+1个数最终的结果优于选第i个数. 所以我们每次贪心时,把找到的那个数的前一个数和后…