题意

传送门

手写堆大法好啊,题解貌似没有结构体堆的做法,思路有些像配对堆,关于配对堆请自行百度,因为本蒟蒻不会。。

以下是蒟蒻的做法:建立一个大根堆a维护最大价值里面存入它的编号以及价值。听说配对堆可以不用定义结构体,但我不会呀!l表示这个位置左边的编号,r同理。一个数组book标记是否可以选择,每次选完之后左右两边进行标记,堆中加入左右之和减去本身的值再将其放入原来的位置,即可达到后悔操作,更新左右编号,然后取m次即可。

#include<bits/stdc++.h>
using namespace std;
int n,m,add,k;
struct node{
int data;//价值
int num;//编号
}a[200010];
int c[200010];
int l[200010],r[200010];
bool book[200010];
long long ans;
void shiftdown(int x){//下调操作,依靠价值进行堆中元素调整
int t,flag=0;
while(2*x<=add&&flag==0){
if(a[x].data<a[2*x].data) t=2*x;
else t=x;
if(2*x+1<=add&&a[t].data<a[2*x+1].data) t=2*x+1;
if(t!=x){
swap(a[t],a[x]);//这里是交换结构体哦
x=t;
}else flag=1;
}
}
void shiftup(int x){//上调操作
int flag=0;
if(x==1) return;
while(x!=1&&flag==0){
if(a[x].data>a[x/2].data) swap(a[x],a[x/2]);
else flag=1;
x/=2;
}
}
int main(){
scanf("%d %d",&n,&m);
if(m>(n>>1)){
printf("Error!");
return 0;
}
for(int i=1;i<=n;++i){
scanf("%d",&c[i]);
a[++add].data=c[i];
a[add].num=i;
l[i]=i-1;
r[i]=i+1;
shiftup(add);//每加入一个新的元素都要进行上调操作
}
l[1]=n,r[n]=1;//环形的
ans=0;
while(m--){//标记过的直接弹出
int x=a[1].num,val=a[1].data;
a[1]=a[add--];
shiftdown(1);
while(book[x]){//注意先把值取出来再弹出哦
x=a[1].num,val=a[1].data;
a[1]=a[add--];
shiftdown(1);
}
ans+=val;
c[x]=c[l[x]]+c[r[x]]-c[x];//左右减去本身
book[l[x]]=1;//标记
book[r[x]]=1;
l[x]=l[l[x]];//新的左边的原来左边的左边
r[x]=r[r[x]];//大体同上
r[l[x]]=x;//左边的右边更新
l[r[x]]=x;//右边的左边更新
a[++add].data=c[x];
a[add].num=x;//放入元素
shiftup(add);
}
printf("%lld",ans);
return 0;
}

题解 bzoj 2151 种树的更多相关文章

  1. [bzoj 2151]种树(贪心)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 分析:原型是bzoj 1150(CTSC 2007) 首先DP无法下手,想到贪心.想到贪 ...

  2. BZOJ 2151 种树(循环链表)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2151 [题目大意] 在一个长度为n的数字环中挑选m个不相邻的数字使得其和最大 [题解] ...

  3. 【刷题】BZOJ 2151 种树

    Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个位置都有一个美观度 ...

  4. bzoj 2151 种树——贪心+后悔

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 似乎是半年+前讲过的.(然而看到的时候却不会了) 考虑贪心,限制就是不能选两边的.如果 ...

  5. bzoj 2151 种树 —— 思路+链表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2151 先都放进堆里取最大的,但选了一个就不能选它两边的,所以可能不是最优,要有“反悔”的措施 ...

  6. BZOJ 2151 种树

    贪心+priority_queue. #include<iostream> #include<cstdio> #include<cstring> #include& ...

  7. bzoj 2151: 种树【贪心+堆】

    和数据备份差不多 设二元组(i,a[i]),开一个大根堆把二元组塞进去,以len排序,每次取出一个二元组 因为单纯的贪心是不行的,所以设计一个"反悔"操作. 记录二元组的前驱pr后 ...

  8. Guard Duty (medium) Codeforces - 958E2 || (bzoj 2151||洛谷P1792) 种树 || 编译优化

    https://codeforces.com/contest/958/problem/E2 首先求出N个时刻的N-1个间隔长度,问题就相当于在这些间隔中选K个数,相邻两个不能同时选,要求和最小 方法1 ...

  9. 【BZOJ 2151】 2151: 种树 (贪心+堆+双向链表)

    2151: 种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n.并且每个 ...

随机推荐

  1. Tomcat发布War包或者Maven项目

    在tomcat的conf目录下面的server.xml中修改如下: Host name="localhost"  appBase="webapps" unpac ...

  2. C# 10分钟完成百度语音技术(语音识别与合成)——入门篇

    我们已经讲了人脸识别(入门+进阶).图片识别(入门).下面是链接: C# 10分钟完成百度人脸识别——入门篇 C# 30分钟完成百度人脸识别——进阶篇(文末附源码) C# 10分钟完成百度图片提取文字 ...

  3. zookeeper中的分布式一致性协议

    1. zookeeper中的一致性协议-ZAB协议 在深入了解ZK之前,相信很多同学都会认为ZK就是Paxos算法的一个实现.但事实上,ZK并没有完全采用Paxos算法,而是使用了一种称为ZooKee ...

  4. 一文读懂JS中的原型和原型链(图解)

    讲原型的时候,我们应该先要记住以下几个要点,这几个要点是理解原型的关键: 1.所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外). 2.所有的引用类型都有一个’_ _ proto_ ...

  5. Css3动画效果,彩色文字效果,超简单的loveHeart

    <!DOCTYPE html><html><head><meta charset="utf-8" /><title>Cs ...

  6. (16)ASP.NET Core 通用主机(HostBuilder)

    1.前言 ASP.NET Core应用程序可以配置和启动主机(Host).主机负责应用程序启动和生命周期管理.通用主机用于无法处理HTTP请求的应用程序.通用主机的用途是将HTTP管道从Web主机AP ...

  7. 【0805 | Day 8】Python进阶(二)

    列表类型内置方法 一.列表类型内置方法(list) 用途:多个爱好.多个武器.多种化妆品 定义:[ ]内可以有多个任意类型的值,逗号分隔元素 # my_boy_friend = list(['jaso ...

  8. 阿里云短信服务(JAVA)

    一,前言 ​ 短信验证码想必大家都不陌生,在很多网站,APP中都有使用到.比如登录,注册,身份校验等场景.不过通常情况下,短信服务都是外包给第三方公司的,接下来向大家分享如何使用阿里的短信服务. 二, ...

  9. .NET中的缓存

    构建高性能的应用程序的非常重要一项就是使用缓存.使用缓存可以避免重新从读取服务器端读取数据,节省数据从客户端到服务器间往返的时间,同时也减轻了服务器数据存取的压力.如果客户端非常频繁地读取服务器上的数 ...

  10. AutoResetEvent控制线程用法

    本文主要来自一道面试题,由于之前对AutoResetEvent的用户很模糊(即使已经使用过了).面试题题目很简洁:两个线程交替打印0~100的奇偶数.你可以先动手试试,我主要是尝试在一个方法里面完成这 ...