1. 程式人生 > >2018.11.09 洛谷P1110 [ZJOI2007]報表統計(multiset)

2018.11.09 洛谷P1110 [ZJOI2007]報表統計(multiset)

傳送門
sb題。
直接用兩個 m u l t i s e t multiset

維護相鄰兩個數的差值和所有數的前驅後繼。
插入一個數的時候更新一下就行了。
程式碼:

#include<bits/stdc++.h>
using namespace std;
inline int read(){
    int ans=0,w=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar
(); return ans*w; } const int N=5e5+5,inf=1e9+5e8; int n,m,a[N],ans=inf,hd[N],tl[N]; multiset<int>T,R; int main(){ n=read(),m=read(),T.insert(-inf),T.insert(inf); for(int i=1;i<=n;++i){ hd[i]=tl[i]=a[i]=read(); T.insert(a[i]); multiset<int>::iterator it=
T.find(a[i]); --it,ans=min(ans,a[i]-(*it)),++it; ++it,ans=min(ans,(*it)-a[i]),--it; } for(int i=1;i<n;++i)R.insert(abs(a[i]-a[i+1])); while(m--){ char s[10]; int x,y; scanf("%s",s); if(s[0]=='I'){ x=read(),y=read(),T.insert(y); multiset<int>::iterator it=T.find(y); --it,ans=min(ans,y-(*it)),++it; ++it,ans=min(ans,(*it)-y),--it; if(x^n)R.erase(R.find(abs(hd[x+1]-tl[x]))),R.insert(abs(hd[x+1]-y)); R.insert(abs(tl[x]-y)),tl[x]=y; } else if(s[4]=='G')printf("%d\n",*R.begin()); else printf("%d\n",ans); } return 0; }