2018杭电多校第三场:Problem A. Ascending Rating

Problem Description

Before the start of contest, there are n ICPC contestants waiting in a long queue. They are labeled by 1 to n from left to right. It can be easily found that the i -th contestant's QodeForces rating is ai .
Little Q, the coach of Quailty Normal University, is bored to just watch them waiting in the queue. He starts to compare the rating of the contestants. He will pick a continous interval with length m , say [l,l+m−1] , and then inspect each contestant from left to right. Initially, he will write down two numbers maxrating=−1 and count=0 . Everytime he meets a contestant k with strictly higher rating than maxrating , he will change maxrating to ak and count to count+1 .
Little T is also a coach waiting for the contest. He knows Little Q is not good at counting, so he is wondering what are the correct final value of maxrating and count . Please write a program to figure out the answer.

 

Input

The first line of the input contains an integer T(1≤T≤2000) , denoting the number of test cases.
In each test case, there are 7 integers n,m,k,p,q,r,MOD(1≤m,k≤n≤107,5≤p,q,r,MOD≤109) in the first line, denoting the number of contestants, the length of interval, and the parameters k,p,q,r,MOD .
In the next line, there are k integers a1,a2,...,ak(0≤ai≤109) , denoting the rating of the first k contestants.
To reduce the large input, we will use the following generator. The numbers p,q,r and MOD are given initially. The values ai(k<i≤n) are then produced as follows :

ai=(p×ai−1+q×i+r)modMOD


It is guaranteed that ∑n≤7×107 and ∑k≤2×106 .  

Output

Since the output file may be very large, let's denote maxratingi and counti as the result of interval [i,i+m−1] .
For each test case, you need to print a single line containing two integers A and B , where :

AB==∑i=1n−m+1(maxratingi⊕i)∑i=1n−m+1(counti⊕i)


Note that ``⊕ '' denotes binary XOR operation.  

Sample Input

1 10 6 10 5 5 5 5 3 2 2 1 5 7 6 8 2 9

Sample Output

46 11

思路:通过单调队列,从后往前进。

#include<bits/stdc++.h>

using namespace std;

const int maxn=1e8+10;

#define sca(x)   scanf("%lld",&x)

typedef  long long ll;

ll que[maxn],num[maxn];
ll t,n,m,k,p,q,r,mod,tail,head,cot,mac;
int main(){
    scanf("%lld",&t);
    while (t--){
        cot=0;mac=0;
        sca(n);sca(m);sca(k);sca(p);sca(q);sca(r);sca(mod);
        for (int i=1;i<=k;i++)
            sca(num[i]);
        for (int i=k+1;i<=n;i++)
            num[i]=(1ll*p*num[i-1]+1ll*q*i+r)%mod; 
        head=1;tail=0;
        for (int i=n;i>=1;i--){
            while (tail>=head&&num[que[tail]]<=num[i]) 
                tail--;
            que[++tail]=i;
            if  (i+m-1<=n){
                if (que[head]>=i+m)
                    head++;
                mac+=num[que[head]]^i;
                cot+=(tail-head+1)^i;
            }
        }
        printf("%lld %lld\n",mac,cot);
    }
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_40911499/article/details/81303249
今日推荐