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&#39;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 ...
随机推荐
-
shell流程控制语句
linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while,until),选择语句(case/select).下面我将通过例子介绍下,各个语句使用方法. 1 ...
-
Mathtype(对齐设置)
选左对齐 可以编辑->插入符号->空格符
-
spring可以get到bean,注入却为空
使用spring的时候,已经将要用的bean注入到容器之中却发现在程序中总是报null,后来发现是因为当前的启动类没有在容器之中,所以用上下文可以get到,但是注入却无效
-
python库termcolor用法
termcolor是python中标注文本颜色的库 ANSII Color formatting for output in terminal. 利用termcolor查看log,进行代码调试,清晰标 ...
-
Spark学习之数据读取与保存总结(二)
8.Hadoop输入输出格式 除了 Spark 封装的格式之外,也可以与任何 Hadoop 支持的格式交互.Spark 支持新旧两套Hadoop 文件 API,提供了很大的灵活性. 要使用新版的 Ha ...
-
windows下apache+https环境配置
windows下apache+https环境配置 转 https://www.cnblogs.com/sandaizi/p/7519370.html 1.修改配置文件conf/httpd.conf,去 ...
-
springCloud相关推荐
最近看到微服务很火,也是未来的趋势 所以就去学习下,在dubbo和spring cloud之间我选择了从spring cloud,主要有如下几种原因: dubbo主要专注于微服务中的一个环节--服务治 ...
-
廖雪峰Java2面向对象编程-6Java核心类-6常用工具类
1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数 ...
-
K2 BPM介绍(1)
K2 BPM介绍(1) 官网访问地址: 中文官网 英文官网 它是一个强大的BPM产品 K2 BPM详解 产品特性 与任何内容集成 Integrate with Anything 功能丰富的窗体 Fea ...
-
SQLSERVER NULL值判断
sqlserver 在判断数据条件时,如果数据包含null的话则永远为false,null不参与判断,可以使用isnull(列,默认值)来判断null值的数据列,或者列 is null or 列的条件 ...