Educational Codeforces Round 154 (Rated for Div. 2)

B和C写的太慢了。
吃了不该吃的罚时,C还莫名其妙的T了一发,另一发也是不应该T的。

B连想了两个假做法,然后甚至都实现了,然后过不了样例,再基于这两个才想到了真做法。
当时的思路已经有些模糊了,但是确实是写的太慢了,而且\(O(n^2)\)的限制给的也很宽裕,但是我居然还傻乎乎的去先\(O(n^2)\)的解法,而这个解法明显没有很复杂,但是他却给了5000的n,不够敏锐。事实上,想的时候去手玩一下样例,是完全没有问题的,cf的样例一向是给的很良心的,这个速度,我是不能接受的。而且像的时候应该就有感觉了。为什么不去仔细想想呢?
与其开始实现,不如想清楚了再开始,不仅快,而且稳多了。

C的话,把n的大小看成B的了,然后T 了。
不过实现的时候还是挺满意的,思维很严谨,速度也可以。

D的话,不是很好。不过也是前面的时间不够了,导致心态有点爆炸,这边完全没有冷静思考,而且。。vp的态度不好。。
其实很明显啊,就是前面一部分是负数,后面一部分就是正数。这个看出来之后,还需要知道,固定这个点之后,其实固定的解法就只有一种了,\(O(n^2)\)可做。而优化的思路也很简单和经典,就是关注相邻两个点之间答案的区别,发现很可统计,然后就好了。

一个快1800的人,做edu卡B了。怎么想都觉得恐怖。不过上次连B都没做出来,直接跳过,也是一个不错的策略。
反倒是D,不应该做不出来,其实最近做多了,可能2100的瓶颈已经要突破了,要相信自己,普通的D已经难不住了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read() {
	char c=getchar();int a=0,b=1;
	for(;c<'0'||c>'9';c=getchar())if(c=='-')b=-1;
	for(;c>='0'&&c<='9';c=getchar())a=a*10+c-48;return a*b;
}
ll n,a[200001];
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	int T=read();
	while(T--)
	{
		n=read();
		for(int i=1;i<=n;i++)
		{
			a[i]=read();
		}
		ll now=0,ans=0x3f3f3f3f;
		for(int i=2;i<=n;i++)
		{
			if(a[i]<=a[i-1])now++;
		}
		ans=now;
		for(int i=1;i<n;i++)
		{
			if(i!=1)if(a[i-1]<=a[i])now++;
			if(i==1)now++;
			if(a[i+1]<=a[i])now--;
			ans=min(ans,now);
		}
		cout<<ans<<endl;
	}
	return 0;
}
/*
1
6
2 5 3 3 6 10


*/

放个D的代码吧

posted @ 2024-04-11 15:51  HL_ZZP  阅读(5)  评论(0编辑  收藏  举报