[语言月赛 202312] 函数零点
题目描述
小 F 在做梦时得到了一个神秘函数 ϕ ( x ) \phi(x) ϕ(x),这是一个连续函数。
零点 x = x 0 x=x_0 x=x0 是一系列特殊的数,使得 ϕ ( x 0 ) = 0 \phi(x_0)=0 ϕ(x0)=0,很可惜的是, ϕ ( x ) \phi(x) ϕ(x) 函数相当复杂,无法精确计算其零点。
零点存在定理
若 ϕ ( a ) ⋅ ϕ ( b ) < 0 \phi(a)\cdot \phi(b)<0 ϕ(a)⋅ϕ(b)<0,则在区间 ( a , b ) (a,b) (a,b) 内,函数 ϕ ( x ) \phi(x) ϕ(x) 至少存在一个零点。
小 F 计算了 0 ∼ N 0 \sim N 0∼N 范围内,每个整数 w w w 的函数值 ϕ ( w ) \phi(w) ϕ(w),请问,运用零点存在定理,可以确定在 ( 0 , N ) (0,N) (0,N) 范围内,函数 ϕ ( x ) \phi(x) ϕ(x) 至少有多少零点?
输入格式
输入共两行。
输入的第一行为一个整数 N N N。
输入的第二行为 N + 1 N+1 N+1 个整数,依次代表 ϕ ( 0 ) , ϕ ( 1 ) , ⋯ , ϕ ( N ) \phi(0),\phi(1),\cdots,\phi(N) ϕ(0),ϕ(1),⋯,ϕ(N)。
保证第二行中所有数据不为 0 0 0。
输出格式
输出一行一个整数,代表在 ( 0 , N ) (0,N) (0,N) 上, ϕ ( x ) \phi(x) ϕ(x) 至少有多少个零点。
样例 #1
样例输入 #1
5
-2 1 3 -2 1 2
样例输出 #1
3
提示说明
样例 1 说明
ϕ ( 0 ) = − 2 , ϕ ( 1 ) = 1 , ϕ ( 2 ) = 3 , ϕ ( 3 ) = − 2 , ϕ ( 4 ) = 1 , ϕ ( 5 ) = 2 \phi(0)=-2,\phi(1)=1,\phi(2)=3,\phi(3)=-2,\phi(4)=1,\phi(5)=2 ϕ(0)=−2,ϕ(1)=1,ϕ(2)=3,ϕ(3)=−2,ϕ(4)=1,ϕ(5)=2。在 ( 0 , 1 ) (0,1) (0,1), ( 2 , 3 ) (2,3) (2,3), ( 3 , 4 ) (3,4) (3,4) 上各至少有一个零点。
- ϕ ( 0 ) × ϕ ( 1 ) = − 2 < 0 \phi(0) \times \phi(1) = -2 < 0 ϕ(0)×ϕ(1)=−2<0,按照零点存在定理,在 0 < x < 1 0 < x < 1 0<x<1 的区域一定会有至少一个零点。
- ϕ ( 1 ) × ϕ ( 2 ) = 3 > 0 \phi(1) \times \phi(2) = 3 > 0 ϕ(1)×ϕ(2)=3>0,无法保证在 1 < x < 2 1 < x < 2 1<x<2 的区域存在零点。
- ϕ ( 2 ) × ϕ ( 3 ) = − 6 < 0 \phi(2) \times \phi(3) = -6 < 0 ϕ(2)×ϕ(3)=−6<0,按照零点存在定理,在 2 < x < 3 2 < x < 3 2<x<3 的区域一定会有至少一个零点。
- ϕ ( 3 ) × ϕ ( 4 ) = − 2 < 0 \phi(3) \times \phi(4) = -2 < 0 ϕ(3)×ϕ(4)=−2<0,按照零点存在定理,在 3 < x < 4 3 < x < 4 3<x<4 的区域一定会有至少一个零点。
- ϕ ( 4 ) × ϕ ( 5 ) = 2 > 0 \phi(4) \times \phi(5) = 2 > 0 ϕ(4)×ϕ(5)=2>0,无法保证在 4 < x < 5 4 < x < 5 4<x<5 的区域存在零点。
故至少能保证有 3 3 3 个零点。
数据规模与约定
- 对于 30 % 30\% 30% 的测试数据, 1 ≤ N ≤ 5000 1 \le N \le 5000 1≤N≤5000, ϕ ( i ) ∈ { − 1 , 1 } \phi(i) \in \{-1, 1\} ϕ(i)∈{−1,1}。
- 对于 100 % 100\% 100% 的测试数据, 1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1≤N≤105, 0 < ∣ ϕ ( i ) ∣ ≤ 1 0 9 0<|\phi(i)|\le10^9 0<∣ϕ(i)∣≤109。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
ll a[N];
int main()
{
ll n;
cin>>n;
ll ans=0;
for(ll i=0;i<=n;i++)
{
cin>>a[i];
if(i)
{
ll res=a[i]*a[i-1];
if(res<0) ans++;
}
}
cout<<ans<<endl;
return 0;
}