有\(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...