P1276 校門外的樹(增強版)

2022-09-14 20:18:19 字數 1995 閱讀 6104

原題鏈結

考察:線段樹 or 模擬

模擬是很簡單啦,主要考慮線段樹怎麼寫,本題的線段樹比較特殊.

思路:基本是參考了大佬的題解.本題的懶標記過於特殊把我寫懵了....

操作 0:砍掉[l,r]區間的樹與樹苗

操作 1:種植[l,r]區間的樹苗.

抽象到線段樹操作就是 0: [l,r]區間 樹陣列-1,樹苗陣列-1.

1:[l,r] 區間 樹苗陣列+1

比較難處理的是樹或樹苗陣列在[l,r]區間存在,樹苗無法+1.樹苗陣列在[l,r]區間不存在就無法-1.再者就是計數時,需要計算砍掉的是樹還是樹苗.

很好的處理手段是將樹與樹苗合併統計:ans[0]代表砍掉的樹+樹苗.ans[1]代表砍掉的樹. 第二問的答案是ans[0]-ans[1]

ans陣列比較好維護,只要建立兩個線段樹即可.

code:

1 #include 2 #include 3 #include 4

using

namespace

std;5/*

6第一問:存活的樹+樹苗-樹

7第二問:被砍的樹與樹苗-樹 8*/

9const

int n = 10010;10

struct nodetr[2][n<<2];//

0表示樹苗,1表示樹

13int n,m,op,ans[2

];14

void build(int u,int l,int r,int

s)15;17

if(l==r)

18int mid = l+r>>1

;19 build(u<<1,l,mid,s); build(u<<1|1,mid+1

,r,s);

20 tr[s][u].sum = tr[s][u<<1].sum+tr[s][u<<1|1

].sum;21}

22void push_down(int u,int

s)23

30if(tr[s][u].tag==-1)31

35 tr[s][u].tag = 0;36

}37void plant(int u,int l,int r,int

s)38

45push_down(u,s);

46int mid = tr[s][u].l+tr[s][u].r>>1;47

if(l<=mid) plant(u<<1

,l,r,s);

48if(mid1|1

,l,r,s);

49 tr[s][u].sum = tr[s][u<<1].sum+tr[s][u<<1|1

].sum;50}

51void cut(int u,int l,int r,int

s)52

61push_down(u,s);

62int mid = tr[s][u].l+tr[s][u].r>>1;63

if(l<=mid) cut(u<<1

,l,r,s);

64if(mid1|1

,l,r,s);

65 tr[s][u].sum = tr[s][u<<1].sum+tr[s][u<<1|1

].sum;

66//

tr[s][u].cut += tr[s][u<<1].cut+tr[s][u<<1|1].cut;

67//

沒有新增砍樹會被重覆記錄 68}

69int

main()

7082 printf("

%d\n

",tr[0][1].sum-tr[1][1

].sum);

83//

printf("%d\n",tr[0][1].cut-tr[1][1].cut);

84 printf("

%d\n

",ans[0]-ans[1

]);85

return0;

86 }

題解 P1276 校門外的樹(增強版)

本蒟蒻重學線段樹,發現了這道題可以用線段樹做。雖然資料範圍很小可以直接暴力,但由於在練習線段樹所以打算用線段樹寫這道題。本題解針對已經有線段樹基礎的巨佬,不懂線段樹原理的話可以學習線段樹後再閱讀本題解。剛看題的時候以為大概是個線段樹模板,結果發現事情並不簡單。題目要求的不是剩下多少棵樹和砍掉了多少棵...

洛谷 P1276 校門外的樹(增強版)

貌似很久以前 也就幾個星期幾個月前吧 看到過這題,但並沒有做還是懶,今天做一下也算是遲到的練習吧 祝我明天機房測試成功 題目裡還是藏著很多玄機的 1.樹和樹苗有什麼區別?答 沒有區別 樹是原來有的,而樹苗是閒的沒事幹的植樹者植的 因為生長需要時間嘛 2.注意是留下的樹苗 開始沒看見結果調了好久的錯 ...

luogu1276 校門外的樹(增強版)

時空限制 1000ms 128mb 校門外馬路上本來從編號0到l,每一編號的位置都有1棵樹。有砍樹者每次從編號a到b處連續砍掉每1棵樹,就連樹苗也不放過 記 0 a b 含a和b 幸運的是還有植樹者每次從編號c到d 中凡是空穴 樹被砍且還沒種上樹苗或樹苗又被砍掉 的地方都補種上樹苗 記 1 c d,...