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