[NOI2005]维护数列
题目: BZOJ1500、洛谷P2042、Vijos P1835、codevs1758。 题目大意: 给你一个数列,实现以下操作。 解题思路: 非旋Treap维护数列即可。 前面5个都是基本的平衡树序列操作(第5个维护一个区间和即可)。 第6个要求最大子段和,则我们需要维护以当前节点为子树的子段和,当前子树的最大前缀和和最大后缀和,才能转移出正确的最大子段和。(具体如何维护详见代码) 对于旋转操作,需要把前缀和后缀交换一下。 还有要注意: 1. 内存不能开太大,会MLE,要回收被删除的节点。 2. 插入时不要一个一个merge,先按照笛卡尔树的建树方式建树(O(n)),然后直接merge根即可。 C++ Code: #include<bits/stdc++.h> inline int max(int a,int b){return a>b?a:b;} inline void swap(int& a,int& b){int c=a;a=b,b=c;} inline int readint(){ int c=getchar(),d=0,b=0; for(;!isdigit(c);c=getchar())b=c=='-'; for(;isdigit(c);c=getchar())d=(d<<3)+(d<<1)+(c^'0'); return b?-d:d; } struct node{