http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1495&judgeId=519564
这道题给我说了尺取法我也不会,没办法只能看别人的博客(;´д`)ゞ
感觉弄得好巧妙啊~

①首先,条件是选取的长度大于等于 K 这个好理解,就他的两个指针 R L + 1 >= K 就行了。
②但是要求从大到小第 K 大的数要大于 T ,哇~这个就挺巧妙的了,转换成比 T 大的有 K 个,然后就又是前缀和,用一个 s u m [ i ] 表示从 1 i 大于等于 T 的个数,那么 [ L , R ] 中的就是 s u m [ R ] s u m [ L 1 ] ,只要 s u m [ R ] s u m [ L 1 ] >= K 就满足条件

③然后计算答案时,就是用的尺取法的关键了,只要哪一个 [ L , R ] 满足条件那么后面的 [ L , R + 1 ] , [ L , R + 2 ] , , , , 一直到 [ L , N ] 都是满足条件的,于是就阔以直接算出有 N R + 1 个了

#include"iostream"
using namespace std;
const int maxn=1e7+5;
long long a[maxn],sum[maxn];//sum用来记录前i个大于T的有多少个
int main()
{
    long long N,K,T,b,c,p;
    while(cin>>N>>K>>T>>a[0]>>b>>c>>p)
    {
        long long ans=0;
        for(int i=1;i<=N;i++)
        {
            a[i]=(a[i-1]*b+c)%p;
            sum[i]=sum[i-1];
            if(a[i]>=T)sum[i]++;//②
        }
        int L=1,R=1;
        while(1)
        {
            while(R<=N&&sum[R]-sum[L-1]<K)R++;//①
            if(R>N)break;
            ans+=N-R+1;//③
            L++;
        }
        cout<<ans<<endl;
    }
}