假spaly害人 洛谷P1486 鬱悶的出納員

2021-07-27 22:21:53 字數 2789 閱讀 7632

我以前的spaly他媽全抄模版的,然後覺得這樣太頹廢了,就很裝逼地想自己寫這題;

其實我理論都懂的,所以我就認為自己應該何以靠自己的力量去做出來;

然後做了兩個晚上+1h的在校時間;

算算有6,7個小時呢;

真日了狗了

網上的模版反正爛大街的,這道題hzwer的spaly寫的很爛的,結果過了(bz過了,洛谷死迴圈)

然後你隨便翻開乙個模版就看到什麼zigzag壓成乙個函式啊,什麼函式引數帶&這個東西;

這樣並不會給程式加速;

我也不覺得這樣會方便;

我反正就是樸實的spaly;

struct spsp[100005];

int n,m,x,y,z,sum,ans,nn,min,rt,num;//sum是全域性變化的lazy標記

這題的思路我不想講了,我做了6,7個小時不是卡在思路上的;

關於思路你們就自己去找別的題解或者看**把;

但是我要講一下關於del的問題;

我們有乙個x(**中x指min-sum),現在我們要把所有權值小於x的節點全部刪掉;

std:我們找到x的後繼,把他提到根節點,然後把左子樹刪光;很有道理對不對;

我們看一下正確的**;

int del(int te)

splay(num,sp[rt].fa);

k=sp[sp[rt].l].s;

sp[rt].s-=k;

sp[rt].l=0;

return k;

}

沒什麼毛病;

但是這是我一開始寫的**

int del(int te)

x=sp[x].l

; }

if(!num)

splay(num,sp[rt].fa);

k=sp[sp[rt].l].s

; sp[rt].s-=k;

sp[rt].l=0

; return k;

}

這個就wa了,因為我沒有考慮關於全部刪除的問題,所以num一開始要先賦值-1,最後特判;

這種細節是抄板子的人所不會考慮的;

然後我們再來看看我之前寫的錯誤的del;

為什麼錯誤,不明真相;

void del(int x)

if(x==rt)rt=sp[x].l+sp[x].r

;else

if(sp[sp[x].fa].v

x].v)sp[sp[x].fa].r=sp[x].l+sp[x].r

;else sp[sp[x].fa].l=sp[x].l+sp[x].r;

sp[sp[x].l+sp[x].r].fa=sp[x].fa;}

void dfs(int k)

dfs(sp[k].l);

}

if(cc=='s')
這個是我一開始的寫法,就是把不符合 的數乙個乙個找出來乙個乙個刪掉;死迴圈;

我也不知道這個怎麼錯了;

估計就是父節點說明搞錯,少了說明特判;

然後是改進版;

int dfs(int k)else ans=dfs(sp[k].l);

sp[k].s-=ans;

return ans;

}

這個就是找到不對的點,直接把左子樹全部刪掉,把右子樹接起來;

又踏馬不知道**錯了;

估計又是什麼地方沒特判;

那個人說splay好寫的,你給我站出來!!

然後如果您看出上面的倆個程式的問題所在,告訴我謝謝;

總結 1.鏈結節點的時候一定要考慮全面,而且要特判跟的情況;

2.各種情況都要特判;

3.不要直接抄別人的模版;

#include

#include

#include

#include

#include

using

namespace

std;

struct spsp[100005];

int tot,q[100005];

int n,m,x,y,z,sum,ans,nn,min,rt,num;

char cc;

void up(int x)

void zig(int x)

void zag(int x)

void splay(int x,int k)

}void insert(int x)

int k=rt,kk;

while(k)

if(sp[k].velse k=sp[k].l;

}sp[++nn].v=x; sp[nn].fa=kk; sp[nn].s=sp[nn].w=1;

if(sp[kk].velse sp[kk].l=nn;

splay(nn,sp[rt].fa);

}int del(int te)

splay(num,sp[rt].fa);

k=sp[sp[rt].l].s;

sp[rt].s-=k;

sp[rt].l=0;

return k;

}int find(int k,int x)

int main()

else

printf("%d\n",find(rt,x)+sum);

}printf("%d",ans);

}

洛谷P1486 鬱悶的出納員

題目大意 維護乙個平衡樹,支援插入乙個數,刪除小於乙個值的所有數,k 大值查詢,每個節點權值加減乙個數。題解 所有節點權值加減操作可以考慮直接維護乙個全域性標記,刪除小於乙個值的所有數字為乙個二分的過程,複雜度為 o logn 具體做法為 若當前子樹根節點權值小於 x,則直接刪除整顆左子樹,繼續遍歷...

洛谷P1486 鬱悶的出納員 Treap

oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量...

NOI2004, 洛谷P1486 鬱悶的出納員

題目描述 oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙...