hdu4638
題意:n個人,幾個人為一組的要求是號連續,每組價值是人數的平方,詢問m個區間回答每個區間分幾組能達到和最大。
思路:明顯是一組人越多越好,那相當於問給定區間能分幾組的問題了,離線用莫隊演算法,把詢問存起來。
需要注意的就是當前後兩個詢問區間沒有重疊部分的時候,如果先進行了刪除操作,那麼就可能導致出錯,因為刪除了本來不存在的點再新增 和 新增點後再刪除得到的結果是不一樣的。所以莫隊的時候要先新增操作,再刪除。
剩下的就好做了,乙個標記陣列標記每個人是否新增,根據左右人在不在就能o(1)推出加塊還是減塊了。
code:
//hdu 4638
#include
using
namespace std;
const
int ax =
1e5+
666;
int a[ax]
;int block[ax]
;int ans ;
struct node
}q[ax]
;int res[ax]
;int mark[ax]
;void
solve
(int x ,
int add )
elseif(
!mark[x-1]
&&!mark[x+1]
)}else
elseif(
!mark[x-1]
&&!mark[x+1]
)}}int
main()
int len =
sqrt
(n);
for(
int i =
1; i <= n ; i++
)for
(int i =
1; i <= m ; i++
)sort
( q +
1, q + m +1)
;int l =
1, r =0;
for(
int i =
1; i <= m ; i++
)for
(int i =
1; i <= m ; i++)}
return0;
}
HDU4638 莫隊演算法,講解)
解題思路 第一次做莫隊演算法,推薦部落格入門。結合上面那片部落格,我先講一下自己對莫隊演算法時間複雜度的理解。首先我們將乙個block設為sqrt n n為數列的長度。然後按提的問題的區間進行排序,排序的規則是 這麼做的目的是使l和r指標的移動複雜度盡可能相等。1.首先對l的移動複雜度進行分析。l最...
HDU6333 莫隊演算法
給你n,m求 i 0mcn i 1 09 7 sum m 10 9 7 i 0m cni 10 9 7 t組資料t 1 05,1 m,n 105 t leq 10 5,1 leq m,n leq 10 5 t 105,1 m,n 10 5。這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的...
HDU6333 莫隊演算法
給你n,m求 t組資料 這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的,所以,採用莫隊演算法將t個詢問排序,之後將m看做l,n看做r,通過觀察可以發現 所以首先將r加 減到指定行,之後對l進行加 減,設res為答案,即 r加的時候 r減的時候 l加的時候 l減的時候 具體見 inclu...