【洛谷】【treap/堆】P2073 送花
【题目描述:】
这些花都很漂亮,每朵花有一个美丽值W,价格为C。
小明一开始有一个空的花束,他不断地向里面添加花。他有以下几种操作:
操作 含义
1 W C 添加一朵美丽值为W,价格为C的花。
3 小明觉得当前花束中最便宜的一朵花太廉价,不适合送给小红,所以删除最便宜的一朵花。
2 小明觉得当前花束中最贵的一朵花太贵,他心疼自己的钱,所以删除最贵的一朵花。
-1 完成添加与删除,开始包装花束
若删除操作时没有花,则跳过删除操作。
如果加入的花朵价格已经与花束中已有花朵价格重复,则这一朵花不能加入花束。
请你帮小明写一个程序,计算出开始包装花束时,花束中所有花的美丽值的总和,以及小明需要为花束付出的总价格。
【输入格式:】
若干行,每行一个操作,以-1结束。
【输出格式:】
一行,两个空格隔开的正整数表示开始包装花束时,花束中所有花的美丽值的总和。以及小明需要为花束付出的总价格。
/*
输入样例#1:
1 1 1
1 2 5
2
1 3 3
3
1 5 2
-1
输出样例#1:
8 5
*/
输入输出样例
【算法分析:】
方法一:红黑树.
手写红黑树是不可能的,但是可以用stl里的map水(set好像也可以不过应该比map慢一些)
map里的key-value其实就是pair,而且map里的元素是有序的:
默认按key从小到大排,所以求c的最值时应把make_pair(c, w)加入map
所以删除最小的元素就是删除map中的第一个元素,删除最大的元素就是删除map中的最后一个。
删除操作可以通过erase(iterator)来实现,定义一个map<int, int> a,
则第一个元素的位置为a.begin()
最后一个元素的位置就是 --a.end()
最后累加的时候通过迭代器遍历map,用a->first和a->second访问key, value的值
去重的话加一个bool数组去重就好
//P2073 送花
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#define mkp make_pair
#define fi first
#define se second
using namespace std; const int MAXN = + ; map<int, int> a;
bool vis[MAXN]; int main() {
int fl, w, c;
while(scanf("%d", &fl) == && fl != -) {
if(fl == ) {
scanf("%d%d", &w, &c);
if(vis[c]) continue;
a.insert(mkp(c, w));
vis[c] = ;
}
if(fl == ) {
if(!a.size()) continue;
map<int, int>::iterator it;
it = a.end();
--it; vis[it->fi] = ;
a.erase(it);
}
if(fl == ) {
if(!a.size()) continue;
map<int, int>::iterator it;
it = a.begin();
vis[it->fi] = ;
a.erase(it);
}
}
long long sum1 = , sum2 = ;
map<int, int>::iterator it;
for(it=a.begin(); it!=a.end();++it)
sum1 += it->se, sum2 += it->fi;
printf("%lld %lld\n", sum1, sum2);
}
map实现
方法二:堆
要求最大值和最小值并删除,很容易想到通过堆来实现
开一个小根堆p1和一个大根堆p2,
vis[c]表示价格为c的花的美丽度,vis[c]=0表示没有这朵花
每次读入把c分别push进两个堆里,记录vis[c]
两个变量sum1, sum2分别累加c和w,
在删除的时候sum1, sum2要分别减去c和vis[c]
//P2073 送花
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; const int MAXN = + ; int vis[MAXN];
priority_queue<int, vector<int>, greater<int> > q1;
priority_queue<int> q2; int main() {
int fl, w, c;
long long sum1 = , sum2 = ;
while(scanf("%d", &fl) == && fl != -) {
if(fl == ) {
scanf("%d%d", &w, &c);
if(vis[c]) continue;
q1.push(c), q2.push(c);
vis[c] = w;
sum1 += w, sum2 += c;
}
if(fl == ) {
while(!q2.empty() && !vis[q2.top()]) q2.pop();
if(q2.empty()) continue;
int t = q2.top();
sum1 -= vis[t];
sum2 -= t;
vis[t] = ;
q2.pop();
}
if(fl == ) {
while(!q1.empty() && !vis[q1.top()]) q1.pop();
if(q1.empty()) continue;
int t = q1.top();
sum1 -= vis[t];
sum2 -= t;
vis[t] = ;
q1.pop();
}
}
printf("%lld %lld\n", sum1, sum2);
}
堆实现
【洛谷】【treap/堆】P2073 送花的更多相关文章
- 洛谷P3378堆
传送门啦 #include <iostream> #include <cstdio> #include <cstring> #include <algorit ...
- 洛谷P2073 送花 [2017年6月计划 线段树01]
P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...
- 洛谷 P3377 【模板】左偏树(可并堆)
洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- (treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- 洛谷P3369普通平衡树(Treap)
题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- 堆学习笔记(未完待续)(洛谷p1090合并果子)
上次讲了堆,别人都说极其简单,我却没学过,今天又听dalao们讲图论,最短路又用堆优化,问懂了没,底下全说懂了,我???,感觉全世界都会了堆,就我不会,于是我决定补一补: ——————来自百度百科 所 ...
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...
随机推荐
- MyEclipse在不同编辑面间快速切换
想在下面的编辑页面间切换有两种方式,一种是按“栈”方式切换,一种是按“链表”方式切换. 按栈方式切换: Alt + 左箭头: 上一次编辑页面 Alter + 右箭头 : 下一个编辑也页面 按链表(绝对 ...
- SpringBoot配置——@PropertySource、@ImportResource、@Bean
@PropertySource:加载指定的配置文件 package com.hoje.springboot.bean; import org.springframework.beans.factory ...
- 视区相关单位vw, vh..简介以及可实际应用场景——张鑫旭
一.N多的唠哩唠叨 CSS3中一些新的单位早在去年春暖花开的时候就介绍了,参见:CSS长度值及时间.频率.角度单位.显然,其中就提到了本文要感叹的单位vw, vh,见下图: 不过“我看见你”和“我触碰 ...
- jQuery基础(DOM篇,append(),after(),prepend(),insertAfter(),节点删除,遍历方法each())
1.DOM创建节点及节点属性 创建流程比较简单,大体如下: - 创建节点(常见的:元素.属性和文本) - 添加节点的一些属性 - 加入到文档中 流程中涉及的一点方法: - 创建元素:d ...
- 超级简单的jquery轮播图demo
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Android Studio最全插件整理
在Android开发中,合理的使用Android Studio插件不但可以提高开发效率,还能从整体上提高代码的质量.下面就Android开发中常见的一些插件做一个整理. 1,GsonFormatGso ...
- wdcpV3面板安装ssl证书 apache教程 子站SSL配置
本帖最后由 q1082121 于 2016-11-24 12:31 编辑 方案二 apache1.把apache类型的ssl三个文件上传到:/www/wdlinux//www/wdlinux/http ...
- 4.Servlet过滤器
1.Servlet 编写过滤器 Servlet 过滤器是可用于 Servlet 编程的 Java 类,有以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理 ...
- Sql Server中的谓词和运算符
谓词和运算符配合使用是我们得到理想数据的最佳途径. 一.浅谈谓词 谓词的概念:一个运算结果为True.False或Unknown的逻辑表达式.它的运用范围有:where子句.Having子句.Chec ...
- C# 判断程序是否已经在运行
方式1: /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { //获取欲启 ...