可以用線段樹解決這個問題,對某個葉子節點修改其值,最後尋找在某個區間內的最大值。這裡只需要把兒子結點相加的操作變為父親結點=兒子節點的最大值即可。
#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 並將所得結果對乙個固定...