序列上的問題?想到莫隊。
然而這題像bzoj4241 歷史研究一樣毒瘤,資瓷o(1
)o(1)
o(1)
加入,不資瓷o(1
)o(1)
o(1)
刪除。安利一波題解:bzoj4241 歷史研究qwq
所以像4241一樣,需要用到回滾莫隊。
這裡開兩個陣列l,r
l,rl,
r,l[i]
l[i]
l[i]
表示加入i時,i
ii到值域連續段左端有多少個數,r[i
]r[i]
r[i]
表示加入i時,i
ii到值域連續段右端有多少個數。
加入乙個數x
xx時,除了l[x
],r[
x]
l[x],r[x]
l[x],r
[x]要修改,還要修改x
xx所在的值域連續段的左端和右端(以保證下一次更新不會出錯)
然後就像回滾莫隊的普通操作一樣,對於每個塊,求解左端點在塊中的詢問的答案,詢問完後撤銷左端點的操作。
因為這裡加入乙個數x
xx時不只更新了l[x
]l[x]
l[x]
和r [x
]r[x]
r[x]
,所以要開乙個棧儲存更新了哪些位置和更新前的值。
然後撤銷就大力pop
poppo
p就珂以了qwq。
p s.
ps.ps
.這段**在bzo
jbzoj
bzoj
上過了,本地也跑過了所有資料,但是在毒瘤czh
czhcz
h的oj
ojoj
上就莫名爆0
00 qwq
大概是rprp
rp又不夠了,感覺可以從孟孫那裡吸一些rprp
rp
#include
#include
#include
#include
#define re register int
#define rl register ll
using
namespace std;
typedef
long
long ll;
intread()
while
(ch>=
'0'&& ch<=
'9')
return x*f;
}namespace i_love q[size]
;inline
bool
comp
(query x,query y)
int tmpl[size]
,tmpr[size]
,tp,stkl[size]
,stkr[size]
;int
baoli
(int l,
int r)
//要更新a[i]所在的值域連續段的左右端點
tmpl[a[i]
+tmpr[a[i]]-
1]=now;
tmpr[a[i]
-tmpl[a[i]]+
1]=now;
//加到棧中
stkl[
++tp]
=a[i]
+tmpr[a[i]]-
1;stkr[tp]
=a[i]
-tmpl[a[i]]+
1;stkl[
++tp]
=a[i]
; stkr[tp]
=a[i];}
while
(tp)
return nowmax;
}int lpos[size]
,rpos[size]
;int ans,out[size]
;struct stack
} s;
void
add(
int x,
bool flag)
if(flag)
lpos[x+rpos[x]-1
]=now;
rpos[x-lpos[x]+1
]=now;
}void
del(
)void
fujibayashi_ryou()
for(re i=
1; i<=m; i++
)sort
(q+1
,q+1
+m,comp)
;int num=belong[n]
,now=0;
for(re i=
1; i<=num; i++
)//右邊的操作是不用撤銷的
while
(r.r)add
(a[++r],0
);int pre=ans;
while
(l>q[j]
.l)add
(a[--l],1
);out[q[j]
.id]
=ans;
while
(s.top)
del();
while
(l<=blockr)
lpos[a[l]
]=rpos[a[l++]]
=0; ans=pre;
now=j;}}
for(re i=
1; i<=m; i++)}
}int
main()
/*9 3
2 4 3 6 1 5 8 9 7
3 52 6
1 4*/
bzoj4241 歷史研究 回滾莫隊
ioi國歷史研究的第一人 joi教授,最近獲得了乙份被認為是古代ioi國的住民寫下的日記。joi教授為了通過這份日記來研究古代ioi國的生活,開始著手調查日記中記載的事件。日記中記錄了連續n天發生的時間,大約每天發生一件。事件有種類之分。第i天 1 i n 發生的事件的種類用乙個整數xi表示,xi越...
bzoj4241 歷史研究 回滾莫隊
題目大意 給定乙個長度為n nn的序列,有q qq個詢問,要求回答區間 l,r l,r l,r 內,出現過的權值與其出現次數的積的最大值。n m 1 05 n,m 10 5 n,m 1 05首先這道題一看就是莫隊qwq 然後發現如果只有插入操作是很容易的,珂以直接o n n o n sqrt o n...
BZOJ4241 歷史研究 回滾莫隊
題目描述 給出乙個長度為 n 的陣列,每次詢問區間 l,r 求 max limits x cnt x 其中 cnt x 表示 x 在區間 l,r 的出現次數。資料範圍 n le 10 5,a i le 10 9 分塊也可以做到 o n sqrt 但是空間也是 o n sqrt 使用回滾莫隊可以在 o...