我們假設, 一次可以擊打任意多相鄰連續的紅球,也可以只擊打乙個球。 並且紅球既不會落袋,也不會相
互發生碰撞,而只是停留在原處。每次擊打時候,要想「k到紅球」,至少要擊打乙個紅球,如果想一次擊打
多個紅球,那麼擊打 的紅球必須是依次連續排列的。 如果一次「k到紅球」所有紅球的標號之和的平均數大於
母球的標號 \(m\),就獲得了一 個「連擊」。
現在請你幫幫 hs_black 計算總共能有多少種「連擊」方案。注意:如果當前有標號為 \(1,2,3\) 的三種紅球,母球標號為 \(0\),有如下 \(6\) 種獲得「連擊」方 案:\((1),(2),(3),(1,2),(2,3),(1,2,3)\)
輸入共有兩行,第一行是\(n\),\(m\) (\(n⩽100000,m⩽10000\)) ,nn 表示檯面 上一共有 \(n\) 個紅球,\(m\) 表示
母球的標 號。 第二行是 \(n\) 個正整數,依次表示臺面上 \(n\) 個紅球的標號,所有標號均不超過 \(10000\)
輸出只有乙個數,為「連擊」的方案總數。
思路先說一下暴力,維護乙個字首和,\(n^2\)的時間複雜度掃一遍就行,
說正解,學會手玩式子還是挺重要的
我們要求的就是滿足\(\dfrac >m\)的區間的個數,這裡規定\(j>i\)
我們變形一下便會得到
\(sum\left[ j\right] -sum\left[ i\right] >mj-mi(j>i)\)
\(sum\left[ j\right] -mj >sum\left[ i\right] -mi(j>i)\)
不妨把\(sum[j]-mj\)和\(sum[i]-mi\)分別看成單獨的兩項,即\(v[j],v[i]\)
問題就簡化成了\(v[j]>v[i](j>i)\)
看到這個我們還是沒法用我們已知的演算法進行求解,我們看到這個形式不難會想到逆序對
只要我們再取一次反,不就變成了\(v[j]i)\),也就是求逆序對的問題嗎
歸併求或者樹狀陣列進行求解都是可以的
但是這個注意有個小細節,就是如果單獨的乙個數是大於\(m\)的,那麼它也是滿足條件的,
為了不漏掉這種情況,我們在數的最開始加乙個值為0的數
那會不會對其他情況產生影響呢,答案是不會的,因為我們的\(v\)早已經處理好了
**就是歸併排序求逆序對的寫法
#includeusing namespace std;
const int n=200000;
int sum[n];
int n,m;
int a[n];
template inline void read(t &x)
long long res;
int q[n],tmp[n];
long long merge_sort(int q,int l,int r)
}while(i<=mid)tmp[k++]=q[i++];
while(j<=r) tmp[k++]=q[j++];
for(int i=l,j=0;i<=r;i++,j++) q[i]=tmp[j];
return res;
}int main()
for(int i=1;i<=n;i++)
//產生新的sum陣列 產生方式就是sum[i]=-(sum[i]-mi)
merge_sort(sum,0,n);
cout
}
數學分析摘要
對於任何非空有上界的集合 a 其上界b的集合b含有最小元b 也就是說,存在唯一的元素b b使得 1 b 是集合a的上界,即對於一切a a 成立b a 2 b 是集合 b 的最小元素,也就是說對於一切b b,有b b 元素b 叫做集合a的上確界 記作 b sup a 同樣的,對於有下界的集合 a 其下...
工科數學分析之數學感悟
上課總有一頭霧水的時候,一頭霧水皆因神遊,某幾個概念沒有聽,課前也沒有預習,導致根本不知道講的名詞或者符號是啥意思,結果呈滾雪球狀之後全聽不懂。這時候我都是迅速翻書找這些概念,先弄懂了再跟著老師走。看來課前預習課後複習的學習方法什麼時候都不過時。大學之前學習數學,會得出乙個規律,最後算出來的答案往往...
訊號處理與數學分析
訊號處理與數學分析 在一般的講授數碼訊號基本理論的書中,數學推導往往佔據了很大的篇幅。更有甚者,通篇是數學推導,難得有文字的說明和物理的解釋。這往往給人一種錯覺,數字訊號處理的基本理論是不是必須要通過數學公式才能描述?訊號處理是不是只是數學分析的乙個分支?確實,數字訊號處理中的很多概念,從理論層面的...