牛客練習賽25B 最長區間 線段樹,思維,模擬

2021-08-25 19:36:00 字數 1780 閱讀 7809

給你乙個長度為 n 的序列 a ,求最長的連續的嚴格上公升區間的長度。

同時會進行 m 次修改,給定 x , y ,表示將 ax 修改為 y ,每次修改之後都要求輸出答案。

第一行 2 個數 n,m,表示序列長度,修改次數; 

接下來一行 n 個數表示 ;

接下來 m 行,每行 2 個數 x , y ,描述一次修改。

第一行 1 個數表示最初的答案;

接下來 m 行,第 i 行 1 個數表示第 i 次修改後的答案。

示例1複製

4 3

1 2 3 4

3 12 5

3 7

複製

422

3

序列變換如下:

1 2 3 4

1 2 1 4

1 5 1 4

1 5 7 4

n,m ≤ 100000,1 ≤ x ≤ n,1 ≤ ai,y ≤ 100
這道題最開始的時候寫的時候是直接暴力,結果超時了。然後看了題解,和大佬的**才明白其中一種做法。這道題有兩種做法。第一種:我們用乙個陣列b[i]表示從第i個數開始連續上公升子串行的長度,c[i]表示長度為i的上公升子串行的個數。我們每改變乙個數字,就要判斷一下a[x],從第x位開始對後面序列長度造成的影響,因為1<=a[i]<=100,上公升序列的長度最長只有100位,我們只用判斷x+100位後面上公升數列的長度的變化。

第一種方法的**:

#include using namespace std;

const int maxn = 2e5+10;

int cnt[maxn],a[maxn], b[maxn];

int solve()

}return 0;}

int main()

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

while(m--)

printf("%d\n",solve());}}

return 0;

}

第二種方法是用線段樹做,不過這種方法我還沒搞懂,先上乙份模仿大佬的**。在這裡立乙個flag,一周內把它給搞懂,然後將出來。

#include#include#include#includeusing namespace std;

const int maxn = 2e5+110;

int a[maxn];

struct segementtreetree[maxn << 2];

void push_up(int u, int l, int r)

}void build(int p,int l, int r)

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

build(2*p,l, mid);

build(2*p+1, mid+1, r);

push_up(p,l,r);

}void change(int u, int l, int r, int p, int d)

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

if(p <= mid)

change(2*u,l,mid, p, d);

else

change(2*u+1,mid+1,r, p, d);

push_up(u, l, r);

}int ask(int u, int l, int r, int tl, int tr)

}int main()

} return 0;

}

牛客練習賽25 最長區間

其中表示left len right len可以用乙個len i 表示 len i 表示包括i的在i之前的最長遞增序列 用len陣列可以很方便得記錄到從x往左的left len等於多少 然後向由可以推出right len cnt i 計算每乙個長度i的序列有多少個 其中 乙個i的子長度的序列也會記錄...

牛客練習賽25

我好菜啊。本來是奔著t恤去的 要求 ans ni 1 j i1 ans i 1n j i 1注意到我們並不需要什麼奇蹟銀殼,只需要交換列舉主體就可以 n做了 include include define rep i,st,ed for int i st i ed i typedef long lon...

牛客練習賽28 B 複習線段樹 )

description qn姐姐給你了乙個長度為n的序列還有m次操作讓你玩,1 l r 詢問區間 l,r 內的元素和 2 l r 詢問區間 l,r 內的元素的平方和 3 l r x 將區間 l,r 內的每乙個元素都乘上x 4 l r x 將區間 l,r 內的每乙個元素都加上x input n,mop...