1. 程式人生 > >CPOJ111 跳房子

CPOJ111 跳房子

題面 這裡寫圖片描述 這裡寫圖片描述 每走一步相當於進行一次置換,我們可以用一棵線段樹來維護一個序列走完一段區間之後會變成什麼.詢問的時候先算出走了多少圈整,用快速冪求解,再把餘數走掉.修改的時候直接線上段樹上修改即可. Code 一開始合併兩個區間寫的是這樣

inline void add(data& res,data& a,data& b)
{
    LL i;
    fo(i,1,n) res.a[i]=b.a[a.a[i]];
}

然後調了兩天之後

inline void add(data& res,data& a,data& b)
{
    LL i;
fo(i,1,n) tempa.a[i]=a.a[i],tempb.a[i]=b.a[i]; fo(i,1,n) res.a[i]=tempb.a[tempa.a[i]]; }