HDU 6319 Ascending Rating

题目:点击打开链接
题意:先给出一个长度为k(k<=n)的序列,和一个递推式,让你先求出整个长度为n的序列,然后对于每个区间都求题目给的式子,其中maxratingi为区间最大值,count为区间上升序列元素个数。对于不同的区间maxratingi和count要重新算。

分析:滑动窗口模型,需要使用单调队列,注意要从后往前,不理解可以手动模拟一下。

代码:

#pragma comment(linker, "/STACK:102400000,102400000")///ÊÖ¶¯À©Õ»
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define debug test
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define rep(i,a,n) for (int i=a;i=a;i--)
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
typedef pair PII;
const ll mod = 1e9+7;
const int N = 1e7+10;

ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
ll qp(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

int n,m,k,p,q,r,md,dq[N],a[N],h,t,i,T;

int main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--) {
        cin>>n>>m>>k>>p>>q>>r>>md;
        ll A=0,B=0;
        for(i=1;i<=k;i++) cin>>a[i];
        for(i=k+1;i<=n;i++) a[i] = (1LL*a[i-1]*p+1LL*q*i+r)%md;
        for(h=1,t=A=B=0,i=n;i;i--) {
            while(h<=t&&a[dq[t]]<=a[i]) t--;
            dq[++t]=i;
            if(i<=n-m+1) {
                while(dq[h]>=i+m) h++;
                A+=(i^a[dq[h]]);
                B+=i^(t-h+1);
            }
        }
        cout<

 

你可能感兴趣的:(ACM,多校,HDU,单调队列)