BZOJ1058 [ZJOI2007]报表统计

来源:互联网 发布:香港服务器 知乎 编辑:程序博客网 时间:2024/05/08 14:02

因为没有删除操作所以拿数组记录下每个位置的第一个和最后一个然后拿set搞一下就可以了

忘加abs调了好久-_-mlgb

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<vector>#include<stack>#include<queue>#include<map>#include<set>#include<bitset>using namespace std;#define MAXN 500010#define MAXM 1010#define ll long long#define INF 1000000000#define MOD 1000000007#define eps 1e-8int v[MAXN];int a[MAXN];int n,m;multiset<int>s,V;int ss=INF;char xB[1<<15],*xS=xB,*xT=xB;#define getc() (xS==xT&&(xT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xT)?0:*xS++)inline int read(){    char ch=getc();    int f=1,x=0;    while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getc();}    while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getc();}    return x*f;}void change(int x,int cv){if(x!=n){s.erase(s.find(abs(a[x+1]-v[x])));s.insert(abs(a[x+1]-cv));}s.insert(abs(cv-v[x]));v[x]=cv;multiset<int>::iterator p=V.insert(cv);if((p!=V.begin())&&(p!=--V.end())){p++;int tuv=*p;p--;p--;int tlv=*p;ss=min(ss,abs(cv-tlv));ss=min(ss,abs(cv-tuv));}else if(p!=V.begin()){p--;ss=min(ss,abs(cv-(*p)));}else if(p!=--V.end()){p++;ss=min(ss,abs(cv-(*p)));}}int main(){int i,x,y;char o[20];scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&a[i]);v[i]=a[i];if(i!=1){s.insert(abs(a[i]-a[i-1]));}multiset<int>::iterator p=V.insert(a[i]);if(p!=V.begin()){p--;ss=min(ss,abs(a[i]-(*p)));p++;}if(p!=--V.end()){p++;ss=min(ss,abs(a[i]-(*p)));}}while(m--){scanf("%s",o);if(o[0]=='I'){scanf("%d%d",&x,&y);change(x,y);}if(o[4]=='S'){printf("%d\n",ss);}if(o[4]=='G'){printf("%d\n",*(s.begin()));}}return 0;}/**/


0 0
原创粉丝点击