• BestCoder Round #86 1003


    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5806

    题意:有多少个区间里的第 k 大的数不小于 m

    解法:尺取法,首先我们用dp[i]保存到i的位置有多少大于m的数

    l=1,r=1,r开始遍历,只要符合dp[l]-dp[r]==k就是sum+=(n-r+1)

    然后根据情况移动l,r

    #include<stdio.h>
    //#include<bits/stdc++.h>
    #include<string.h>
    #include<iostream>
    #include<math.h>
    #include<sstream>
    #include<set>
    #include<queue>
    #include<map>
    #include<vector>
    #include<algorithm>
    #include<limits.h>
    #define inf 0x3fffffff
    #define INF 0x3f3f3f3f
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define ULL unsigned long long
    using namespace std;
    long long n,m,k;
    long long a[100005];
    long long q,p;
    long long b[100005],e[100005],c[100005];
    long long dp[200005];
    long long sum=0;
    int t;
    long long MAXN1,MAXN2;
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            sum=0;
            int j=0;
            memset(dp,0,sizeof(dp));
            scanf("%d%d%d",&n,&m,&k);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
            }
            for(int i=1;i<=n;i++)
            {
                if(a[i]>=m)
                {
                    dp[i]=dp[i-1]+1;
                }
                else
                {
                    dp[i]=dp[i-1];
                }
               // cout<<dp[i]<<"A"<<endl;
            }
            int i=1;
            while(i<=n)
            {
                while(dp[i]-dp[j]==k)
                {
                    sum+=(n-i+1);
                    j++;
                }
                i++;
            }
            printf("%lld
    ",sum);
        }
        return 0;
    }
    

      

  • 相关阅读:
    PLSQL Developer新建表空间
    oracle中where子句和having子句中的区别
    ORACLE基本数据类型
    Oracle数据库字符集问题
    问题及解决方法
    Show Profile
    批量数据脚本
    慢查询日志
    GROUP BY关键字优化
    order by关键字优化
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/5745047.html
Copyright © 2020-2023  润新知