【bzoj1588】[HNOI2002]营业额统计

题目描述:

营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。

输入:

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。

输出:

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

样例输入:

6
5
1
2
5
4
6

样例输出:
12

题解:

双向链表,从后往前算,算完然后再删点。(以下代码在bzoj上会RE,把读入优化改成scanf即可ac)

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

#ifdef WIN32
	#define LL "%I64d"
#else
	#define LL "%lld"
#endif

#ifdef CT
	#define debug(...) printf(__VA_ARGS__)
	#define setfile() 
#else
	#define debug(...)
	#define filename ""
	#define setfile() freopen(filename".in", "r", stdin); freopen(filename".out", "w", stdout);
#endif

#define R register
#define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
#define dmax(_a, _b) ((_a) > (_b) ? (_a) : (_b))
#define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
#define cmax(_a, _b) (_a < (_b) ? _a = (_b) : 0)
#define cmin(_a, _b) (_a > (_b) ? _a = (_b) : 0)
char B[1 << 15], *S = B, *T = B;
inline int FastIn()
{
	R char ch; R int cnt = 0; R bool minus = 0;
	while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
	ch == '-' ? minus = 1 : cnt = ch - '0';
	while (ch = getc(), ch >= '0' && ch <= '9') cnt = cnt * 10 + ch - '0';
	return minus ? -cnt : cnt;
}
#define maxn 32768
#define INF 23333333
#define cabs(_x) ((_x) > 0 ? (_x) : -(_x))
struct Node
{
	int v, pos;
	Node *l, *r;
}p[maxn], *e[maxn];
inline bool cmp(R Node *a, R Node *b) {return a->v < b->v;}
int main()
{
	//setfile();
	R int n = FastIn(), ans = 0;
	for (R int i = 1; i <= n; ++i)
		p[i].v = FastIn(), p[i].pos = i, e[i] = p + i;
	p[0].v = -INF; p[n + 1].v = INF;
	e[0] = p + 0;
	e[n + 1] = p + n + 1;
	std::sort(e + 1, e + n + 1, cmp);
	for (R int i = 1; i <= n; ++i)
	{
		e[i]->l = e[i - 1];
		e[i]->r = e[i + 1];
	}
	for (R int i = n; i >= 2; --i)
	{
		R Node *now = p + i;
		R int tmp ;
		ans += tmp = dmin(p[i].v - now->l->v, now->r->v - p[i].v);
		now->l->r = now->r;
		now->r->l = now->l;
	}
	printf("%d\n",ans + p[1].v );
	return 0;
}



 

posted @ 2016-03-24 19:16  cot  阅读(141)  评论(0编辑  收藏  举报