11 01T2 樹狀陣列維護動態LIS

2022-05-01 18:24:10 字數 1825 閱讀 4059

描述當一陣風吹來,風箏飛上天空,為了你,而祈禱,而祝福,而感動……

oyiya 在 ak 了 ioi 之後來到了鄉下,在田野中玩耍,放鬆身心。

他發現前面有一排小朋友在放風箏,每乙個風箏有乙個高度 hi,風箏的高度可能會隨著小朋友的心情而改變。這時,毒瘤的 oyiya 有了乙個毒瘤的 idea,他想知道改變高度之後風箏的最長嚴格上公升子串行。oyiya 太強了表示並不想做這種水題,你能解決這個問題嗎?

輸入第一行為兩個整數 n, m,表示小朋友的個數和詢問數。

第二行有 n 個整數,表示 hi。

接下來 m 行,每行兩個整數 ai, bi,表示詢問將第 ai 只風箏的高度變成 bi 後的 lis。注意詢問之間是獨立的,後面的詢問不受前面詢問的影響.

輸出m 行,每行乙個整數表示詢問的答案。

樣例輸入[複製]

3 32 2 3

1 31 1

3 2樣例輸出[複製]23

1提示直接上**

code:

1 #include2 #include3 #include4 #include5 #include6

#define n 800005

7using

namespace

std;

8int

c[n],a[n],cnt,d[n],ans[n],dp[n],dp[n];

9int lowbit(int

x)12

void add(int x,int

v)17}18

int query(int

x)24

return

ans;25}

26struct

nodeq[n];

29bool cmp(const node&a,const node&b)

32void add(int x,int

v)37}38

int query(int

x)44

return

ans;45}

46int

check[n];

47int

main()

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

59 sort(d+1,d+cnt+1

);60 cnt=unique(d+1,d+cnt+1)-d-1;61

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

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

67 sort(q+1,q+m+1

,cmp);

68int head=1;69

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

74else

79 dp[i]=query(a[i]-1)+1;80

add(a[i],dp[i]);81}

82}83int max0=query(cnt);

84 head=m;

85 memset(c,0,sizeof

c);86

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

92else

97 dp[i]=query(a[i]+1)+1;98

add(a[i],dp[i]);

99if(dp[i]+dp[i]==max0+1)check[dp[i]]++;

100}

101}

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

108for(int i=1;i<=m;i++)cout

;109

return0;

110 }

over

HAOI2015 T2 樹狀陣列

題意 維護一棵樹,要求可以支援1 單點權值加,2 以某點為根的子樹中的所有點權值加,3 詢問某點到根路徑上的點權和 分析 法1 樹鏈剖分,以後來補吧 法2 線段樹 與下面的大相徑庭 法3 樹狀陣列維護尤拉序列。差分的思想與dfs序結合,i點在dfs序中的位置 進出等價 的字首和就是i到根的權值和。對...

數星星 contest 樹狀陣列練習 T2

天空中有一些星星,這些星星都在不同的位置,每個星星都有個座標,如果乙個星星的左下方 包括正左和正下 有k顆星星,就說這顆星星是k級的。給定星星的位置,輸出各級星星的數目。第一行,乙個整數n,表示星星的數目。接下來n行,每行兩個整數x,y,表示乙個星星的座標,輸入資料保證不會有星星重疊。n行,每行乙個...

bzoj4034 T2 樹鏈剖分 樹狀陣列

一種明顯的做法是直接樹鏈剖分然後用區間修改區間查詢樹狀陣列 我寫的這種 或者線段樹來維護吧。這樣做是o nlog 2n 的。但是還可以做到o nlogn 首先可以發現它是單點鏈上查詢,那麼可以考慮用差分的思想,或者考慮將單點修改直接變成區間修改然後就只用單點簡單查詢了。首先考慮單點修改,這種操作只對...