牛客练习思维.

k小数查询

解法1:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#define int long long
using namespace std;
typedef long long ll;

const int N = 200005;
ll a[N], b[N];
ll n, x, k;
map<ll, ll> mp;
signed main()
{
    
    
    scanf("%lld%lld%lld", &n, &x, &k);
    int pos ;
    for(int i = 1; i <= n; i ++ )
    {
    
    
        scanf("%lld", &a[i]);
        if(a[i] == x) pos = i;
        if(a[i] <= x) b[i] = 1;
        else b[i] = 0;
    }
    mp[0] ++ ;
    for(int i = 1; i <= n; i ++ )
    {
    
    
        b[i] = b[i - 1] + b[i];
        if(i < pos) mp[b[i]] ++ ;
    }
    int cnt = 0;
    for(int i = pos; i <= n; i ++ )
    {
    
    
        cnt += mp[b[i] - k];
    }
    cout << cnt;
    return 0;
}

解法2:

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

const int N=200005;
int a[N],x,n,k,pos[N],low[N],cnt;
int main(){
    
    
    scanf("%d%d%d",&n,&x,&k);
    if(k>x){
    
    puts("0"); return 0;}
    for(int i=1;i<=n;i++){
    
    
        scanf("%d",a+i);
        pos[a[i]]=i;
    }
    for(int i=1;i<=x;i++)
        low[++cnt]=pos[i];
    sort(low+1,low+cnt+1);
    low[0]=0;
    low[cnt+1]=n+1;
    long long ans=0;
    for(int i=1;i+k-1<=cnt;i++){
    
    
        if(low[i]<=pos[x]&&low[i+k-1]>=pos[x]){
    
    
            ans+=1ll*(low[i]-low[i-1])*(low[i+k]-low[i+k-1]);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_50435987/article/details/121016019