P3709 大爺的字串題 莫隊 結論

2022-05-20 19:35:37 字數 866 閱讀 1668

p3709 大爺的字串題

有乙個顯然的結論:一段區間裡最小答案為眾數的個數

用莫隊來離線求眾數

\(tmp_i\)表示出現\(i\)次的數的個數,\(num_i\)表示\(i\)出現的次數

縮小區間:答案可能減小,看答案所在的\(tmp\)是否不唯一

擴大區間:答案增大

#includetypedef int ll;

const ll maxn=1e6+9;

inline ll read()

while(c>='0' && c<='9')return x*f;

}struct nodeqy[maxn];

ll n,m,ret;

ll ans[maxn],num[maxn],tmp[maxn],a[maxn],b[maxn],bel[maxn];

inline bool cmp(node xx,node yy)

inline void modify(ll val,ll op)else

}int main();

ll pieces(sqrt(n)),size(n/pieces);

for(ll i=1;i<=pieces;++i)

for(ll i=pieces*size+1;i<=n;++i)

bel[i]=pieces+1;

std::sort(qy+1,qy+1+m,cmp);

tmp[0]=n;

ll nl(1),nr(0);

for(ll i=1;i<=m;++i)

for(ll i=1;i<=m;++i) printf("-%d\n",ans[i]);

return 0;

}

P3709 大爺的字串題 腦子 莫隊

簡化題意 區間眾數出現次數?為什麼?原因是,貪心的想,我們要劃分成盡量少的嚴格遞增序列,這樣rp掉的最少。設區間眾數出現次數為 x 那我們至少要分成 x 段嚴格上公升序列。include include include include include define r register int us...

莫隊 洛谷 P3709 大爺的字串題

給你乙個字串a,每次詢問一段區間的貢獻 貢獻定義 每次從這個區間中隨機拿出乙個字元x,然後把x從這個區間中刪除,你要維護乙個集合s 如果s為空,你rp減1 如果s中有乙個元素不小於x,則你rp減1,清空s 之後將x插入s 由於你是大爺,平時做過的題考試都會考到,所以每次詢問你搞完這段區間的字元之後最...

P3709 大爺的字串題

p3709 傳送門 lxl出的語文題 其實轉化一下就是求將當前區間最少拆分成多少個嚴格單調上公升序列 可不連續 再轉化一下就是求區間內的眾數個數 本來求眾數的套路是主席樹 二分 這樣在刪除時僅當 sum cnt dat pos 1 時才減少 cur include using namespace s...