bzoj1058: [ZJOI2007]报表统计 STL

来源:互联网 发布:nginx 域名www跳转 编辑:程序博客网 时间:2024/05/17 23:01
强大的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<<30int 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;}

0 0
原创粉丝点击