給你乙個字串a,每次詢問一段區間的貢獻
貢獻定義:
每次從這個區間中隨機拿出乙個字元x,然後把x從這個區間中刪除,你要維護乙個集合s
如果s為空,你rp減1
如果s中有乙個元素不小於x,則你rp減1,清空s
之後將x插入s
由於你是大爺,平時做過的題考試都會考到,所以每次詢問你搞完這段區間的字元之後最多還有多少rp?rp初始為0
詢問之間不互相影響~
輸入格式:
第一行兩個數n,m,表示字串長度與詢問次數
之後一行n個數,表示字串
由於你是大爺,所以字符集1e9
之後m行每行兩個數,表示詢問的左右區間
輸出格式:
m行,每行乙個數表示答案
輸入樣例#1:
3 33 3 3
3 33 3
3 3
輸出樣例#1:
-1-1-1
前4個點1s,後面的點4s
對於10%的資料,是樣例
對於另外10%的資料,n,m <= 100
對於另外10%的資料,n,m <= 1000
對於另外10%的資料,n,m <= 10000
對於另外10%的資料,n,m <= 100000
對於100%的資料,n,m <= 200000
1 #include 2 #include 3 #include 4 #include 5 #include 6using
namespace
std;
7const
int n=2e5+10;8
intn,m,a[n],num,b[n],cnt[n],p[n],ans,bz[n],len;
9struct edge e[n];
10bool cmp(edge a,edge b)
11void add(int
x)12
16void del(int
x)17
21int
main()
2238
for (int i=1;i<=m;i++) printf("
%d\n
",-p[i]);
39 }
P3709 大爺的字串題 腦子 莫隊
簡化題意 區間眾數出現次數?為什麼?原因是,貪心的想,我們要劃分成盡量少的嚴格遞增序列,這樣rp掉的最少。設區間眾數出現次數為 x 那我們至少要分成 x 段嚴格上公升序列。include include include include include define r register int us...
P3709 大爺的字串題 莫隊 結論
p3709 大爺的字串題 有乙個顯然的結論 一段區間裡最小答案為眾數的個數 用莫隊來離線求眾數 tmp i 表示出現 i 次的數的個數,num i 表示 i 出現的次數 縮小區間 答案可能減小,看答案所在的 tmp 是否不唯一 擴大區間 答案增大 includetypedef int ll cons...
P3709 大爺的字串題
p3709 傳送門 lxl出的語文題 其實轉化一下就是求將當前區間最少拆分成多少個嚴格單調上公升序列 可不連續 再轉化一下就是求區間內的眾數個數 本來求眾數的套路是主席樹 二分 這樣在刪除時僅當 sum cnt dat pos 1 時才減少 cur include using namespace s...