Meatycake,51nod2117,樹狀陣列

2021-09-26 16:11:44 字數 878 閱讀 1264

portal

這題挺巧妙的。

我一開始想的就是考慮乙個點對不包含比它大一的點的區間的貢獻,在考慮乙個點 對包含比它大一的點的區間的貢獻,這兩個東西可以用乙個樹狀陣列套主席樹來維護,但是死活卡在2700ms過不了,無奈之下翻看題解。

題解的做法在這裡就不再贅述了:

先考慮區間[l, r]的貢獻。將區間排序後共有r-l+1段,如果i和i+1同時這個區間中,那麼就可以合併兩段為一段。乙個所以乙個區間的貢獻可以轉化為:區間的長度-區間中相鄰數值的對數。

再考慮區間[l, r]的meaty值。按照上面的思路,可以轉變為:子區間的長度和-每對相鄰數值在子區間中的出現次數和。

子區間的長度和為 s(r−l+1) ,s(n)=∑nl=1l⋅(n−l+1)=(n+1)∑nl=1l−∑ni=1l2 。

每對在[l, r]內的相鄰數值會產生貢獻:設數值i和i+1的位置為 li,ri(l≤li這時候注意到還有[li, ri]在[l, r]內的要求,可以用主席樹把l,r當成兩個維度,或者直接離線處理。

複雜度 o(nlogn) 

也不就比我少個log

#includeusing namespace std;

const int n=100010;

templateinline void cmin(it &a,it b)

nod[++tot]=node(x,y,0);

} for(int i=1;i<=m;++i)

solve();

for(int i=1;i<=m;++i)printf("%lld\n",ans[i]);

return 0;

}

51nod 2級演算法題 1007

基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 收藏 關注 將一堆正整數分為2組,要求2組的和相差最小。例如 1 2 3 4 5,將1 2 4分為1組,3 5分為1組,兩組和相差1,是所有方案中相差最少的。第1行 乙個數n,n為正整數的數量。第2 n 1行,n個正...

51nod 2級演算法題 1092

基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 收藏 關注 回文串是指aba abba cccbccc aaaa這種左右對稱的字串。每個字串都可以通過向中間新增一些字元,使之變為回文字串。例如 abbc 新增2個字元可以變為 acbbca,也可以新增3個變為 ab...

51nod 2級演算法題 1279

有一口井,井的高度為n,每隔1個單位它的寬度有變化。現在從井口往下面扔圓盤,如果圓盤的寬度大於井在某個高度的寬度,則圓盤被卡住 恰好等於的話會下去 盤子有幾種命運 1 掉到井底。2 被卡住。3 落到別的盤子上方。盤子的高度也是單位高度。給定井的寬度和每個盤子的寬度,求最終落到井內的盤子數量。如圖井和...