1. 程式人生 > >[分塊] [BZOJ2724] [Violet 6] 蒲公英

[分塊] [BZOJ2724] [Violet 6] 蒲公英

//Everyday English:Violet (n.&adj.) 紫羅蘭,藍紫色,紫羅蘭色的;堇菜;羞怯的人。
這道題許可權題,大意是求區間眾數,強制線上
XJB出完聚會那道題之後,發現時間複雜度並不好,常數極大,還不支援線上,做完這道題之後才知道自己智障了……
對於輸入,先離散化一遍,分成n塊。
查詢之前,先預處理一下,統計出兩個東西:cnt[i][j]ans[i][j]
cnt[i][j]表示i這個數在前j塊出現的次數;
ans[i][j]表示從i塊到j塊的答案,統計的都是整塊的答案。
搞定這些的時間複雜度是O(nn)的。
對於cnt[i][j]的統計,先做出每一塊i

出現的次數,然後一遍字首和搞定。對於ans[i][j]的統計,先確定起點l,就是第i塊的起點,然後r向後暴力移動統計,當r等於一個塊的終點時,記錄答案。
對於統計ans[i][j]時,別忘了清陣列,看好r……
記完了,有什麼用呢?
對於一次查詢,假如左右端點之間一個整塊也沒有,直接暴力統計即可。如果有整塊,就可以利用統計出的答案,先定答案就是之間整塊的答案,然後統計零散部分即可。零散部分出現次數可以用之前統計出的字首和快速求出。
至此,時間複雜度為O((n+m)n)。可解決這個問題,同時也可解決聚會那道題,時間真的加快很多。
這裡寫圖片描述
必須吐槽題解裡的std寫的格式太爛了。
Code