您的位置:首页 > 其它

bzoj1058: [ZJOI2007]报表统计 STL

2014-07-26 19:03 253 查看
强大的stl,硬生生地把200多行的splay变为了90行的暴力。。。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 500005
#define inf 1<<30
int n,m;
set<int>s,tr;
map<int, int>mp;
vector<int>g[maxn];
int a[maxn],b[maxn];
int main()
{
scanf("%d%d",&n,&m);
int mg=inf,ms=inf,pos,val;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
tr.insert(a[i]);
if(i)
{
int k=abs(a[i]-a[i-1]);
s.insert(k);
mp[k]++;
}
}
sort(b,b+n);
for(int i=1;i<n;i++)
{
ms=min(ms,b[i]-b[i-1]);
}
mg=*s.begin();
char op[50];
while(m--)
{
scanf("%s",op);
if(op[4]=='R')
{
scanf("%d%d",&pos,&val);
pos--;
g[pos].push_back(val);
if(ms)
{
set<int>::iterator it=tr.lower_bound(val);
if(it!=tr.begin())
{
if(it==tr.end())
{
it--;
ms=min(ms,val-*it);
}
else
{
int x=*it; it--;
int y=*it;
ms=min(ms,abs(x-val));
ms=min(ms,abs(y-val));
}
}
else
{
ms=min(ms,abs(val-*tr.begin()));
}
}
tr.insert(val);
int x=inf,y=x;
if(g[pos].size()==1)
x=a[pos];
else
x=g[pos][g[pos].size()-2];
if(pos+1<n)
{
y=a[pos+1];
int k=abs(x-y);
mp[k]--;
if(mp[k]==0)s.erase(k);
k=abs(x-val); s.insert(k);
mp[k]++;
k=abs(y-val); s.insert(k);
mp[k]++; mg=*s.begin();
}
else
{
int k=abs(x-val);
s.insert(k);
mp[k]++; mg=*s.begin();
}
}
else if(op[4]=='G') printf("%d\n", mg);
else printf("%d\n", ms);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: