http://acm.hdu.edu.cn/showproblem.php?pid=6319
对于每个i 题目要求出[i,i+m-1]区间内以第i项为首的lis的长度和最后一项 1e7只能是线性做法 而且还需要平移区间
所以应该想到单调队列 从后向前维护一个单调递减的队列即可
using namespace std;
struct node
{
int id;
ll val;
};
node que[10000010];
ll ary[10000010],a[10000010],b[10000010];
ll p,q,r,mod,aa,bb;
int n,m,k,head,tail;
int main()
{
node tmp;
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%lld%lld%lld%lld",&n,&m,&k,&p,&q,&r,&mod);
for(i=1;i<=k;i++)
{
scanf("%lld",&ary[i]);
}
for(i=k+1;i<=n;i++)
{
ary[i]=(p*ary[i-1]+q*(ll)i+r)%mod;
}
head=0,tail=-1;
for(i=n;i>=1;i--)
{
while(head<=tail&&que[tail].val<=ary[i]) tail--;
tmp.id=i,tmp.val=ary[i];
que[++tail]=tmp;
if(i<=n-m+1)
{
a[i]=que[head].val;
b[i]=tail-head+1;
if(i+m-1<=que[head].id) head++;
}
}
aa=0,bb=0;
for(i=1;i<=n-m+1;i++)
{
aa+=(a[i]^(ll)i);
bb+=(b[i]^(ll)i);
}
printf("%lld %lld\n",aa,bb);
}
return 0;
}