洛谷P3616 富金森林公園

2022-03-01 16:42:35 字數 2149 閱讀 9711

博艾的富金森林公園裡有乙個長長的富金山脈,山脈是由一塊塊巨石並列構成的,編號從1到n。每乙個巨石有乙個海拔高度。而這個山脈又在乙個盆地中,盆地裡可能會積水,積水也有乙個海拔高度,所有嚴格低於這個海拔高度的巨石,就會在水面下隱藏。

由於地殼運動,巨石的海拔高度可能會隨時變化,每次一塊的巨石會變成新的海拔高度。當然,水面的高度也會隨時發生變化。

因為有這樣奇妙的地質奇觀,吸引了很多遊客來遊玩。uim作為乙個遊客,可以告訴你此時水位海拔,你得告訴他,能看到有幾個連續露出水面的部分。(與水面持平我們也認為是露出)

輸入格式:

第一行兩個整數n和m,分別表示n塊石頭,m個詢問。

接下來一行,n個整數ai表示每個巨石的初始海拔。

接下來m行,每行有兩個或者三個數,每一行如果第乙個數是1,那麼後面跟乙個bj,表示水面海拔。如果第乙個數是2,後面跟兩個整數,cj和dj,表示編號cj的巨石海拔變為dj。

輸出格式:

對於每個"1"詢問,給出乙個整數答案,也就是露出了幾部分的山峰。

輸入樣例#1:

5 4

8 6 3 5 4

1 52 4 1

1 51 3

輸出樣例#1:

2

12

10%的資料, n,m<=2000

另外30%的資料, 只有"1"的詢問。

100%的資料, 1<=n,m<=200000,1<=ai,bj,dj<=10^9,一定有"1"詢問

題解

話說模擬賽的時候這題打個暴力騙了50分

然後去網上找題解的時候愣是沒乙個能看懂的

最後找了份**瞪了三個小時才明白是怎麼回事

還是來詳細的講講好了

ps:最後有個小細節,我們是按高度建線段樹,所以必須進行離散

1

//luogu-judger-enable-o22//

minamoto

3 #include4

#define n 400005

5using

namespace

std;

6#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<15,stdin),p1==p2)?eof:*p1++)

7char buf[1

<<15],*p1=buf,*p2=buf;

8 inline int

read()

18int sum[n<<2|1],tag[n<<2|1

];19

struct

node

23 }a[n<<1|1

];24

int h[n<<1|1],x[n<<1|1],k[n<<1|1

];25

intn,m,mx;

26void pushdown(int

p)33

void change(int p,int l,int r,int ql,int qr,int

x)37

pushdown(p);

38int mid=(l+r)>>1;39

if(ql<=mid) change(p<<1

,l,mid,ql,qr,x);

40if(qr>mid) change(p<<1|1,mid+1

,r,ql,qr,x);41}

42int query(int p,int l,int r,int

x)49

intmain()

60 sort(a+1,a+1+n+m);h[a[1].id]=1;61

for(int i=2;i<=n+m;++i)

62 h[a[i].id]=a[i].h>a[i-1].h?h[a[i-1].id]+1:h[a[i-1

].id];

63 mx=h[a[n+m].id];

64for(int i=1;i<=n;++i)

65if(h[i-1]1,1,mx,h[i-1]+1,h[i],1

);66

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

76else printf("

%d\n

",query(1,1

,mx,h[i]));77}

78return0;

79 }

洛谷 P3616 富金森林公園

題鏈 題解 樹狀陣列,本題思路挺巧妙。考慮這種暴力演算法 設h i 為i位置的高度,水面的高度為b 從左列舉到右,如果 h i 1 基於上述暴力,可以得出 如果 h i 1 h i 且詢問的 b 在這兩個h值之間,則會貢獻答案。所以,用資料結構維護區間修改 把區間h i 1 1 h i 的值加一 和...

樹狀陣列 洛谷 P3616 富金森林公園

達成成就 noip題想不出!我是怎麼做到想去寫cdq分治加並查集的 還寫不出來 資料結構學傻系列 其實是noip題 這樣的話高度一樣怎麼辦 我們把乙個高度放大成乙個高度區間就可以避免有相同數字了 include include include using namespace std inline c...

洛谷 P3616 富金森林公園 樹狀陣列

傳送門 維護乙個山脈,單點修改,查詢有多少山峰高出水面 我是沙茶沙茶題都不會做只想到無修改可以用掃瞄線 答案就是所有比水面高的 相鄰都比水面高的啊 因為沒有區間詢問寫個 bit 都可以 有區間詢問?可以考慮主席樹吧 include include include include using name...