CF R631 div2 1330 E Drazil Likes Heap
LINK:Drazil Likes Heap
那天打CF的时候 开场A读不懂题 B码了30min才过(当时我怀疑B我写的过于繁琐了。
C比B简单多了 随便yy了一个构造发现是对的。D也超级简单 dp了一下就没了。
但是到E就只剩下30min(都怪A B浪费我过多时间。
观察题目中给的一个程序 其维护了一个大根堆且这个程序意思是一个函数
这个函数是指对于这个大根堆上的一个非空节点来说每次会将这个值给删掉继承最大的儿子值 然后递归值最大的儿子值得某个节点没有一个非空儿子(那么这个点的值被删掉为0.
题目想让我们进行K次操作 每次操作都进行调用一次f函数 并且K次操作后保证是一个二叉树 并且维护二叉树的形态。
看起来很复杂 但其实发现在某个点x删除 比在x的儿子处删除要优 且x的删除对x的整棵总删除次数没有任何影响。
而且可以证明 光删父亲比两个儿子组合删最后删一次父亲不会更差。所以就不存在先删小的会比先删大的要优了。
所以这是一个裸的贪心 我们直接按照下标贪心的删除即可。考虑到什么时候不能删?每次我们删除某个节点的时候可以提前知道删除的会是哪个位置以此来判断即可。
删完一个节点后 位置的更新由于是二叉树所以为logn的高度 总复杂度nlogn.值得注意删除的过程其实我们在手写大根堆。
const int MAXN=2100000;
int T,n,m,maxx,top;ll cnt;
int a[MAXN],pos[MAXN],d[MAXN],ans[MAXN];
inline void gx(int x)
{
if(!a[x<<1]&&!a[x<<1|1])pos[x]=x;
else
{
if(a[x<<1]>a[x<<1|1])pos[x]=pos[x<<1];
else pos[x]=pos[x<<1|1];
}
}
inline void del(int x)
{
if(pos[x]==x){a[x]=0;return;}
if(a[x<<1]>a[x<<1|1])a[x]=a[x<<1],del(x<<1);
else a[x]=a[x<<1|1],del(x<<1|1);
gx(x);
}
int main()
{
freopen("1.in","r",stdin);
get(T);
while(T--)
{
get(n);get(m);
maxx=(1<<n)-1;cnt=top=0;
rep(1,maxx,i)get(a[i]),d[i]=d[i>>1]+1,cnt+=a[i];
rep(maxx+1,(1<<(n+1))-1,i)a[i]=0;
fep(maxx,1,i)gx(i);
int ww=(1<<m)-1;
rep(1,ww,i)
{
while(d[pos[i]]>m)
{
ans[++top]=i;
cnt-=a[i];
del(i);
}
}
putl(cnt);
rep(1,top,i)printf("%d ",ans[i]);
if(T)puts("");
}
return 0;
}
CF R631 div2 1330 E Drazil Likes Heap的更多相关文章
- Codeforces 631 (Div. 2) E. Drazil Likes Heap 贪心
https://codeforces.com/contest/1330/problem/E 有一个高度为h的大顶堆:有2h -1个不同的正整数,下标从1到2h−1,1<i<2h, a[i] ...
- Codeforces Round #631 div1C(或者div2E) Drazil Likes Heap 题解
题目链接:https://codeforces.com/contest/1329/problem/C 或者:https://codeforces.com/contest/1330/problem/E ...
- Codeforces 1329C - Drazil Likes Heap(堆+贪心)
题目链接 题意 给出一个高度为 h 的大根堆, 要求弹出其中若干个数后高度变为 g, 并且前后大根堆都是满二叉树. 问新的大根堆所有数之和的最小值, 并要给出一种弹出数的操作序列(节点序号). h, ...
- cf 442 div2 F. Ann and Books(莫队算法)
cf 442 div2 F. Ann and Books(莫队算法) 题意: \(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\) 每次查询区间\([l,r]内有多少对(i, ...
- CF #368 div2
题目链接:http://codeforces.com/contest/707/problem/A A. Brain's Photos time limit per test 2 seconds mem ...
- CF#603 Div2
差不多半年没打cf,还是一样的菜:不过也没什么,当时是激情,现在已是兴趣了,开心就好. A Sweet Problem 思维,公式推一下过了 B PIN Codes 队友字符串取余过了,结果今天早上一 ...
- CF#581 (div2)题解
CF#581 题解 A BowWow and the Timetable 如果不是4幂次方直接看位数除以二向上取整,否则再减一 #include<iostream> #include< ...
- [CF#286 Div2 D]Mr. Kitayuta's Technology(结论题)
题目:http://codeforces.com/contest/505/problem/D 题目大意:就是给你一个n个点的图,然后你要在图中加入尽量少的有向边,满足所有要求(x,y),即从x可以走到 ...
- CF 197 DIV2 Xenia and Bit Operations 线段树
线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...
随机推荐
- 区间DP之凸多边形的三角剖分
题目 给定一具有N个顶点(从1到N编号)的凸多边形,每个顶点的权均已知.问如何把这个凸多边形划分成N-2个互不相交的三角形,使得这些三角形顶点的权的乘积之和最小? 输入 第一行 顶点数N(N<5 ...
- Flask-实现下载功能
1. 接口返回真实的文件 这种情况比较简单, flask里带有此类api, 可以用send_from_directory和send_file. 核心代码如下: from flask import se ...
- 记录一下安装hexo的过程
记录一下安装hexo的过程 首先你的电脑需要安装node.js和Git 安装好Git之后需要配置本机与Github之间的ssh方便更新同步博客到Github上,在一个地方新建一个文件夹作为我们博客的根 ...
- shell专题(十一):企业真实面试题(重点)
11.1 京东 问题1:使用Linux命令查询file1中空行所在的行号 答案: [atguigu@hadoop102 datas]$ awk '/^$/{print NR}' sed.txt 问题2 ...
- 输入Javac提示不是内部或外部命令怎么办
首先,我们在电脑上面找到此电脑, 然后右键点击,选择属性. 在属性中,我们找到高级系统设置,点击打开,如图示. 然后在系统设置中,我们可以找到启动和鼓掌恢复,然后点击环境变量,点击打开. ...
- Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件
Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件 前言 公司有购买的监控软件北塔系统监控,由于购买的版权中只包含了有限台数据库服务器的监控,所以只监控了比较重要的几台服务器. 后边 ...
- 隐藏Layer中的Iframe内部元素
隐藏Layer中的Iframe内部元素 1.Layer:一个web弹出层/窗解决方案 2.隐藏Layer弹出层中Iframe内部的元素,例子如下: 这个就是在Layer弹出层内的内容,加载完毕之后,获 ...
- bzoj3891[Usaco2014 Dec]Piggy Back*
bzoj3891[Usaco2014 Dec]Piggy Back 题意: 给定一个N个点M条边的无向图,其中Bessie在1号点,Elsie在2号点,它们的目的地为N号点.Bessie每经过一条边需 ...
- T133309 57级返校测试重测-T2-选票统计
大致题意: 找出个数超过n/4的数们. 基本思路: 一开始我是用map做的,然后就很玄学的TLE了. 啊,那就换个法吧. 先排个序,然后一样的数就在一起了, 再然后直接从前往后遍历一下,就能得出结果了 ...
- three.js 制作属于自己的动态二维码
今天郭先生说一下用canvas解析图片流,然后制作一个动态二维码的小案例,话不多说先上图,在线案例点击博客原文.这是郭先生的微信二维码哦! 1. 解析图片流 canvas = document.cre ...