Problem A. Ascending Rating Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 2057 Accepted Submission(s): 622
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 Source 2018 Multi-University Training Contest 3 Recommend #include<iostream> #include<algorithm> #include<string> #include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0}; #include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;} #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> #define ll long long #define maxn 10000005 #define MAX 1000000000 #define ms memset using namespace std; /* 题目意思比较绕,反正就是一个滑块的问题, 每次滑块区间动一次要累计其count和最大值, (count就是最长递增序列的长度,注意,是要从头往后数,不能跳)。 参数中的p,q,r,mod都是虚的,用于扩充序列而已。 对于一个序列,用单调队列维护滑块区间, 不要用STL尽量,有说不尽的毛病,能用数组就用数组,(还有数组开全局。) 单调队列的性质,它如何降低了复杂度呢? 比如初始化一个长度为k的序列,不难维护一个单调的序列, 由于我们只要最大值和最长单调长度,所以初始化的队列符合要求。 那么如果进了一个新元素呢? 如果比最小值小(咱们是倒着放的,比如9,8,7,现在进个2这样) 那么显然直接添加,如果大的话则贪心删除直至维护单调性质即可。 区间动的时候也删除了一个元素,只要这个元素不是我们区间维护的想要的答案, 就不做操作,如果是单调队列倒退,比如9,8,7,现在尾端下标离开了9的位置,则9退出队列。 倒退的那一端我们利用来判断是否对答案产生影响,前进的那一端我们 用来分析对单调队列整体的影响。 */ ll n,m,k,p,q,r,mod;///全都要用ll,为啥会爆数据范围呢? ll a[maxn]; ll lb=1,rb=0,deq[maxn];///双向队列 ll A,B; int main() { int t;scanf("%d",&t); while(t--) { scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&m,&k,&p,&q,&r,&mod); for(int i=1;i<=k;i++) scanf("%lld",&a[i]); for(int i=k+1;i<=n;i++) a[i]=( a[i-1]*p+q*i+r )%mod; A=0,B=0; lb=1,rb=0; for(int i=n;i;i--) { while(rb>=lb && deq[rb]<=a[i]) rb--; deq[++rb]=a[i]; if(i+m-1<=n) { if(a[i+m]==deq[lb]) lb++; B += (rb-lb+1)^(i); cout<<rb-lb+1<<endl; A += (deq[lb]^(i)); } } printf("%lld %lld\n",A,B); } return 0; } |