Hoax or what
题意是询问一个动态序列的最小值和最大值。
可以用multiset来实现。
#include <stdio.h>
#include <set>
using namespace std; int main() {
freopen("h.in", "r", stdin);
freopen("h.ans", "w", stdout);
int n;
while (scanf("%d", &n) && n) {
multiset<int> bills;
int sum = ;
for (int i = ; i < n; i++) {
int cnt;
scanf("%d", &cnt);
for (int j = ; j < cnt; j++) {
int t;
scanf("%d", &t);
bills.insert(t);
} sum += (*bills.rbegin() - *bills.begin()); bills.erase(bills.begin());
bills.erase(--bills.rbegin().base());
}
printf("%d\n", sum);
}
}
这里给出一个最小堆的做法,通过维护一个最小堆,一个最大堆,当push元素时,将这两个元素连接到一起。当pop最大或者最小的元素时,对应删除另一个堆中对应的元素。
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std; const int MAXN = 1e6 + ;
const int INF = 1e9; int min_heap[MAXN], max_heap[MAXN];
int min_heap_no[MAXN], max_heap_no[MAXN];
int min_heap_no_rev[MAXN], max_heap_no_rev[MAXN]; class MinHeap {
protected:
int count, *heap_;
public:
MinHeap() {}
MinHeap(int *heap) : heap_(heap), count() {}
void push(int x) {
++count;
heap_[count] = x;
up(count);
}
int top() {
return heap_[];
}
void pop() {
my_swap(, count--);
heapfy();
}
/*{{{ del(int i)*/
void del(int i) {
heap_[i] = -INF; up(i);
pop();
}
/*}}}*/
virtual void my_swap(int i, int j) {
swap(heap_[i], heap_[j]);
}
/*{{{ heapfy(int i) */
void heapfy(int i) {
while (i <= count) {
int smallest = i;
if ( * i <= count && heap_[ * i] < heap_[smallest]) {
smallest = * i;
}
if ( * i + <= count && heap_[ * i + ] < heap_[smallest]) {
smallest = * i + ;
}
if (i != smallest) {
my_swap(i, smallest);
i = smallest;
} else {
break;
}
}
}
/*}}}*/
/*{{{ up(int i) */
void up(int i) {
while (i > ) {
if (heap_[i] < heap_[i / ]) {
my_swap(i, i / );
i /= ;
} else {
break;
}
}
}
/*}}}*/
}; class MinHeapWithMap : public MinHeap {
private:
int id, *no_, *no_rev_;
public:
MinHeapWithMap() {}
MinHeapWithMap(int *heap, int *no, int *no_rev) : MinHeap(heap), no_(no), no_rev_(no_rev), id() {}
void push(int x) {
no_[count + ] = id;
no_rev_[no_[count + ]] = count + ;
id++;
MinHeap::push(x);
}
virtual void my_swap(int i, int j) {
MinHeap::my_swap(i, j);
swap(no_[i], no_[j]);
no_rev_[no_[i]] = i;
no_rev_[no_[j]] = j;
}
int top_no() {
return no_[];
}
int no_rev(int i) {
return no_rev_[i];
}
}; class Solution {
private:
MinHeapWithMap minHeap_, maxHeap_;
public:
Solution() {
minHeap_ = MinHeapWithMap(min_heap, min_heap_no, min_heap_no_rev);
maxHeap_ = MinHeapWithMap(max_heap, max_heap_no, max_heap_no_rev);
}
void push(int x) {
minHeap_.push(x);
maxHeap_.push(-x);
}
int getMaxMinDiff() {
int res = -maxHeap_.top() - minHeap_.top();
minHeap_.del(minHeap_.no_rev(maxHeap_.top_no()));
maxHeap_.del(maxHeap_.no_rev(minHeap_.top_no()));
minHeap_.pop();
maxHeap_.pop();
return res;
}
}; int main() {
freopen("h.in", "r", stdin);
freopen("h.out", "w", stdout);
int n;
while ( scanf("%d", &n), n) {
Solution s;
int sum = ;
for (int i = ; i < n; i++) {
int k;
scanf("%d", &k);
for (int j = ; j < k; j++) {
int t;
scanf("%d", &t);
s.push(t);
}
sum += s.getMaxMinDiff();
} printf("%d\n", sum);
}
}
Hoax or what的更多相关文章
- UVA 11136 - Hoax or what (可以提交了,不会Submission error了)
看题传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- set UVA 11136 Hoax or what
题目传送门 题意:训练指南P245 分析:set维护,查询删除最大最小值 #include <bits/stdc++.h> using namespace std; typedef lon ...
- 优化Hoax or what的思考
在抽取MinHeap的时候,涉及到重载,覆盖,虚函数等,有几点之前没注意到的问题在这里总结下: 1. 覆盖(override)只要是函数同名就会被覆盖,子类指针若调用父类的同名不同参数的函数的话,会在 ...
- uva 11136 - Hoax or what
用两个优先队列来实现,因为队列只能从一头出去: 所以维护一个数组,来标记这个队列的已经出列而另外一个队列没有出列的元素: 到时候再把他们删了就行: #include<cstdio> #in ...
- UVA 11136 Hoax or what (multiset)
题目大意: 超时进行促销.把账单放入一个箱子里 每次拿取数额最大的和最小的,给出 最大-最小 的钱. 问n天总共要给出多少钱. 思路分析: multiset 上直接进行模拟 注意要使用long lo ...
- UVa 11136 Hoax or what (STL)
题意:有 n 天,每天有m个数,开始的前一天没有数据,然后每天从这个里面拿出一个最大的和最小的,求 n 天的最大的和最小的差值相加. 析:一看就知道用set啊,多简单的STL,不过要注意,开long ...
- Hoax or what UVA - 11136(multiset的应用)
刚开始把题意理解错了,结果样例没过,后来发现每天只处理最大和最小的,其余的不管,也就是说昨天的元素会影响今天的最大值和最小值,如果模拟的话明显会超时,故用multiset,另外发现rbegin()的功 ...
- SQL Server 2008 R2——VC++ ADO 操作 存储过程 向datetime类型参数传入空值
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 越狱Season 1-Episode 15: By the Skin and the Teeth
Season 1, Episode 15: By the Skin and the Teeth -Pope: doctor...you can leave. 医生你得离开 -Burrows: It's ...
随机推荐
- office2013发布博客
0, 喜欢用world记笔记,并查上一些配图.但是再想重新发到博客上,图片不得不重新上传十分蛋疼. world直接发布博客功能太棒了,直接绑定账号和url就可以发送了,爽YY!!! 1,新建一个博客文 ...
- C++四种强制类型转换关键字
C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast ...
- Python 三大神器
Python 三大神器 Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/l ...
- ubuntu grub配置
一.Grub 2包含如下几部分内容:1./boot/grub/grub.cfg 文件2./etc/grub.d/ 文件夹3./etc/default/grub 文件 二.配置和意义: 1.修改grub ...
- putty 实现不用输入用户名密码直接登陆
多谢谢Eric的教程 ,下面是我的简化版,原版为Eric所写 远程登陆Linux服务器有两大著名软件,一个是商业软件securecrt,一个是开源软件putty. 两者的安全性能都很高,发展了多年,值 ...
- 如何查看Oracle的用户权限
ORACLE数据字典视图的种类分别为:USER,ALL 和 DBA. USER_*:有关用户所拥有的对象信息,即用户自己创建的对象信息 ALL_*:有关用户可以访问的对象的信息,即用户自己创建的对象的 ...
- [OC] UITabBarController
1. New CocoaTouch class -> Select Objective C -> named RootViewController 2. Disable APC error ...
- [ Web Service ] [ SOAP ] [ JSON ] [ XML ] 格式轉換
JSON格式產生器_Demo JSON格式產生器_ObjGen - Live JSON Generator JSON格式整理_JSON Formatter & Validator Online ...
- nginx如何实现404状态返回 200隐藏URL
以http://WWW.cnblogs.COM为例: server { listen 80; server_nam ...
- shell curl
最近突然发现了一个有趣的问题:怎样判断日期是工作日还是节假日.(http://www.cnblogs.com/ZXdeveloper/p/4018886.html) 顺便发现了一个有用的网址:http ...