JSOI2008最大數 資料結構

2021-08-19 17:50:33 字數 1572 閱讀 7589

這道題有三個做法呢

第乙個就是普通的線段樹

太懶了不打了

第二個可以單調棧+二分

維護乙個單調遞減的單調棧

每次加入數的時候

把這個數前面小於它的都刪掉

然後查詢的時候二分找到最前面的在所求範圍內的

但是話說這種方法好像被加強的資料卡了???

我也不帶了優化了

泥萌自己優化一下看能不能過···

不過這種比較新穎的想法應該都是對著卡才能卡過吧

而且**很短思路清晰

也不容易寫錯

總之是乙個很不錯的選擇啦!

**:

#include

#include

#include

#include

#include

#define maxn 200005

using

namespace

std;

int tot,num;

long

long d,t,m;

inline

long

long rd()

while(c<='9' && c>='0') x=x*10+c-'0', c=getchar();

return x*fla;

}struct stacckstk[maxn];

inline

void check(int num,long

long x)

inline

long

long query(int l,int l,int r)

return stk[r].w;

}int main()

else

t=query(num-x+1,1,tot);

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

return

0;}

第三種

這道題用分塊也能做耶

而且比線段樹快好多

這種比較暴力的也比較好打的耶【雖然下面這個不是我打的】

**:

#include

#include

#include

#define neko 200010

#define chkmin(a,b) ((a)<(b)?(a):(b))

#define chkmax(a,b) ((a)>(b)?(a):(b))

#define f(i,a,b) for(register int i=(a);i<=(b);i=-(~(i)))

using

std::cin;

typedef

long

long ll;

int p,blk,m,bl[neko];

ll mod,t,a[neko],max[neko];

template

void read(t &x)

}void update(ll x)

ll query(int l,int r)

int main()

}return

0;}

JSOI2008 最大數(線段樹)

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

JSOI2008 最大數(線段樹基礎)

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

最大數 洛谷1198 JSOI2008

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