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 ...
随机推荐
- Cow Relays,过N条边的最短路
题目链接 题意: 找从a到b的经过N条边的最短路 分析: 有点板子...方法:矩阵存,然后有个类似快速幂的思想,然后再加上离散化就好了. 没啥写的,只能说说矩阵了,我用的方法是先枚举i,j再枚举k,当 ...
- Github 新玩法 -- Profile ReadMe
Github 新玩法 -- Profile ReadMe Intro 今天刷 Github 的时候偶然发现一个新的玩法,Github Profile ReadMe,可以在个人的 Profile 页面展 ...
- ElasticSearch 定时批量删除N天前的数据
描述: 之前我已经完成了使用ElasticSearch.kibana.filebeat.三个工具完成分布式集群收集 分布在各个ip地址上的微服务日志,这样就可以统一的在一个服务器上查看了所有的微服务产 ...
- javascript知识梳理之数据类型
javascript基础知识(在javascript中 = 是赋值符号) 变量 合法的变量命名规则:大小写英文.数字. $ 和 _ 的组合,且不能用数字开头. var a; //声明变量 var s ...
- linux专题(八):用户组管理
http://dwz.date/UDf 每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理.不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个 ...
- Vue你不得不知道的异步更新机制和nextTick原理
前言 异步更新是 Vue 核心实现之一,在整体流程中充当着 watcher 更新的调度者这一角色.大部分 watcher 更新都会经过它的处理,在适当时机让更新有序的执行.而 nextTick 作为异 ...
- CentOS 7 内核RPM方式升级
RPM包下载地址: https://elrepo.org/linux/kernel/el7/x86_64/RPMS/ 选择lt版本(长期支持) #下载内核RPM包,这里是kernel-lt-4.4.- ...
- Java图片验证码生成工具
直接把以下代码拷贝使用: import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;impo ...
- CISSP 考试经验分享
复习资料: <Eleventh Hour CISSP> <汇哲培训讲义> <CISSP Official Security Professional>Eighth ...
- OSCP Learning Notes - Post Exploitation(2)
Windows Post Exploitation Target Server: IE8-Win 7 VM 1. Download and upload the fgdump, PwDump7, wc ...