題意:給出乙個數列,初始時有n個數字。三種操作:(1)在第i個之後插入數字k,(1<=i<=n),注意這裡的插入,這個n就是一開始的n,不是當前數列的長度。比如若在第i個之後插入數字x,又再第i個數字之後插入y,那麼y要插在x的後面;(2)詢問數列中相鄰兩項差值的最小值;(3)詢問整個數列所有數中差值的最小值。
思路:(1)首先,第二種詢問比較容易解決,只要將所有數字插入到set中,每次找與當前數字最近的兩個比較即可;並且顯然這個值只會遞減不會增加;
(2)對於第一種查詢我使用splay實現,節點儲存當前節點的val以及以當前節點為根的子樹的區間的兩個端點的值lval和rval,以及相鄰數字的最小值min。每次更新即可。
struct node
;node a[n],*nullnode,*root,*x1,*x2;
int cnt;
node *newnode(i64 val,node *p)
void pushup(node *p)
else p->lval=p->val;
if(p->c[1]!=x1&&p->c[1]!=x2&&p->c[1]!=nullnode)
else p->rval=p->val;
}void init()
void zig(node *x)
x->p=q;
pushup(p);
pushup(x);
if(root==p) root=x;
}void zag(node *x)
x->p=q;
pushup(p);
pushup(x);
if(root==p) root=x;
}void splay(node *x,node *goal)
else
}else}}
void select(int k,node *goal)
}splay(x,goal);
}i64 ans1,ans2;
sets;
void insert(int k,i64 val)
if(it!=s.begin())
s.insert(val);
}int n,m;
int s[n];
void add(int x)
}int get(int x)
return ans;
}int main()
char op[20];
int pos;
i64 val;
while(m--)
else if(op[4]=='g') pr(ans1);
else pr(ans2);
}return 0;
}
ZJOI2007報表統計 BZOJ1058
傳送門 time limit 15 sec memory limit 162 mb 小q的媽媽是乙個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小q希望可以幫媽媽分擔一些工作,作為她的生日禮物之一。經過仔細觀察,小q發現 統計一張報表實際上是維護乙個非負整數數列,並且進行一些查詢操作。在最...
bzoj1058 ZJOI2007 報表統計
小q的媽媽是乙個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小q希望可以幫媽媽分擔一些工作,作為她的生日禮物之一。經過仔細觀察,小q發現統計一張報表實際上是維護乙個可能為負數的整數數列,並且進行一些查詢操作。在最開始的時候,有乙個長度為n的整數序列,並且有以下三種操作 insert i k...
bzoj1058 ZJOI2007 報表統計
傳送門 題解 這個insert操作好py啊是不是用set就能搞搞啊。什麼?你跟我講t了?讀入優化?還是t?卡了卡常,發現乙個東西用priority queue就夠了。然後12s過了。include include include include include include include usi...