40 + 60 + 0 = 100ptsc++
哎,T1作錯了,沒有對拍。若是發現錯誤 \(=>\) 改正 \(=>\) 40->100pts,160pts \(=>\) 就是rk11,12了(沒有那麼多若是拉)。T3 看不懂題目,我菜出天際。。。然而dalao們仍是輕鬆AK了。spa
這場比賽仍是整體偏水,比較套路。可是個人能力應該是在160pts。指針
T1 :T1比CSPD1T1可能要難一點,有套路的。考場上看到這題我就立刻聯想到了雙指針和dp,沒有太看dp的正確性就寫了dp,其實這個dp是錯誤的。code
T2 :T2就是一個套路題。60pts的作法我調了好一會,100pts的作法是盧卡斯定理,沒得說。get
T3 :有許些dalao切了T3,T3應該比CSPD1T3簡單得多,還好沒有去鑽T3,由於我連題目都看不懂。it
問題1:簡單的題目作錯了。class
辦法:作題時腦殼要清醒,冷靜分析作法,努力AC D1T1;寫對拍。程序
問題2:調程序調得有點急躁總結
辦法:冷靜思考問題出在哪裏。思考
很像雙指針計數題,咱們就雙指針吧。
記錄 [l,r] 一個極大區間,這個區間是波浪形的(即< >=交錯出現,相鄰的兩個符號不等),這個區間的波浪子區間數是 (r-l)*(r-l+1)/2 等差數列求和。注意 l>n-1 了就不能走了,由於這個區間至少爲2
Talk is cheap.Show me the code.
#include<bits/stdc++.h> using namespace std; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); } return x * f; } typedef long long LL; const int N = 3e6+7; int n; int a[N],b[N]; int main() { n = read(); for(int i=1;i<=n;++i) a[i] = read(); for(int i=1;i<=n-1;++i) b[i] = (a[i]<=a[i+1]); int l = 1, r = 0; LL ans = 0; while(l<=n-1) { r = l+1; while(r<=n-1 && b[r-1]!=b[r]) ++r; ans += (r-l)*(r-l+1)/2; l = r; } printf("%lld\n",ans); return 0; } /* 5 1 2 3 2 1 5 */
(其實我也是T1隨手切的男人啊,柯西考場降智)
盧卡斯 Lucas定理待補充...
看不懂的題目待補充...