1 条题解
-
0
思路
题意很简单,注意题中说的是子串,不是序列,看到题解都写什么容斥,dp,完全没有必要啊!因为是子串,他必须连续啊!所以我们可以考虑以每一个元素作为结尾时的方案,且这个方案中每个子串都需要包含最大和最小值,我们先考虑当 或 时,那必然是不能选进去的,所以我们就从开头或者是它的后面选,我们就可以统计下目前到这个元素的元素值是否包含 或 ,如果都包含,那说明这个元素一定能作为子串的结尾,那我们只需要统计一下前面 和 出现的地方距离它的最远距离,如果出现了第二个 或 前面那个就当成普通元素就行了。
AC 代码
#include<bits/stdc++.h> using namespace std; #define int long long int a[1000005]; signed main(){ int n,x,y; cin>>n>>x>>y; for(int i=1;i<=n;i++){ cin>>a[i]; } int la=0; int max1=-1; int min1=-1; int sum=0; for(int i=1;i<=n+1;i++){ if(a[i]==x){ if(max1==-1)max1=i; max1=max(max1,i); } if(a[i]==y){ if(min1==-1)min1=i; min1=max(min1,i); } if(a[i]<=x and a[i]>=y){ if(max1!=-1 and min1!=-1){ sum+=min(max1,min1)-la; } } else{ max1=-1; min1=-1; la=i; } } cout<<sum; }
- 1
信息
- ID
- 12450
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 8
- 标签
- 递交数
- 19
- 已通过
- 5
- 上传者