2017 10 7 彈飛綿羊 思考記錄

2021-08-09 01:49:31 字數 845 閱讀 9241

。。這個題根據彈後的關係是很容易想出乙個森林的。。修改連線關係就是cut和link。。

但是分塊的做法似乎十分優越,,好寫好調。所以學一下分塊的寫法

首先每乙個區間的資訊都是可以做到o(1)查詢的。。就是dfs預處理

但如果有修改,就需要更新dfs,是o(n)的

由於每個點只會往後走,所以可以把原森林劃分為從後往前的若干段

這樣我們可以用類似dfs的便利對每個塊處理處答案,使查詢每個塊為o(1)

這時要保留每個點到下乙個塊的哪個點的資訊即可

修改乙個塊對其他塊不造成影響,因為答案是分段統計的。

均攤o(n*sqrt(n)),但實際跑的很快

碼:

#include#include#includeusing namespace std;

#define n 300005

int n,i,l[n],r[n],kuai[n],a[n],m,j,ans,o,oo,hou[n],len[n],q,op;

int main()

m=sqrt(n);

for(i=1;i<=m;i++)

r[m]=n;

for(i=n;i>=1;i--)

if(o>r[kuai[i]])

hou[i]=hou[o]; len[i]=len[o]+1;

} scanf("%d",&q);

while(q--)

printf("%d\n",ans);

}else

if(o>r[kuai[i]])

hou[i]=hou[o]; len[i]=len[o]+1;

} }

}}

Bounce 彈飛綿羊

bounce 彈飛綿羊 分塊 將整個大區間分成若干塊,每個點維護到下乙個塊需要跳的次數以及會跳到哪個點 分塊要注意細節,區間開閉容易弄亂 如下 1 include2 include3 include4 include5 define b int sqrt n 6 define n 200000 7u...

hnoi2010 彈飛綿羊

題目描述很明確,現在的目標是均攤兩個操作的複雜度 現在我們已知有兩種方法 1.每次用o 1 的時間修改k值,用o n 的時間直接模擬回答詢問 2.每次修改了k值後用o n 的時間更新所有答案,o 1 時間回答 均攤這兩種操作,可以這樣做 由於只可以從前往後跳,所以可以把跳躍路徑壓縮,更新時把壓縮的部...

bzoj2002 彈飛綿羊

lct裸題 給出一棵樹,有修改及詢問,修改操作為修改乙個節點的父親,詢問乙個節點到根的點數。詢問及修改前只需access一遍即可。include include include include include include define rep i,x,y for int i x i y i de...