題目傳送門
【題目大意】
【思路分析】
參考這道題
「對頂堆」的做法,我們可以用乙個類似的「對頂棧」做法。棧$a$記錄從序列開頭到游標位置的子串行,棧$b$記錄從游標後到序列結尾的子串行,兩個棧都以游標所在的一端為棧頂。因為第五種操作查詢的位置$k$不超過游標位置,所以我們用乙個陣列$sum$記錄棧$a$的字首和,$f$記錄字首和最大,對於每種操作如下處理:
1.「$i\ x$」操作:把$x$插入棧$a$,更新$sum$陣列和$f$陣列
2.「$d$」操作:把$a$的棧頂彈出
3.「$l$」操作:彈出$a$的棧頂,插入棧$b$
4.「$r$」操作:彈出$b$的棧頂,插入棧$a$,更新$sum$陣列和$f$陣列
5.「$q\ k$」操作:直接返回$f[k]$
彈出棧頂時要注意棧頂元素是否存在。
【**實現】
1 #include2 #include3 #include4 #include5 #include6**戳這裡#define g() getchar()
7#define rg register
8#define go(i,a,b) for(rg int i=a;i<=b;i++)
9#define back(i,a,b) for(rg int i=a;i>=b;i--)
10#define db double
11#define ll long long
12#define il inline
13#define pf printf
14using
namespace
std;
15int
fr()
22while(ch>='
0'&&ch<='
9') w=(w<<1)+(w<<3)+ch-'
0',ch=g();
23return w*q;24}
25const
int n=1e6+2;26
inta[n],b[n],sum[n],f[n],q,ha,hb;
27int
main()
38if(type=='
d'&&ha>0) ha--;
39if(type=='
l'&&ha>0)43
if(type=='
r'&&hb>0)49
if(type=='q'
)53}54
return0;
55 }
LeetCode每日一題 1 28
鏈結給定乙個整數型別的陣列 nums,請編寫乙個能夠返回陣列 中心索引 的方法。我們是這樣定義陣列 中心索引 的 陣列中心索引的左側所有元素相加的和等於右側所有元素相加的和。如果陣列不存在中心索引,那麼我們應該返回 1。如果陣列有多個中心索引,那麼我們應該返回最靠近左邊的那乙個。示例 1 輸入 nu...
leetcode刷題,總結,記錄,備忘 128
leetcode128longest consecutive sequence given an unsorted array of integers,find the length of the longest consecutive elements sequence.for example,g...
組合數(思維題 int128)
題意很簡單吧 就是算c n,k 和1e18的大小 如果你手寫一下就可以把c n,m 寫成 可以很明顯發現分子最左邊的n k可定小於分母最後邊的n k 1 所以他們能相同約分 然後就有乙個new知識點了!int128這個是只能在計算時使用的資料型別,不能在輸入輸出的時候使用 所以這道題我就可以這樣想 ...