您的位置:首页 > 其它

BZOJ 1058 报表统计

2017-01-25 14:35 106 查看
基本思路正确。注意两点:

1.MIN_SORT_GAP不用以第二个set实现。这个答案一定是单调的。

2.lower_bound巨慢巨慢巨慢巨慢巨慢巨慢巨慢用lower_bound和set是10s与1h的区别。

能不用尽量不用。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#define maxn 1000500
#define inf 1000000007
using namespace std;
int n,m,a[maxn],b[maxn],last[maxn],tot,nxt[maxn],pre[maxn],x,y,mn=inf;
multiset <int> s1,s3;
multiset <int> ::iterator it1,it2,it3;
char s[10];
int read()
{
char ch;int data=0,f=1;
while (ch<'0' || ch>'9')
{
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0' && ch<='9')
{
data=data*10+ch-'0';
ch=getchar();
}
return data*f;
}
void add1()
{
nxt[tot]=nxt[last[x]];pre[tot]=last[x];
pre[nxt[last[x]]]=tot;nxt[last[x]]=tot;last[x]=tot;
if (nxt[tot]!=-1)
{
it1=s1.find(abs(a[nxt[tot]]-a[pre[tot]]));
s1.erase(it1);
s1.insert(abs(a[nxt[tot]]-a[tot]));
}
s1.insert(abs(a[pre[tot]]-a[tot]));
}
void add2()
{
s3.insert(a[tot]);it1=s3.find(a[tot]);
if (it1!=s3.begin())
{
it1--;
mn=min(mn,a[tot]-*it1);
it1++;
}
it1++;
if (it1!=s3.end()) mn=min(mn,*it1-a[tot]);
}
int main()
{
n=read();m=read();tot=n;
for (int i=1;i<=n;i++)
{
a[i]=read();b[i]=a[i];s3.insert(a[i]);
last[i]=i;nxt[i]=i+1;pre[i]=i-1;
}
pre[1]=nxt
=-1;
for (int i=1;i<=n-1;i++) s1.insert(abs(a[i+1]-a[i]));
for (it1=s3.begin();it1!=s3.end();it1++)
{
if (it1!=s3.begin()) mn=min(mn,*it1-*it2);
it2=it1;
}
for (int i=1;i<=m;i++)
{
scanf("%s",s);
if (s[0]=='I')
{
scanf("%d%d",&x,&y);a[++tot]=y;
add1();
add2();
}
else if (s[4]=='S') printf("%d\n",mn);
else printf("%d\n",*s1.begin());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: