調了乙個下午
最近做題都這樣吧,思路很簡單,**很繁瑣
要努力提高**能力
細節太多很噁心;
詳細地說一說吧
維護最大連續字首和ls
最大連續字尾和rs
以及最大子串行和ms
int l=t[x].ch[0],r=t[x].ch[1];
size[x]=size[l]+size[r]+1;
ls[x]=max(ls[l],sum[l]+val[x]+ls[r]);
rs[x]=max(rs[r],sum[r]+val[x]+rs[l]);
ms[x]=max(ms[l],max(ms[r],rs[l]+ls[r]+val[x]));
sum[x]=sum[l]+sum[r]+val[x];
lazy陣列表示是否make_same,因為same值有可能為0
並且因為lazy後rev無用
ls[r]如果是負數,還不如不加(0)
rev時:ls[x]與rs[x]也要交換
if(lazy[x])
if(lazy[x])
if(r)
rev[x]=lazy[x]=0;
} else if(rev[x])
**機制使用,注意清空
葉子點賦值
int build(int l,int r,int f)
else x=++tot;
fa[x]=f;val[x]=num[mid];
t[x].ch[0]=build(l,mid-1,x);t[x].ch[1]=build(mid+1,r,x);
if(l==r)
pushup(x);
re x;
}
就是將所求區間弄到根節點的右子樹的左兒子裡,返回左兒子
inline int split(int l,int r)
建一顆平衡樹,放在右兒子的左子樹里
因為它的左兒子(0)可能沒有左子樹
inline void insert(int posi,int y)
記錄一下垃圾編號,**
if(s[0]!='m'||s[2]!='x')
rd(posi),rd(toto);
if(s[0]=='i')//insert
else if(s[0]=='d')//delete
else if(s[0]=='r')//reverse
}else if(s[2]=='k')//make_same
pushup(fa[x]);pushup(fa[fa[x]]);//更新至根節點
} else
else printf("%d\n",ms[rt]);//max_sum
}
完整**
#include#define re return
#define max(a,b) (a)>(b)?(a):(b)
#define inc(i,l,r) for(int i=l;i<=r;++i)
const int maxn=500005;
templateinline void rd(t&x)
using namespace std;
int rt,tot,q[maxn],top,n,m,num[maxn],fa[maxn];
int sum[maxn],size[maxn],val[maxn],lazy[maxn],rev[maxn],ls[maxn],rs[maxn],ms[maxn];
struct nodet[maxn];
inline void pushup(int x)
inline void pushdown(int x)
if(r)
rev[x]=lazy[x]=0;
} else if(rev[x])
}inline bool chk(int x)
inline void rotate(int x)
inline void splay(int x,int goal=0)
if(!goal)rt=x;
}int build(int l,int r,int f)
else x=++tot;
fa[x]=f;val[x]=num[mid];
t[x].ch[0]=build(l,mid-1,x);t[x].ch[1]=build(mid+1,r,x);
if(l==r)
pushup(x);
re x;
}inline int kth(int k)
}inline int split(int l,int r)
inline void insert(int posi,int y)
inline void delete(int x)
inline void dfs(int x)
/*inline void debug()}*/
int main()
else if(s[0]=='d')
else if(s[0]=='r')
}else if(s[2]=='k')
pushup(fa[x]);pushup(fa[fa[x]]);
} else
else printf("%d\n",ms[rt]);
} } re 0;
}
noi 2005 序列維護 sequence
從昨天晚上調到現在,終於發現問題所在了 tree 0 par被修改過,而我預設其為0.大囧 problem sequence point execution status score time sec memory kb 1 normal 10.000 0.006 2300 2 normal 10....
noi2005 維護序列。 splay
挑戰自己寫了一下這道noi歷史上最 的資料結構,noi2005的維護序列,非常 非常 在經過4小時的debug後一次ac了 如果再賽場上以我現在水平一定搞不出來。吃一塹長一智,這題對平衡樹的操作更加深入 由於oj上的記憶體限制只有64mb。所以為了記憶體,加了個 棧。後來又加了個 棧,棧指的是被刪除...
noi2005維護數列
請寫乙個程式,要求維護乙個數列,支援以下 6 種操作 請注意,格式欄 中的下劃線 表示實際輸入檔案中的空格 操作編號 輸入檔案中的格式 說明1.插入 insert posi tot c1 c2 c tot 在當前數列的第 posi 個數字後插入 tot 個數字 c1,c2,c tot 若在數列首插 ...