9 19模擬賽 最小粒子數

2022-04-30 18:27:06 字數 1166 閱讀 8531

有\(n\)個神奇的粒子團排成一列,第\(i\)個粒子團包含\(a[i]\)個粒子, 若\(a[i]\)為正,則表示這個粒子團包含了\(a[i]\)個正粒子,否則包含了\(-a[i]\)個反粒子,現在科學家格里梅爾想取出連續若干個粒子團, 使得這幾個團合在一起後剩下的粒子數最少(一對正反粒子會湮滅)。

另外,格里梅爾希望在滿足上述條件情況下,取出盡量多的粒子團。

第一行輸入\(n\),表示粒子團的個數。接下來\(n\)行描述\(a[i]\)。

第一行輸出乙個整數,表示最少粒子的數量,第二行包含乙個整數表示最多的粒子團。8-2

090-30-20

80-70

-60125

5 3\(40\)%的資料\(n<=4000\)

對於許多資料,最長序列的長度唯一。

\(100\)%的資料\(n<=100000\),\(|\)每個數字的值\(|<=10^\)

求出字首和,按字首和從小到大排序,去重,每次判斷相鄰兩個數的差,求出答案

為了防止字首和為0的情況,可以把字首和也和答案比較

#include#include#include#include#includeusing namespace std;

#define ll long long

#define maxn 200010

struct rec t[maxn];

ll n, max, l, r, ans;

inline ll read()

inline bool cmp(rec x, rec y)

int main()

if (abs(t[r].sum - t[l].sum) == max)

while (abs(t[r].sum - t[l].sum) > max && l < r) l++;

if (l == r) continue;

if (abs(t[r].sum - t[l].sum) < max)

if (abs(t[r].sum - t[l].sum) == max)

} for (register int i = 1; i <= n; i++)

printf("%lld\n", max);

printf("%lld", ans);

return 0;

}

模擬賽 最小環 題解

求包含1號點的最小環。這個最小環一定是從1點的出邊指向的點出發,再回到另乙個1點的出邊指向的點。這等價於1號點所有出邊指向的點中,兩兩之間最短路 1號點到這兩個點的距離的最小值。使用二進位制拆分,分成兩組點,分別向s,t連邊,正反算兩次最短路。時間複雜度 o n m log 2 n 二進位制分組是很...

noip模擬賽 立方數

題目描述 lyk定義了乙個數叫 立方數 若乙個數可以被寫作是乙個正整數的3次方,則這個數就是立方數,例如1,8,27就是最小的3個立方數。現在給定乙個數p,lyk想要知道這個數是不是立方數。當然你有可能隨機輸出一些莫名其妙的東西來騙分,因此lyk有t次詢問 輸入格式 cubic.in 第一行乙個數t...

noip模擬賽 拼不出的數

分析 如果每個數可以選任意多次,那麼就是乙個很普通的dp問題,這裡每個數只能選一次,還是考慮dp,設f i 表示1 i是否都能選上.考慮下乙個數j,如果j i 1,那麼i 1這個數就選不上,答案就是i 1,否則f i 可以轉移到f i j 這個演算法是建立在集合有序的情況下的,所以要先排序.incl...