求助,双指针,但是全都T了
查看原帖
求助,双指针,但是全都T了
1185696
afreshmanofclanguage楼主2024/7/29 09:20
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int t,n,l,arr[N],vis[N];
long long number;
bool check(int l,int r) // 是否有2个一样的课排在一起
{
    for(int s = l;s<=r-1;s++)
        if(arr[s] == arr[s+1]) return 1;
    return 0;
} // N
bool numx(int x) // 检测当前选课是否到达了x
{
    int cnt = 0;
    for(int i = 1;i<=n;i++)
        if(vis[i]) cnt++;
    return cnt == x;
}  // N
void ans(int x) // 当前学习课程数目为X
{
    memset(vis,0,4 * N);
    for(int i = 1,j = 1;i<=n;i++)
    {
        if(j - 2 + x > n) return ;
        int flag = 0;
        vis[arr[i]]++;
        while(j <= i && numx(x)) // [j-1,i]
        {
            flag = 1;
            vis[arr[j]] --;
            j++;
        }
        if(flag) // 开始对条件进行检验
        {
            if(arr[i] == arr[j - 1]) continue;
            else if(check(j-1,i)) continue;
            else number++;
        }
    }
    
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&l);
        for(int i = 1;i<=n;i++)
            scanf("%d",&arr[i]);
        number = 0;
        l = l == 1?2 : l;
        for(int i = l;i<=n;i++) // N
            ans(i);
        printf("%lld\n",number);
    }
    return 0;   
}   //P6465 
2024/7/29 09:20
加载中...