HDU6319:Problem A. Ascending Rating(单调队列)

本文介绍了一个竞赛编程题目,涉及生成序列并求解特定区间的最大值及最长上升子序列问题。通过反向思考,利用双端队列模拟维护单调递减序列,高效解决了此问题。

Problem A. Ascending Rating

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 587    Accepted Submission(s): 150


 

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

 

 

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

 题意:生成N个数,对于每个M长度的区间,设为[L, L+M-1],贡献1为区间最大值异或x,贡献2为以以L为起点的最长上升子序列异或X,输出所有M长度区间的贡献之和。

思路:首先按照公式生成N个数,正着做很难维护,考虑反着做维护一个单调递减的序列,任意时刻队列的大小就是上升子序列的长度,注意边界条件就行,然后得用数组模拟双端队列。

# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
const int maxn = 1e7+30;
int a[maxn], d[maxn];
int T, n, m, k, p, q, r, MOD;
void scan(int &ret)
{
    char c; ret = 0;
    while((c=getchar()) < '0' || c > '9');
    while(c>='0' && c<='9') ret = ret*10 + (c-'0'), c = getchar();
}
int main()
{
    for(scan(T);T;--T)
    {
        LL ans = 0, ans2=0;
        scan(n);scan(m);scan(k);scan(p);scan(q);scan(r);scan(MOD);
        p %= MOD;q %= MOD;r %= MOD;
        for(int i=1; i<=k; ++i) scan(a[i]);
        for(int i=k+1; i<=n; ++i)
        {
            a[i] = 1LL*p*a[i-1]%MOD+(1LL*q*i%MOD+r)%MOD;
            if(a[i] >= MOD) a[i] -= MOD;
        }
        int tail = 10000001, head = tail+1;
        for(int i=n; i>=n-m+1; --i)
        {
            while(tail+1 != head && a[i] >= a[d[head]]) ++head;
            d[--head] = i;
        }
        ans = (tail-head+1)^(n-m+1);
        ans2 = (a[d[tail]])^(n-m+1);
        for(int i=n-m; i>0; --i)
        {
            if(d[tail] == i+m) --tail;;
            while(tail+1!= head && a[i] >= a[d[head]]) ++head;
            d[--head] = i;
            ans += (tail-head+1)^i;
            ans2 += a[d[tail]]^i;
        }
        printf("%lld %lld\n",ans2,ans);
    }
    return 0;
}

 

### C++ 头文件 `<bits/stdc++.h>` 的使用问题 `<bits/stdc++.h>` 是一个非标准的 C++ 头文件,它在某些编译器(如 GCC)中被用作包含所有标准 C++ 头文件的快捷方式。这种方式在编程竞赛中非常流行,因为它可以节省时间,避免逐个包含所需的头文件。 #### 语法问题 在使用 `<bits/stdc++.h>` 时,常见的语法问题通常与拼写错误或编译器兼容性有关。例如,正确的包含方式应该是: ```cpp #include <bits/stdc++.h> ``` 如果拼写错误,比如写成 `#include <bits/stdc++.h>` 或者路径不正确,编译器将无法找到该头文件,从而导致编译错误。此外,需要注意的是,虽然 `<bits/stdc++.h>` 在 GCC 编译器中广泛支持,但在其他编译器(如 MSVC 或 Clang)中可能不被支持,这会导致跨平台开发时出现问题 [^3]。 #### 包含方式问题 使用 `<bits/stdc++.h>` 的主要优势在于它可以一次性包含所有标准库头文件,这对于需要快速编写代码的编程竞赛非常有用。然而,在实际的软件开发中,这种做法并不推荐,因为这样做会增加编译时间并可能导致命名空间污染。因此,建议在实际项目中只包含所需的头文件,以提高代码的可维护性和编译效率 [^1]。 #### 兼容性问题 尽管 `<bits/stdc++.h>` 在许多在线评测系统(如 Codeforces 和 Topcoder)中被支持,但在一些国内的在线评测系统(如 POJ 和 HDU)中可能不被支持,这是由于这些系统的编译器配置问题 [^2]。在这种情况下,开发者需要手动包含所需的头文件,或者确保使用的编译器版本支持 `<bits/stdc++.h>`。 #### 示例代码 以下是一个简单的示例,展示了如何使用 `<bits/stdc++.h>`: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int a, b; cin >> a >> b; cout << a + b << endl; return 0; } ``` 这段代码包含了所有标准 C++ 头文件,并使用了 `std` 命名空间,以便可以直接使用 `cin` 和 `cout` 等标准库函数 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值