您的位置:首页 > 其它

[BZOJ1058]ZJOI2007报表统计|平衡树

2015-04-23 14:33 375 查看
没啥好说的,码力题,两棵平衡树,一棵维护相邻差值,一棵维护数,插入的时候要记得删去对应差值。。懒得写splay了,正好学一下STL(以前不喜欢写。。)
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<set>
#define N 500005
#define inf 0x3fffffff
using namespace std;
int n,m,i,x,k,a
,ans=inf,last
;
char opt[20];
multiset<int> num,del;
multiset<int>::iterator it,l;
int main()
{
freopen("1058.in","r",stdin);
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
last[i]=a[i];
num.insert(a[i]);
if (i>1) del.insert(abs(a[i]-a[i-1]));
}
for (it=num.begin();it!=num.end();it++)
{
if (it!=num.begin()) ans=min(ans,*it-*l);
l=it;
}
num.insert(-inf);num.insert(inf);
for (i=1;i<=m;i++)
{
scanf("%s",opt);
if (opt[0]=='I')
{
scanf("%d%d",&x,&k);
it=num.insert(k);
ans=min(ans,k-*(--it));it++;it++;
ans=min(ans,*it-k);
it=del.find(abs(a[x+1]-last[x]));
del.erase(it);
del.insert(abs(last[x]-k));
del.insert(abs(k-a[x+1]));
last[x]=k;
}
else if (opt[4]=='S') printf("%d\n",ans);
else printf("%d\n",*del.begin());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: