【BZOJ 1058】[ZJOI 2007]レポート統計STL
3109 ワード
【BZOJ 1058】[ZJOI 2007]レポート統計
Description
Qさんのお母さんは出納で、よく統計報告書の仕事をしなければなりません.今日は母の誕生日で、Qさんは母の誕生日のプレゼントの一つとして、仕事を分担してほしいと思っています.よく観察すると、小Qは、統計レポートが実際には負の数の可能性のある整数数列を維持し、いくつかのクエリー操作を行うことを発見した.最初はNの長さの整数シーケンスがあり、INSERT i kは元の数列のi番目の要素の後ろに新しい要素kを追加する.元の列のi番目の要素にいくつかの要素が追加されている場合、これらの要素の最後に追加されます(次の例を参照).MIN_GAPクエリ隣接する2つの要素間の差分値(絶対値)の最小値MIN_SORT_GAPは、すべての要素の中で最も近い2つの要素の差分値(絶対値)をクエリします.たとえば、最初のシーケンスが5 3 1の場合、INSERT 2 9を実行すると、5 3 9 1のときMIN_GAPは2、MIN_SORT_GAPは2です.さらにINSERT 2 6を実行すると、5 3 9 6 1この時点で元のシーケンスの2番目の要素の後ろに9が追加されていることに注意し、この時点で追加された6は9の後ろに追加されるべきである.この時MIN_GAPは2、MIN_SORT_GAPは1です.そこでQさんはプログラムを書いて、プログラムが自動的にこれらの操作を完成させることができますが、彼はいくつかの大きなレポートに対して彼のプログラムが遅く実行されていることを発見しました.あなたは彼のプログラムを改善することができますか?
Input
1行目は2つの整数N,Mを含み,それぞれ原数列の長さと動作回数を表す.第2の動作N個の整数は、初期シーケンスである.次のM行は、「INSERT i k」、「MIN_GAP」、「MIN_SORT_GAP」のいずれか(余分なスペースや空行がない)の行ごとに動作する.
Output
「MIN_GAP」コマンドと「MIN_SORT_GAP」コマンドごとに、1行の答えを出力します.
Sample Input
3 5 5 3 1 INSERT 2 9 MIN_SORT_GAP INSERT 2 6 MIN_GAP MIN_SORT_GAP
Sample Output
2 2 1
HINT
N,M≦500000すべてのデータに対して、シーケンス内の整数は5*10^8を超えない.
标题:STLはバランスツリーがなくて書きやすいと初めて感じました~
2つのmultiset m 1,m 2,m 1はシーケンス全体の数を維持し,m 2は隣接するすべての2つの数の差を維持する必要がある.隣接する2つの数の差の最小値を維持するスタックも維持する必要があります.また、すべてのソート後の隣接する2つの数の差を表す変数も維持します.
各操作について,現在位置の最後の数と次の位置の最初の数しか知らなければならないので,各位置の最初の数と最後の数を維持するだけでよいことが分かった.
#include
#include
#include
#include
#include
using namespace std;
const int maxn=500010;
multiset m1,m2,m3;
multiset::iterator it;
priority_queue p1;
int n,m,p2;
int L[maxn],R[maxn];
char str[20];
int abs(int x)
{
return x>0?x:-x;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),p2=1<<30;
int i,j,a,b,c;
for(i=1;i<=n;i++) L[i]=R[i]=rd(),m1.insert(L[i]);
for(i=2;i<=n;i++)
{
if(m2.find(abs(L[i]-L[i-1]))==m2.end()) p1.push(-abs(L[i]-L[i-1]));
m2.insert(abs(L[i]-L[i-1]));
}
for(it=m1.begin(),i=*it,++it;it!=m1.end();it++)
p2=min(p2,(*it)-i),i=*it;
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]=='I')
{
a=rd(),b=rd();
if(a!=n)
{
m2.erase(m2.find(abs(L[a+1]-R[a])));
if(m2.find(abs(L[a+1]-b))==m2.end()) p1.push(-abs(L[a+1]-b));
m2.insert(abs(L[a+1]-b));
}
if(m2.find(abs(b-R[a]))==m2.end()) p1.push(-abs(b-R[a]));
m2.insert(abs(b-R[a]));
it=m1.lower_bound(b);
if(it!=m1.end()) p2=min(p2,(*it)-b);
if(it!=m1.begin()) it--,p2=min(p2,b-(*it));
m1.insert(b),R[a]=b;
}
if(str[4]=='G')
{
while(m2.find(-p1.top())==m2.end()) p1.pop();
printf("%d
",-p1.top());
}
if(str[4]=='S') printf("%d
",p2);
}
return 0;
}
転載先:https://www.cnblogs.com/CQzhangyu/p/6999989.html
#include
#include
#include
#include
#include
using namespace std;
const int maxn=500010;
multiset m1,m2,m3;
multiset::iterator it;
priority_queue p1;
int n,m,p2;
int L[maxn],R[maxn];
char str[20];
int abs(int x)
{
return x>0?x:-x;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),p2=1<<30;
int i,j,a,b,c;
for(i=1;i<=n;i++) L[i]=R[i]=rd(),m1.insert(L[i]);
for(i=2;i<=n;i++)
{
if(m2.find(abs(L[i]-L[i-1]))==m2.end()) p1.push(-abs(L[i]-L[i-1]));
m2.insert(abs(L[i]-L[i-1]));
}
for(it=m1.begin(),i=*it,++it;it!=m1.end();it++)
p2=min(p2,(*it)-i),i=*it;
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(str[0]=='I')
{
a=rd(),b=rd();
if(a!=n)
{
m2.erase(m2.find(abs(L[a+1]-R[a])));
if(m2.find(abs(L[a+1]-b))==m2.end()) p1.push(-abs(L[a+1]-b));
m2.insert(abs(L[a+1]-b));
}
if(m2.find(abs(b-R[a]))==m2.end()) p1.push(-abs(b-R[a]));
m2.insert(abs(b-R[a]));
it=m1.lower_bound(b);
if(it!=m1.end()) p2=min(p2,(*it)-b);
if(it!=m1.begin()) it--,p2=min(p2,b-(*it));
m1.insert(b),R[a]=b;
}
if(str[4]=='G')
{
while(m2.find(-p1.top())==m2.end()) p1.pop();
printf("%d
",-p1.top());
}
if(str[4]=='S') printf("%d
",p2);
}
return 0;
}