bzoj2002 彈飛綿羊

2021-06-27 09:06:34 字數 1018 閱讀 1177

lct裸題

給出一棵樹,有修改及詢問,修改操作為修改乙個節點的父親,詢問乙個節點到根的點數。

詢問及修改前只需access一遍即可。

#include #include #include #include #include #include #define rep(i, x, y) for (int i = x; i <= y; i ++)

#define repe(i, x) for (int i = pos[x]; i; i = g[i].nex)

#define lc t[x].ch[0]

#define rc t[x].ch[1]

#define lc t[lc]

#define rc t[rc]

#define tp t[x].par

#define tp t[t[x].par]

using namespace std;

typedef long long ll;

const int n = 200005;

struct arr t[n];

bool rt[n];

int n, m, q;

void upd(int x)

void sc(int x, int y, bool f)

void rot(int x, bool f)

void splay(int x)

bool f = (t[tp.par].ch[1] == tp);

if (tp.ch[f] == x) rot(tp, !f), rot(x, !f);

else rot(x, f), rot(x, !f);

} upd(x);

}void access(int x)

}int main()

rt[n+1] = 1, t[n+1].sz = 1;

cin >> q;

rep(i, 1, q) else

}return 0;

}

BZOJ2002 彈飛綿羊

這題可以用分塊暴力做,這裡給出正解lct的 對於每乙個彈射器i k相當於i的父親,大於n的全部歸到n 1上。這樣對於修改操作就像於換了個父親,我們要記錄下上一次的父親因為在splay中父親可能會改變。對於查詢操作就相當於把n 1mroot到根,因為你新增時會更新,不能確保n 1的位置。而答案就是xs...

BZOJ 2002 彈飛綿羊

一列n個數,a i 表示向後a i 個,問第k個數進行多少次向後跳躍會飛出去.i連向i a i 那麼我們建立乙個森林,i是i a i 的乙個子節點,如果i a i n,那麼i連向null.這樣對於節點k,問多少次飛出去,就是向上走多少個到null,也就是深度是多少,直接lct處理.注意 1.這裡的l...

bzoj2002 彈飛綿羊

某天,lostmonkey發明了一種超級彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請小綿羊一起玩個遊戲。遊戲一開始,lostmonkey在地上沿著一條直線擺上n個裝置,每個裝置設定初始彈力係數ki,當綿羊達到第i個裝置時,它會往後彈ki步,達到第i ki個裝置,若不存在第i ki個裝置,則綿羊被彈飛...