1. 程式人生 > >hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3 A)

hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3 A)

while ble con -- test ++ nbsp ini for

鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=6319

思路:

單調隊列倒著維護,隊列裏面剩下的值的數量就是這一段區間的count值,如樣例第一個區間:3 2 2 1 5 7

單調隊列倒著維護遍歷一遍變成了:7 5 3

長度為3,隊首為最大值7

實現代碼:

#include<cstdio>
using namespace std;
#define ll long long
const int M = 1e7+10;
ll  a[M],p,q,r,mod;
ll  n,m,k;
ll  lis[M],head,tail,t;
int main() { scanf("%lld",&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] = ((p * a[i - 1
]) % mod + q * i % mod + r) % mod; head = tail = 0; for(int i = n;i >= n-m+1;i --){ while(head < tail&&a[lis[tail-1]] <= a[i]) -- tail; lis[tail++] = i; } ll A = 0,B = 0; A += a[lis[head]] ^ (n-m+1); B += (tail - head) ^ (n - m + 1
); for(int i = n-m;i >= 1;i --){ while(lis[head] > i + m - 1&&head < tail) ++head; while(head < tail&&a[lis[tail - 1]] <= a[i]) --tail; lis[tail++] = i; A += a[lis[head]] ^ i; B += (tail - head) ^ i; } printf("%lld %lld\n",A,B); } return 0; }

hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3 A)