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的更多相关文章

  1. UVA 11136 - Hoax or what (可以提交了,不会Submission error了)

    看题传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. set UVA 11136 Hoax or what

    题目传送门 题意:训练指南P245 分析:set维护,查询删除最大最小值 #include <bits/stdc++.h> using namespace std; typedef lon ...

  3. 优化Hoax or what的思考

    在抽取MinHeap的时候,涉及到重载,覆盖,虚函数等,有几点之前没注意到的问题在这里总结下: 1. 覆盖(override)只要是函数同名就会被覆盖,子类指针若调用父类的同名不同参数的函数的话,会在 ...

  4. uva 11136 - Hoax or what

    用两个优先队列来实现,因为队列只能从一头出去: 所以维护一个数组,来标记这个队列的已经出列而另外一个队列没有出列的元素: 到时候再把他们删了就行: #include<cstdio> #in ...

  5. UVA 11136 Hoax or what (multiset)

    题目大意: 超时进行促销.把账单放入一个箱子里 每次拿取数额最大的和最小的,给出 最大-最小  的钱. 问n天总共要给出多少钱. 思路分析: multiset 上直接进行模拟 注意要使用long lo ...

  6. UVa 11136 Hoax or what (STL)

    题意:有 n 天,每天有m个数,开始的前一天没有数据,然后每天从这个里面拿出一个最大的和最小的,求 n 天的最大的和最小的差值相加. 析:一看就知道用set啊,多简单的STL,不过要注意,开long ...

  7. Hoax or what UVA - 11136(multiset的应用)

    刚开始把题意理解错了,结果样例没过,后来发现每天只处理最大和最小的,其余的不管,也就是说昨天的元素会影响今天的最大值和最小值,如果模拟的话明显会超时,故用multiset,另外发现rbegin()的功 ...

  8. SQL Server 2008 R2——VC++ ADO 操作 存储过程 向datetime类型参数传入空值

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  9. 越狱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 ...

随机推荐

  1. 坑爹系列:sizeof运算符

    C语言里的sizeof关键字用于返回变量的类型宽度(变量所占的字节个数).例如: #include <stdio.h> int main() { int i = 0; int size = ...

  2. ASP.NET的错误处理机制

    对于一个Web应用程序来说,出错是在所难免的,因此我们应该未雨绸缪,为可能出现的错误提供恰当的处理.事实上,良好的错误处理机制正是衡量Web应用程序好坏的一个重要标准.试想一下,当用户不小心在浏览器输 ...

  3. python 自动化之路 day 10 协程、异步IO、队列、缓存

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...

  4. [DevExpress]GridControl 同步列头checkbox与列中checkbox状态

    关键代码: /// <summary> /// 同步列头checkbox与列中checkbox状态 /// </summary> /// <param name=&quo ...

  5. 就谈个py 的装饰器 decorator

    很早很早就知道有这么个 装饰器的东西,叫的非常神秘. 包括c#  和 java 中都有这个东西, c#中叫做attribut 特性,java中叫做Annotation 注解,在偷偷学习c#教程的时候, ...

  6. PHP 对数组数值进行排序,使用另一个容器

    <?php /* 排序方式::事实上只需要将要循环的数组进行N次循环,然后每次取最大的一个值*/ $array = array(100,25,10,258,33,48,10,5,13,58,33 ...

  7. Python拷贝及多进程与类的问题

    最近写python写的尤其不顺利,更多的debug,逐渐的深入,产出却比较少.应该是个瓶颈期,坚持坚持,厚着脸皮也要坚持下去. 0x00 拷贝问题 程序中涉及到多进程和协程,大致的模型是开了2+个进程 ...

  8. Linux操作系统

    Linux操作系统 linux源码分析(三)-start_kernel 2016-10-26 11:01 by 轩脉刃, 146 阅读, 收藏, 编辑 前置:这里使用的linux版本是4.8,x86体 ...

  9. c++ deque 双端队列

    双端队列: 函数 描述 c.assign(beg,end)c.assign(n,elem)  将[beg; end)区间中的数据赋值给c.将n个elem的拷贝赋值给c. c.at(idx)  传回索引 ...

  10. Mapped Statements collection does not contain value for

    这是由pojo的映射文件的命名空间引起的错误. 按照以下格式即可:命名空间中一定要含有mapper.xxMapper这样的格式,否则出现以上错误. <?xml version="1.0 ...