這道題有三個做法呢
第乙個就是普通的線段樹
太懶了不打了
第二個可以單調棧+二分
維護乙個單調遞減的單調棧
每次加入數的時候
把這個數前面小於它的都刪掉
然後查詢的時候二分找到最前面的在所求範圍內的
但是話說這種方法好像被加強的資料卡了???
我也不帶了優化了
泥萌自己優化一下看能不能過···
不過這種比較新穎的想法應該都是對著卡才能卡過吧
而且**很短思路清晰
也不容易寫錯
總之是乙個很不錯的選擇啦!
**:
#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 並將所得...