题面

传送门
传送门2

题解

如果没有相邻限制的话,我们开一个大根堆每一次取最大的就行了,但是如果存在限制,我们就加入一个后悔操作,来做调整贪心。
首先如果我们选择了一个点i,那么其相邻的点i−1,i+1,都不能选了,所以我们删除这两个点,因为i与它们两个是互斥的。
所以我们加入后悔操作的时候,是用两者之和减去a[i],即我们每选择一个点,我们就加入一个新节点 node(i,a[i+1]+a[i−1]−a[i]),这样就可以做到满足限制条件下的调整了,另外就是维护位置,可以链表直接 O(1)做,或者set维护一下也可。

1、链表写法
#include<iostream>
#include<queue>
using namespace std;
const int maxn = 200005;struct node{int id, val;node(int id, int val):id(id),val(val){}bool operator < (const node &b)const{return val<b.val;}
};
priority_queue<node>q;int vis[maxn], pre[maxn], nxt[maxn];
void change(int x){vis[x] = 1;  //vis[i]==1,不在链表里的点。nxt[pre[x]] = nxt[x];pre[nxt[x]] = pre[x];pre[x] = 0; nxt[x] = 0;
}int main(){int n, m, a[maxn];cin>>n>>m;if(n<2*m){cout<<"Error!\n"; return 0;}for(int i = 1; i <= n; i++){ cin>>a[i]; q.push(node(i,a[i])); }for(int i = 2; i <= n; i++)pre[i] = i-1; pre[1]=n;for(int i = 1; i < n; i++)nxt[i] = i+1; nxt[n]=1;long long ans = 0;for(int i = 1; i <= m; i++){while(vis[q.top().id])q.pop();node t = q.top();  q.pop();ans += t.val;int l = pre[t.id], r = nxt[t.id];change(l);  change(r);a[t.id] = a[l]+a[r]-a[t.id];q.push(node(t.id,a[t.id]));//反悔节点}cout<<ans<<'\n';return 0;
}
2、STL写法
#include<iostream>
#include<queue>
#include<set>
using namespace std;
const int maxn = 200005;int n, m, a[maxn];
struct node{int id, val;node(int id, int val):id(id),val(val){}bool operator < (const node &b)const{return val<b.val; }
};
struct data{int id, val;data(int id, int val):id(id),val(val){}bool operator < (const data &b)const{return id<b.id; }
};
priority_queue<node>q;
set<data>s;
set<data>::iterator pre,nxt;int main(){cin>>n>>m;if(n<2*m){cout<<"Error!\n";return 0;}for(int i = 1; i <= n; i++){cin>>a[i];  q.push(node(i,a[i]));s.insert(data(i,a[i]));}long long ans = 0;for(int i = 1; i <= m; i++){node t = q.top();  q.pop();while(!s.empty() && s.find(data(t.id,t.val))==s.end()){ t = q.top();  q.pop();}ans += t.val;if(i == m)break;data now = data(t.id,t.val);nxt = s.upper_bound(now);pre = s.lower_bound(now);if(nxt == s.end())nxt = s.begin();if(pre == s.begin())pre = --s.end();else --pre;data to = data(t.id,pre->val+nxt->val-t.val);s.erase(s.find(now));s.erase(pre);s.erase(nxt);s.insert(to);q.push(node(to.id,to.val));}cout<<ans<<"\n";return 0;
}
3、最后

垃圾样例怎么改都是对的。

【bzoj2151】种树相关推荐

  1. [BZOJ2151]种树

    同1150 每次取最大,然后把val[l]+val[r]-val[now]放入堆中 /********************************************************* ...

  2. 【BZOJ2151】种树,贪心+Splay乱搞

    Time:2016.08.29 Author:xiaoyimi 转载注明出处谢谢 传送门 模拟题之一 我真不知道怎么证明的 考试的时候纯粹是胡思乱想啊啊啊 具体做法就是把这n个数摆成一个环,记录每个数 ...

  3. 华华和月月种树(牛客)

    题意: 华华看书了解到,一起玩养成类的游戏有助于两人培养感情.所以他决定和月月一起种一棵树.因为华华现在也是信息学高手了,所以他们种的树是信息学意义下的. 华华和月月一起维护了一棵动态有根树,每个点有 ...

  4. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  5. 宏基因组合种树第292期—侧柏、樟子松,为祖国绿化做贡献

    宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...

  6. 宏基因组合种树第290期—油松

    宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...

  7. 宏基因组合种树第285期,胡杨专车

    宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...

  8. 宏基因组蚂蚁森林公益合种树项目,支持祖国绿化事业,让世界更美好

    宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...

  9. 宏基因组合种树,2-4天领证

    很多朋友都在支付宝里面玩过蚂蚁森林,为大家支持中国绿化公益事业的行动点赞. 有没有羡慕小伙伴满满的植树证书,也希望自己为绿化做贡献,但又感觉自己的力量太渺小. 现在机会来了,宏基因组公众号发起的合种树 ...

最新文章

  1. android自定义差值器,如何创建自定义插值器以在android中应用翻译动画
  2. 1台电脑,3个月,没有任何数据支撑!我做出了行业一线标准的识别应用
  3. [2017.3.23]Miller-Rabin
  4. 头同尾合十的算法_乘法速算之首同尾合十
  5. Web浏览器调试工具firebug
  6. 深度学习自学(十三):Nas+Mnas移动端网络搜索结构
  7. PVID、Access、Trunk、Hybrid三种不同端口收发规则、Vlan中tagged端口和untagged端口的区别
  8. 计算机导论学后感5000字,计算机导论学习心得体会
  9. Proof of Stake FAQ
  10. 宁波一货船在东海海域沉没
  11. 22222222222
  12. 1.海思项目整理 编译烧录+启动参数+sample编译+bayeRGBYUV+MPP(VB+VI+VPSS)
  13. 在图像中找任意曲线记录
  14. 孙子兵法 军形第四(翻译)
  15. Android暗黑模式适配
  16. 百度富文本编辑器UMeditor使用
  17. CRM系统的功能有哪些?
  18. 光伏风电混合并网系统simulink仿真模型 有光伏发电系统、风力发电系统、负载
  19. html作业布置,布置作业.html
  20. 如何快速查询ip地址?

热门文章

  1. 强悍的 Linux —— tar
  2. 强悍的 Linux —— 强悍的 ls
  3. Mysql 脚本兼容性测试_MySQL 测试小脚本〔案例〕
  4. std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书
  5. python入门教程pdf-《python基础教程(第3版)》高清版PDF免费下载
  6. python怎么读是什么意思-python中的PEP是什么?怎么理解?(转)
  7. python能做什么-学了Python都能做什么
  8. python零基础好学吗-Python零基础好学吗?零基础如何学习Python?
  9. python基础编程语法-Python基础及语法(十三)
  10. 向 iOS 设备发送推送通知