zoukankan      html  css  js  c++  java
  • 营业额统计

    题目描述

    思路

    代码

    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <ctime>
    #define min(a, b) ((a) < (b) ? a : b)
    
    const int MAX = (1<<15) + 5;
    int n, m, tot, rt, inf = 0x3f3f3f3f;
    long long ans;
    struct Node {
    	int lc, rc, cnt, size, key, pri;
    	#define lc(x) t[x].lc
    	#define rc(x) t[x].rc
    	#define cnt(x) t[x].cnt
    	#define size(x) t[x].size
    	#define key(x) t[x].key
    	#define pri(x) t[x].pri
    } t[MAX];
    
    void update(int &r) { size(r) = size(lc(r)) + size(rc(r)) + cnt(r); }
    
    void zig(int &r) {
    	int s = lc(r);
    	lc(r) = rc(s);
    	rc(s) = r;
    	size(s) = size(r);
    	update(r);
    	r = s;
    }
    
    void zag(int &r) {
    	int s = rc(r);
    	rc(r) = lc(s);
    	lc(s) = r;
    	size(s) = size(r);
    	update(r);
    	r = s;
    }
    
    void insert(int &r, int k) {
    	if (!r) {
    		r = ++tot;
    		cnt(r) = size(r) = 1;
    		pri(r) = rand(), key(r) = k;
    		return;
    	} else ++size(r);
    	if (k == key(r)) ++cnt(r);
    	else if(k < key(r)) {
    		insert(lc(r), k);
    		if (pri(lc(r)) < pri(r)) zig(r);
    	} else {
    		insert(rc(r), k);
    		if (pri(rc(r)) < pri(r)) zag(r);
    	}
    }
    
    void delt(int &r, int k) {
    	if (k == key(r)) {
    		if (cnt(r) >= 2) cnt(r)--, size(r)--;
    		else if (!lc(r) || !rc(r)) r = lc(r) + rc(r);
    		else if (pri(lc(r)) < pri(r)) zag(r), delt(r, k);
    		else zig(r), delt(r, k);
    		return;
    	}
    	if (k < key(r)) delt(lc(r), k);
    	else delt(rc(r), k);
    }
    
    int queryPre(int k) {
    	int r = rt, res = inf;
    	while (r) {
    		if (key(r) <= k) res = key(r), r = rc(r);
    		else r = lc(r);
    	}
    	return res;
    }
    
    int queryNxt(int k) {
    	int r = rt, res = inf;
    	while (r) {
    		if (key(r) > k) res = key(r), r = lc(r);
    		else r = rc(r);
    	}
    	return res;
    }
    
    int queryKth(int k) {
    	int r = rt, res = inf;
    	while (r) {
    		if (size(lc(r)) < k && size(lc(r)) + cnt(r) >= k) return  key(r);
    		else if (size(lc(r)) >= k) r = lc(r);
    		else k -= size(lc(r)) + cnt(r), r = rc(r); 
    	}
    	return res;
    }
    
    int queryRand(int k) {
    	int r = rt, res = 0;
    	while (r) {
    		if (k == key(r)) return size(lc(r)) + cnt(r) + 1;
    		else if (k < key(r)) r = lc(r);
    		else res += size(lc(r)) + cnt(r), r = rc(r);
    	}
    	return res;
    }
    
    inline int read() {
    	int s = 0, f = 1;
    	char ch = getchar();
    	while(ch < '0' || ch > '9') {
    		if (ch == '-') f = -1;
    		ch = getchar();
    	}
    	while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar();
    	return s * f;
    }
    void write(long long x) {
    	if (x > 9) write(x / 10);
    	putchar(x % 10 + '0');
    }
    int main() {
    	srand(time(NULL));
    	n = read(), m = read();
    	ans = m;
    	insert(rt, m);
    	for (int i = 2, j; i <= n; ++i) {
    		j = read();
    		int a = queryPre(j), b = queryNxt(j);
    		// printf("pre:%d nxt:%d ", a, b);
    		ans += min(abs(j - a), b - j);
    		// printf("ans: %d
    ", ans);
    		insert(rt, j);
    	}
    	write(ans);
    	return 0;
    }
    
  • 相关阅读:
    又玩起了“数独”
    WebService应用:音乐站图片上传
    大家都来DIY自己的Blog啦
    CSS导圆角,不过这个代码没有怎么看懂,与一般的HTML是不同
    网站PR值
    CommunityServer2.0何去何从?
    网络最经典命令行
    炎热八月,小心"落雪"
    Topology activation failed. Each partition must have at least one index component from the previous topology in the new topology, in the same host.
    SharePoint 2013服务器场设计的一些链接
  • 原文地址:https://www.cnblogs.com/liuzz-20180701/p/11543754.html
Copyright © 2011-2022 走看看