题目链接:https://codeforces.com/contest/1329/problem/C

或者:https://codeforces.com/contest/1330/problem/E

(我来装b了,给各位看看我的压行技术,雾)

贪心,如果根节点能删则删,否则把左右儿子当作根分别dfs一下(说明一下,如果删除了某个节点导致深度g以内出现了0就说明不能删,因为这样导致最终无法得到高为g的满二叉堆了)

这里提供一下伪代码,可以和真·代码对照着看

void dfs(int x){
if(a[x]==0)return;
while( 可以删除a[x] ) 删除a[x], 记录x; //记录x因为最后要输出这个
dfs(x*2); dfs(x*2+1);
}

至于为什么这个贪心是对的呢,感性理解一下就是,每次操作,如果删除大儿子节点的收益一定不如删除它的父亲,因此首先要不断删除根节点。如果发现某节点不能删除,其大儿子也必定不能删除,这样可以发现整条链(由大儿子大孙子组成)都无法被删除。这时候考虑这条链上某个节点的小儿子,它一旦被删除也只会变更小,无法翻身成为大儿子,这样保证了整条链的稳定性,所以不能删除的节点终究还是不能删除(怎么好像有点悲伤),因此确实不用考虑不能删除的节点了

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=2100010; typedef long long ll; ll read(){ll x; if(scanf("%lld",&x)==-1)exit(0); return x;}
//#define int ll
int a[N],h,g;
#define lc (x*2) //左儿子编号
#define rc (x*2+1) //右儿子编号
#define bigch (a[lc]>a[rc]?lc:rc) //左右儿子中较大的儿子编号
int height(int x){ //x的高度,即删除x会让多少个数变化
if(a[x]==0)return 0;
return height(bigch)+1;
}
void del(int x){ //删除x,和题目里代码的功能一模一样
if(a[x]==0)return;
a[x]=a[bigch];
del(bigch);
}
vector<int> ans;
void dfs(int x,int dep){ //递归求解,这个函数就是上文伪代码抽象出来的
if(a[x]==0)return;
while(height(x)+dep>g)del(x),ans.push_back(x);
dfs(lc,dep+1); dfs(rc,dep+1);
}
signed main(){
int T=read();
while(T--){
h=read(),g=read();
fill(a,a+(1<<h)*2+2,0); ans.clear();
repeat(i,1,(1<<h))a[i]=read();
dfs(1,0);
ll s=0; repeat(i,1,(1<<g))s+=a[i];
cout<<s<<endl;
for(auto i:ans)cout<<i<<' '; cout<<endl;
}
return 0;
}

Codeforces Round #631 div1C(或者div2E) Drazil Likes Heap 题解的更多相关文章

  1. Codeforces Round #631 (Div. 1) B. Dreamoon Likes Sequences 题解(思维+求贡献)

    题目链接 题目大意 让你构造一个严格单调上升的数组a满足\(1<=a_1<a_2<....a_n<=d\) 而且要使得这个数组的异或前缀和也满足严格单调上升,求有多少个满足条件 ...

  2. 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] ...

  3. Codeforces Round #631 (Div. 2) D. Dreamoon Likes Sequences (bitmasks +dp )

    https://codeforces.com/contest/1330/problem/D 题目大意:给出一个限制 d 与模数 m ,求出可以构造出的满足条件的数组 a 的个数,需要满足以下条件:   ...

  4. Codeforces Round #631 (Div. 2) D.Dreamoon Likes Sequences

    题目连接:Dreamoon Likes Sequences  题意:给你d和m,让你构造一个递增数组a,使数组b(i==1,b[i]=a[i] ; i>1, b[i]=b[i-1]^a[i])递 ...

  5. Codeforces Round #631 (Div. 1) A-C

    在 \(\text{Div. 2/3}\) 混了一个多月后,四个号终于都上紫了,也没用理由不打 \(\text{Div. 1}\) 了.这是我人生中的第一场 \(\text{Div .1}\) ,之前 ...

  6. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  7. CF R631 div2 1330 E Drazil Likes Heap

    LINK:Drazil Likes Heap 那天打CF的时候 开场A读不懂题 B码了30min才过(当时我怀疑B我写的过于繁琐了. C比B简单多了 随便yy了一个构造发现是对的.D也超级简单 dp了 ...

  8. Codeforces Round #539&#542&#543&#545 (Div. 1) 简要题解

    Codeforces Round #539 (Div. 1) A. Sasha and a Bit of Relax description 给一个序列\(a_i\),求有多少长度为偶数的区间\([l ...

  9. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

随机推荐

  1. Linux 安装JDK配置环境(rpm安装和压缩版安装)

    jdk安装 (rpm安装) jdk下载地址: https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html ...

  2. linux硬盘分区和fdisk命令

    分区的几个概念 硬盘分区有三种,主分区.扩展分区.逻辑分区.一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个.且主分区+扩展分区总共不能超过4个.逻辑分区可以有若干个.在windows下 ...

  3. 【Linux】fstab中 每个字段代表的含义

      默认情况下,fstab中已经有了当前的分区配置,内容可能类似: # <file system> <mount point> <type> <options ...

  4. DG主备切换遇到not allwod或者RESOLVABLE GAP解决办法

    今天做switchover,环境是11.2.0.3+OEL5.7,开始时主备库状态都是正常的,符合直接切换条件: 主库: SQL> select open_mode,database_role, ...

  5. 【ORA】ORA-4031错误分析和解决办法

    1. ORA-4031错误的原因,一般是大量的hard parse导致了shared pool中的free list中产生大量的内存小碎片,当一个需要很大内存来进行hard parse的sql语句到来 ...

  6. 【DBA】非常好的一个脚本网站

    今天无意间发下了一个特别好的一个oracle脚本的网站.网站地址如下: https://oracle-base.com/dba/scripts 里面都是一些非常实用的脚本.

  7. P1220 关路灯(区间规划)

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  8. SparkStreaming和Kafka基于Direct Approach如何管理offset实现exactly once

    在之前的文章<解析SparkStreaming和Kafka集成的两种方式>中已详细介绍SparkStreaming和Kafka集成主要有Receiver based Approach和Di ...

  9. spring boot 集成 websocket 实现消息主动

    来源:https://www.cnblogs.com/leigepython/p/11058902.html pom.xml 1 <?xml version="1.0" en ...

  10. 自翻------Office 2013 RT 使用说明

    Office Home and Student 2013 RT Preview的更新 介绍 Microsoft已发布Microsoft Office Home and Student 2013 RT ...