某天,lostmonkey發明了一種超級彈力裝置,為了在他的綿羊朋友面前顯擺,他邀請小綿羊一起玩個遊戲。遊戲一開始,lostmonkey在地上沿著一條直線擺上n個裝置,每個裝置設定初始彈力係數ki,當綿羊達到第i個裝置時,它會往後彈ki步,達到第i+ki個裝置,若不存在第i+ki個裝置,則綿羊被彈飛。綿羊想知道當它從第i個裝置起步時,被彈幾次後會被彈飛。為了使得遊戲更有趣,lostmonkey可以修改某個彈力裝置的彈力係數,任何時候彈力係數均為正整數。
這道題大致分為兩種方法:動態樹和分塊。
因為我只是個小渣渣,只會分塊做法。
首先把這n個裝置分成\(\sqrt\)個塊,每個塊\(\sqrt\)個裝置,這裡不多說,分塊的基礎。
首先我們預處理出從每個點跳出自己屬於的塊,主要這裡要用\(o(n)\)來處理,不可以用\(o(n\sqrt)\),否則會超時。
o(n)預處理
for(int i=n-1;i>=0;i--)
else
}
剩下就簡單了,
當修改某個點時,將它所在的塊中,將它前面的可以飛到它的點修改。
查詢就直接一塊一塊地往後飛就可以了。
#include #include #include #include #include #include #include const int maxlongint=2147483647;
const int mo=1000000007;
const int n=200005;
using namespace std;
int part[500][2],tot,size,n,m,a[n],belong[n],fly[n][2],j,ans;
int preblock()
for(int i=1;i<=tot;i++)
for(int j=part[i][0];j<=part[i][1];j++)
belong[j]=i;
}int main()
else
}scanf("%d",&m);
for(int i=1;i<=m;i++)
else
}} else
printf("%d\n",ans);
} }}
bzoj2002 彈飛綿羊
lct裸題 給出一棵樹,有修改及詢問,修改操作為修改乙個節點的父親,詢問乙個節點到根的點數。詢問及修改前只需access一遍即可。include include include include include include define rep i,x,y for int i x i y i de...
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...