zoukankan      html  css  js  c++  java
  • Hoax or what

    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 = 0;
            for (int i = 0; i < n; i++) {
                int cnt;
                scanf("%d", &cnt);
                for (int j = 0; 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
    ", sum);
        }
    }

    这里给出一个最小堆的做法,通过维护一个最小堆,一个最大堆,当push元素时,将这两个元素连接到一起。当pop最大或者最小的元素时,对应删除另一个堆中对应的元素。

    #include <stdio.h>
    #include <algorithm>
    #include <iostream> 
    using namespace std;
    
    const int MAXN = 1e6 + 5;
    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(0) {}
        void push(int x) {
            ++count;
            heap_[count] = x;
            up(count);
        }
        int top() {
            return heap_[1];
        }
        void pop() {
            my_swap(1, count--);
            heapfy(1);
        }
        /*{{{ 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 (2 * i <= count && heap_[2 * i] < heap_[smallest]) {
                    smallest = 2 * i;
                }
                if (2 * i + 1 <= count && heap_[2 * i + 1] < heap_[smallest]) {
                    smallest = 2 * i + 1;
                }
                if (i != smallest) {
                    my_swap(i, smallest);
                    i = smallest;
                } else {
                    break;
                }
            }
        }
        /*}}}*/
        /*{{{ up(int i) */
        void up(int i) {
            while (i > 1) {
                if (heap_[i] < heap_[i / 2]) {
                    my_swap(i, i / 2);
                    i /= 2;
                } 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(0) {}
        void push(int x) {
            no_[count + 1] = id;
            no_rev_[no_[count + 1]] = count + 1;
            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_[1];
        }
        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 = 0;
            for (int i = 0; i < n; i++) {
                int k;
                scanf("%d", &k);
                for (int j = 0; j < k; j++) {
                    int t;
                    scanf("%d", &t);
                    s.push(t);
                }
                sum += s.getMaxMinDiff();
            }
    
            printf("%d
    ", sum);
        }
    }
  • 相关阅读:
    SSL/TLS
    openssl数字证书常见格式 协议
    Jetty 与 Tomcat 的比较
    Spring Boot 邮件配置
    SSL与TLS的区别以及介绍
    pring Boot 与Spring Cloud版本对应
    iOS initWithFrame、initWithCoder、awakeFromNib的区别解析
    浅析iOS tableview的selectRowAtIndexPath选中无效(默认选中cell无效)
    iOS 多线程NSThread理解与场景示例
    iOS7 UIWebview加载进度条实现
  • 原文地址:https://www.cnblogs.com/litstrong/p/3283070.html
Copyright © 2011-2022 走看看