• Ascending Rating(单调队列)


    题目描述

    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=0 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.

    输入

    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 :

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

    输出

    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 :

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

    题目描述

    在比赛开始之前,有很多ICPC参赛者排起了长队。它们从左到右标记为1到n。很容易发现第i位参赛者的QodeForces评级为ai。
    Quailty师范大学的教练小Q很难看他们排队等候。他开始比较参赛者的评分。他会选择一个长度为m的连续间隔,比如[l,l + m-1],然后从左到右检查每个参赛者。最初,他将记下两个数字maxrating = 0和count = 0。每当他遇到一个比最大值更高等级的参赛者k时,他会将最大值更改为ak并计数到+1。
    小 T也是一位等待比赛的教练。他知道小 Q不擅长计算,所以他想知道最大值和计数的正确最终值是多少。请写一个程序来找出答案。

    输入

    输入的第一行包含整数T(1≤T≤2000),表示测试用例的数量。

    在每个测试用例中,第一行有7个整数n,m,k,p,q,r,MOD(1≤m,k≤n≤107,5≤p,q,r,MOD≤109),表示参赛者的数量,间隔的长度,以及参数k,p,q,r,MOD。

    在下一行中,有k个整数a1,a2,...,ak(0≤ai≤109),表示前k个参赛者的等级。

    为减少大输入,我们将使用以下生成器。最初给出数字p,q,r和MOD。然后如下产生值ai(k <i≤n):

    保证Σn≤7×107且Σk≤2×106。

    输出

    由于输出文件可能非常大,因此我们将maxratingi和counti表示为区间[i,i + m-1]的结果。

    对于每个测试用例,您需要打印包含两个整数A和B的单行,其中:

    注意,“⊕”表示二进制XOR运算。

    样例输入

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

    样例输出

    46 11
    

    大致题意(这题需要语文水平:

    给你一个长度为n的序列(输入只有前k个元素,k+1至n要根据他给的公式算出)。然后给你一个m,让你求序列中所有长度为m的区间内的最大值和最长上升子序列([1,m],[2,m+1],[3,m+2].......),更换次数为你在这个区间内从左到右遍历寻找最大值的最长上升子序列的长度。

    思路:

    首先这题的数据范围及最大值,更新次数等关键字眼不难让我们想到单调队列。

    但这题正序遍历貌似不太理解,就倒着来进行单调队列,和滑动窗口极其相似。

    最大值直接输出对首,最长上升子序列的长度就是单调队列的大小了。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<iomanip>
    #include<algorithm>
    #include<cstring>
    #include<cstdlib>
    #include<ctime>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<map>
    #include<set>
    
    #define inf 0x7fffffff
    #define rg register int
    
    using namespace std;
    
    int t,n,m,k,l,r,mod;
    long long su,pi,p,q,z;
    int a[10000001];
    int s[10000001];
    int f[10000001];
    
    inline int qr(){
    	char ch;
    	while((ch=getchar())<'0'||ch>'9');
    	int res=ch^48;
    	while((ch=getchar())>='0'&&ch<='9')
    		res=res*10+(ch^48);
    	return res;
    }
    
    int main(){
    	//freopen(".in","r",stdin);
    	//freopen(".out","w",stdout);
    	t=qr();
    	while(t--){ l=1,r=1;
    		for(rg i=0;i<=10;++i)
    			s[i]=-1;
    		n=qr(),m=qr(),k=qr();
    		p=qr(),q=qr(),z=qr();
    		mod=qr(); su=0,pi=0;
    		for(rg i=1;i<=k;++i)
    			a[i]=qr();
    		for(rg i=k+1;i<=n;++i)
    			a[i]=(p*a[i-1]+q*i+z)%mod;
    		for(rg i=n;i>=1;--i){
    			while(s[r]<=a[i]&&r>=l)r--;
    			s[++r]=a[i];f[r]=i;
    			while(f[l]>=i+m)l++;
    			if(i+m<=n+1)
    				su+=s[l]^i,pi+=(r-l+1)^i;
    		}printf("%lld %lld
    ",su,pi);
    	}
    	return 0;
    }
    
    ✐☎博主撰文不易,转载还请注明出处;若对本文有疑,请私信或在下方讨论中提出。O(∩_∩)O谢谢!☏

    ☃〔尽管小伙伴们肯定有千百种方式针对,但博主还是极其非常十分不要脸的把反对键吃掉辣!〕☃

    ✿『$At$ $last$:非常一(hu)本(shuo)正(ba)经(dao)的:博主很笨,请不要欺负他』✿✍

  • 相关阅读:
    request.getParameter() 和request.getAttribute() 区别
    Java中this和super的用法总结
    jQuery实现列表框双向选择操作
    Eclipse中.setting目录下文件介绍
    通过Ajax方式上传文件,使用FormData进行Ajax请求
    ASP.NET程序中常用的三十三种代码
    计算地球上两个坐标点(经度,纬度)之间距离sql函数
    动态调用WebService(C#) (非常实用)
    带SoapHeader验证的WebServices
    GridView内容详解(转载)
  • 原文地址:https://www.cnblogs.com/812-xiao-wen/p/10122833.html
Copyright © 2020-2023  润新知