【bzoj2151】种树
题面
传送门
传送门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】种树相关推荐
- [BZOJ2151]种树
同1150 每次取最大,然后把val[l]+val[r]-val[now]放入堆中 /********************************************************* ...
- 【BZOJ2151】种树,贪心+Splay乱搞
Time:2016.08.29 Author:xiaoyimi 转载注明出处谢谢 传送门 模拟题之一 我真不知道怎么证明的 考试的时候纯粹是胡思乱想啊啊啊 具体做法就是把这n个数摆成一个环,记录每个数 ...
- 华华和月月种树(牛客)
题意: 华华看书了解到,一起玩养成类的游戏有助于两人培养感情.所以他决定和月月一起种一棵树.因为华华现在也是信息学高手了,所以他们种的树是信息学意义下的. 华华和月月一起维护了一棵动态有根树,每个点有 ...
- BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...
- 宏基因组合种树第292期—侧柏、樟子松,为祖国绿化做贡献
宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...
- 宏基因组合种树第290期—油松
宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...
- 宏基因组合种树第285期,胡杨专车
宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...
- 宏基因组蚂蚁森林公益合种树项目,支持祖国绿化事业,让世界更美好
宏基因组蚂蚁森林公益合种团队.现诚招队友,带你3000~5000g能量种10~20万能量大树,每天浇水一千,每种树循环种.热爱种树.保证支付宝每天10点前浇水1000g,无水可自行退出,未按时浇水即被 ...
- 宏基因组合种树,2-4天领证
很多朋友都在支付宝里面玩过蚂蚁森林,为大家支持中国绿化公益事业的行动点赞. 有没有羡慕小伙伴满满的植树证书,也希望自己为绿化做贡献,但又感觉自己的力量太渺小. 现在机会来了,宏基因组公众号发起的合种树 ...
最新文章
- android自定义差值器,如何创建自定义插值器以在android中应用翻译动画
- 1台电脑,3个月,没有任何数据支撑!我做出了行业一线标准的识别应用
- [2017.3.23]Miller-Rabin
- 头同尾合十的算法_乘法速算之首同尾合十
- Web浏览器调试工具firebug
- 深度学习自学(十三):Nas+Mnas移动端网络搜索结构
- PVID、Access、Trunk、Hybrid三种不同端口收发规则、Vlan中tagged端口和untagged端口的区别
- 计算机导论学后感5000字,计算机导论学习心得体会
- Proof of Stake FAQ
- 宁波一货船在东海海域沉没
- 22222222222
- 1.海思项目整理 编译烧录+启动参数+sample编译+bayeRGBYUV+MPP(VB+VI+VPSS)
- 在图像中找任意曲线记录
- 孙子兵法 军形第四(翻译)
- Android暗黑模式适配
- 百度富文本编辑器UMeditor使用
- CRM系统的功能有哪些?
- 光伏风电混合并网系统simulink仿真模型 有光伏发电系统、风力发电系统、负载
- html作业布置,布置作业.html
- 如何快速查询ip地址?
热门文章
- 强悍的 Linux —— tar
- 强悍的 Linux —— 强悍的 ls
- Mysql 脚本兼容性测试_MySQL 测试小脚本〔案例〕
- std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书
- python入门教程pdf-《python基础教程(第3版)》高清版PDF免费下载
- python怎么读是什么意思-python中的PEP是什么?怎么理解?(转)
- python能做什么-学了Python都能做什么
- python零基础好学吗-Python零基础好学吗?零基础如何学习Python?
- python基础编程语法-Python基础及语法(十三)
- 向 iOS 设备发送推送通知