[luoguP1110] [ZJOI2007]报表统计(set暴力)

传送门

 

两个multiset

一个记录相邻元素的差,一个放所有的元素

2个数组

val[i]记录第i个的值,last[i]记录第i个最后插入的数的值

然后乱搞

#include <set>
#include <cstdio>
#include <iostream>
#define N 1001000
#define abs(x) ((x) < 0 ? -(x) : (x))
#define min(x, y) ((x) < (y) ? (x) : (y))
#define max(x, y) ((x) > (y) ? (x) : (y))

using namespace std;

int n, m, ans = 1e9;
int val[N], last[N];
multiset <int> s, ss;
multiset <int> :: iterator it;

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
	return x * f;
}

inline void set_insert(int x)
{
	s.insert(x);
	it = s.lower_bound(x);
	if(it != s.begin())
		it--, ans = min(ans, abs(*it - x)), it++;
	if((++it) != s.end()) ans = min(ans, abs(*it - x));
}

inline void insert(int x, int y)
{
	if(x != n)
		ss.erase(ss.lower_bound(abs(last[x] - val[x + 1])));
	ss.insert(abs(last[x] - y));
	if(x != n) ss.insert(abs(val[x + 1] - y));
	last[x] = y;
	set_insert(y);
}

int main()
{
	int i, x, y;
	char s[21];
	n = read();
	m = read();
	for(i = 1; i <= n; i++)
	{
		last[i] = val[i] = read();
		set_insert(val[i]);
		if(i > 1) ss.insert(abs(val[i] - val[i - 1]));
	}
	for(i = 1; i <= m; i++)
	{
		scanf("%s", s);
		if(s[4] == 'R')
		{
			x = read();
			y = read();
			insert(x, y);
		}
		if(s[4] == 'G') printf("%d\n", *ss.begin());
		if(s[4] == 'S') printf("%d\n", ans);
	}
	return 0;
}

  

posted @ 2018-01-16 20:13  zht467  阅读(118)  评论(0编辑  收藏  举报