維護序列NOI2005

2022-05-16 02:59:28 字數 2775 閱讀 7424

調了乙個下午

最近做題都這樣吧,思路很簡單,**很繁瑣

要努力提高**能力

細節太多很噁心;

詳細地說一說吧

維護最大連續字首和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 若在數列首插 ...