1 条题解

  • 0
    @ 2026-7-24 15:28:47

    思路

    题意很简单,注意题中说的是子串,不是序列,看到题解都写什么容斥,dp,完全没有必要啊!因为是子串,他必须连续啊!所以我们可以考虑以每一个元素作为结尾时的方案,且这个方案中每个子串都需要包含最大和最小值,我们先考虑当 aia_{i} << yyaia_{i} >> xx 时,那必然是不能选进去的,所以我们就从开头或者是它的后面选,我们就可以统计下目前到这个元素的元素值是否包含 xxyy,如果都包含,那说明这个元素一定能作为子串的结尾,那我们只需要统计一下前面 xxyy 出现的地方距离它的最远距离,如果出现了第二个 xxyy 前面那个就当成普通元素就行了。

    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
    上传者