洛谷 P1198 最大數

2022-05-10 06:04:14 字數 1272 閱讀 6295

首先這是一道線段樹裸題,但是線段樹長度不確定,那麼我們可以在建樹的時候,將每乙個節點初始化為-inf,每次往隊尾加乙個元素即一次單節點更新,注意本題的資料範圍,其實並不用開 long long,具體請看注釋。

#include #include #include #include #define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

using namespace std;

const int maxn=200005;

int read()

while(c>='0'&&c<='9')

return rv*fh;

}int mod,m,t,ma[maxn<<2],n;

void pushup(int rt)

void build(int l,int r,int rt)

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

build(lson);

build(rson);

pushup(rt);

}void update(int add,int loc,int l,int r,int rt)

int mid=l+((r-l)>>1); //這樣取平均數可以防溢位

if(loc<=mid) update(add,loc,lson);

else update(add,loc,rson);

pushup(rt);

}int query(int l,int r,int l,int r,int rt)

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

int q=-0x7fffffff;

if(l<=mid)

if(mid等等。。本題只要求在隊尾加入元素,而且要求的是隊尾幾個元素的最小值,那麼這道題就可以用單調棧+二分來做

#include #include #include #include using namespace std;

const int maxn=200005;

int read()

while(c>='0'&&c<='9')

return rv*fh;

}int m,mod,t,stack[maxn],head,num[maxn],cnt;

int main()else else

}t=stack[l];

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

fclose(stdin);

return 0;

}

洛谷 P1198 最大數

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

洛谷 P1198 最大數 線段樹

要問區間最大值,肯定是要用線段樹的,不能用樹狀陣列。因為沒有逆元?但是題目求的是最後一段,可以改成類似字首和啊。不行!插入新元素之後更新的複雜度太高了!所以我們就弄乙個初始元素是負數的最大值線段樹,每次插入就是把末尾的元素 update 查詢就是查詢末尾的區間最大值,這樣每次修改 查詢的複雜度是 o...

洛谷1198 最大數

寫了那麼多xx樹和單調佇列後,不如試試爽翻天的倍 r 增 m 吧 q 對於每乙個點,維護從它為起點向左2 j長度的最大值。查詢的時候從大往小列舉2 j更新最大值就行。等等好像 注釋裡面寫過這些了 不保證 的正確性。反正洛谷的資料水過了。1 include 2 include 3 include 4 ...