bzoj1058題解
阿新 • • 發佈:2017-05-30
復雜 end 維護 tin 復雜度 好題 include procedure 彈出
【解題思路】
STL好題。維護兩個set,一個存儲數列裏相鄰元素差,另一個存儲整個數列。
對於MIN_SORT_GAP操作,維護一個ans表示答案,每個INSERT操作時通過第二個set更新即可。
針對INSERT操作的特性,我們可以在原數列每個元素下掛一個鏈,對於INSERT i k,即在第i條鏈末端插入k。可以進一步發現在插入過程中每條鏈只有兩端對數列中相鄰元素差有貢獻,可以進一步優化空間。
那麽對於MIN_GAP操作,每個INSERT操作時,記新插入元素為x,其前驅後繼分別為y,z(如果存在的話),在第一個set內彈出|y-z|並插入|x-y|和|x-z|。
這樣復雜度O(mlog2 (n+m))。
【參考程序】
1 #include <bits/stdc++.h> 2 #define range(i,c,o) for(register int i=(c);i<(o);++i) 3 #define dange(i,c,o) for(register int i=(c);i>(o);--i) 4 using namespace std; 5 6 //#define __debug 7 #ifdef __debug 8 #define Function(type) type 9 #define Procedure void 10 #else 11 #define Function(type) __attribute__((optimize("-O2"))) inline type 12 #define Procedure __attribute__((optimize("-O2"))) inline void 13 #endif 14 15 static const int INF=0x7f7f7f7f; 16 17 //quick_io BEGIN HERE 18 Function(int) getint() 19 { 20 char c=getchar(); for(;!isdigit(c)&&c!=‘-‘;c=getchar()); 21 short s=1; for(;c==‘-‘;c=getchar()) s*=-1; int r=0; 22 for(;isdigit(c);c=getchar()) r=(r<<3)+(r<<1)+c-‘0‘; 23 return s*r; 24 } 25 //quick_io END HERE 26 27 multiset<int> rec1,rec2; 28 int top[500005],bot[500005]; 29 static int ans=INF,n=getint(),m=getint(); 30 #define PUSH(x) rec1.insert(x) 31 #define POP(x) rec1.erase(rec1.find(x)) 32 Procedure INSERT1(const int&k,const int&x) 33 { 34 PUSH(abs(x-bot[k ])); 35 if(k<n) 36 { 37 PUSH(abs(x-top[k+1])); 38 POP(abs(bot[k]-top[k+1])); 39 } 40 } 41 Procedure INSERT2(const int&x) 42 { 43 multiset<int>::iterator it=rec2.insert(x); 44 if(it!=rec2.begin()) ans=min(ans,x-*--it),++it; 45 if(++it!=rec2.end()) ans=min(ans,*it - x) ; 46 } 47 48 int main() 49 { 50 rec1.clear(),rec2.clear(); 51 range(i,1,n+1) 52 { 53 top[i]=bot[i]=getint(); 54 if(i>1) PUSH(abs(bot[i-1]-top[i])); 55 INSERT2(top[i]); 56 } 57 while(m--) 58 { 59 char c; while(isspace(c=getchar())); 60 if(c==‘I‘) 61 { 62 int k=getint(),x=getint(); 63 INSERT1(k,x),INSERT2(x),bot[k]=x; 64 continue; 65 } 66 while(getchar()!=‘_‘); c=getchar(); 67 while(!isspace(getchar())); 68 printf("%d\n",c==‘G‘?*rec1.begin():ans); 69 } 70 return 0; 71 }View Code
bzoj1058題解