題解 bzoj P1012 最大數(線段樹)

2021-08-21 21:15:17 字數 840 閱讀 2011

可以用線段樹解決這個問題,對某個葉子節點修改其值,最後尋找在某個區間內的最大值。這裡只需要把兒子結點相加的操作變為父親結點=兒子節點的最大值即可。

#include#include#include#define ll long long

using namespace std;

const int maxn=200010;

int m,mod;

int tot=0;

int mmax[maxn*8];

void add(int now,int l,int r,int x,int y)

int mid=(l+r)/2;

if(x<=mid) add(now*2,l,mid,x,y);

else add(now*2+1,mid+1,r,x,y);

mmax[now]=max(mmax[now*2],mmax[now*2+1]);

}int getsum(int now,int l,int r,int x,int y)

int ans=-1e9;

if(x<=mid) ans=max(ans,getsum(now*2,l,mid,x,y));

if(mid+1<=y) ans=max(ans,getsum(now*2+1,mid+1,r,x,y));

return ans;

}int main()

scanf("%d%d",&m,&mod);

int t=0;

int tmp;

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

if(c=='q')

}return 0;

}

線段樹 最大數

給定乙個正整數數列 a1,a2,an,每乙個數都在 0 p 1 之間。可以對這列數進行兩種操作 新增操作 向序列後新增乙個數,序列長度變成 n 1 詢問操作 詢問這個序列中最後 l 個數中最大的數是多少。程式執行的最開始,整數序列為空。寫乙個程式,讀入操作的序列,並輸出詢問操作的答案。輸入格式 第一...

最大數(線段樹 單調棧)

寫線段樹的話太裸了,但是題意非常難搞,認真讀題 其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,則t 0 並將所得結果對乙個固定的常數d取模,將所得答案插入到數列的末尾。重新賦值 從題解上看到一種單調棧的寫法覺得非常巧妙 利用了題目的特性 每次都是在最後詢問,用單調棧維護,開兩個棧乙個儲存下...

洛谷1198最大數(線段樹)

現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,則t 0 並將所得結果對乙個固定...