Comet OJ - 模拟赛 #2 Day1 比赛总结
比赛情况
40 + 60 + 0 = 100pts
哎,T1做错了,没有对拍。如果发现错误 \(=>\) 改正 \(=>\) 40->100pts,160pts \(=>\) 就是rk11,12了(没有那么多如果拉)。T3 看不懂题目,我菜出天际。。。然而dalao们还是轻松AK了。
比赛总结
这场比赛还是总体偏水,比较套路。但是我的能力应该是在160pts。
T1 :T1比CSPD1T1可能要难一点,有套路的。考场上看到这题我就马上联想到了双指针和dp,没有太看dp的正确性就写了dp,其实这个dp是错误的。
T2 :T2就是一个套路题。60pts的做法我调了好一会,100pts的做法是卢卡斯定理,没得说。
T3 :有许些dalao切了T3,T3应该比CSPD1T3简单得多,还好没有去钻T3,因为我连题目都看不懂。
问题1:简单的题目做错了。
办法:做题时脑袋要清醒,冷静分析做法,努力AC D1T1;写对拍。
问题2:调程序调得有点急躁
办法:冷静思考问题出在哪里。
T1 波浪
很像双指针计数题,我们就双指针吧。
记录 [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随手切的男人啊,柯西考场降智)
T2 小猪佩奇跳格子
卢卡斯 Lucas定理待补充...
T3 小猪佩奇和仙人掌
看不懂的题目待补充...