HDU 6319 Problem A. Ascending Rating(单调队列)

要求一个区间内的最大值和每次数过去最大值更新的次数,然后求每次的这个值异或 i 的总和。

这个序列一共有n个数,前k个直接给出来,从k+1到n个数用公式计算出来。

因为要最大值,所以就要用到单调队列,然后从后往前扫一遍然后每次维护递减的单调队列。

先把从n-m+1以后开始的数放进单调队列,这时候先不操作,然后剩下的数就是要异或相加的数,然后每次的队首元素就是这个区间内的最大值,这个队列里的元素个数,其实就是更新到最大值的逆过程,也就是最大值需要更新的次数。

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x))

typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 10000100;
const int maxm = 1000005;
using namespace std;

int T, tol;
int n, m;
ll a[maxn];
int que[maxn];

void init() {
    memset(a, 0, sizeof a);
}

int main() {
    scanf("%d", &T);
    while(T--) {
        int k;
        int p, q, r, mod;
        scanf("%d%d%d%d%d%d%d", &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] = (1ll*p*a[i-1] + 1ll*q*i + r) % mod;
        int head, tail;
        head = tail = 0;
        for(int i=n; i>n-m+1; i--) {
            while(head != tail && a[i] >= a[que[tail-1]])    tail--;
            que[tail++] = i;
        }
        /*
        for(int j=head; j<tail; j++)    printf("%d %d %lld\n", i, que[j], a[que[j]]);
        printf("\n");
        */
        ll ans1 = 0;
        ll ans2 = 0;
        for(int i=n-m+1; i>=1; i--) {
            while(head != tail && a[i] >= a[que[tail-1]])    tail--;
            que[tail++] = i;
            while(i + m - 1 < que[head])    head++;
            /*
            for(int j=head; j<tail; j++)    printf("%d %d %lld\n", i, que[j], a[que[j]]);
            printf("\n");
            */
            ans1 += (a[que[head]] ^ i);
            ans2 += ((tail - head) ^ i);
        }
        printf("%lld %lld\n", ans1, ans2);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/H-Riven/p/9395239.html

时间: 2024-10-27 17:39:06

HDU 6319 Problem A. Ascending Rating(单调队列)的相关文章

2018 Multi-University Training Contest 3 1001 / hdu6319 Problem A. Ascending Rating 单调队列,思维

Problem A. Ascending Rating 题意: 给定一个序列a[1..n],对于所有长度为m的连续子区间,求出区间的最大值以及从左往右扫描该区间时a的最大值的变化次数. 1≤m≤n≤107. Shortest judge solution: 534 bytes 题解: 官方题解:按照r从m到n的顺序很难解决这个问题.考虑按照r从n到m的顺序倒着求出每个区间的答案.按照滑窗最大值的经典方法维护a的单调队列,那么队列中的元素个数就是最大值的变化次数.时间复杂度O(n). 最大值好算,

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

1 #include <stdio.h> 2 #include <iostream> 3 #include <cstdlib> 4 #include <cmath> 5 #include <string> 6 #include <cstring> 7 #include <algorithm> 8 #include <stack> 9 #include <queue> 10 #include <

HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 【单调队列优化】

任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6319 Problem A. Ascending Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 5943    Accepted Submission(s): 2004 Problem Description Before

HDU 4122 Alice&#39;s mooncake shop 单调队列优化dp

Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4122 Description The Mid-Autumn Festival, also known as the Moon Festival or Zhongqiu Festival is a popular harvest festival celebrated by Ch

HDU 3415 Max Sum of Max-K-sub-sequence 单调队列题解

本题又是一题单调队列题解. 技巧就是需要计算好前n项和Sn = a1 + a2 + ... an 这样方便处理. 记录一条单调队列,其意义是: q(head), q(head+1), ...q(tail) 其中头q(head)代表当前最佳解的起点 这样我们只需要在求某点为结尾的S[i] - S[q(head)就得到当前最佳值. 了解了单调数列,知道其中的记录意义,那么这道题就没有难度了.我也是了解这些信息之后就自己敲出代码的. 不过有些细节没写好也让我WA了几次. 最近少刷水题,而一直都是每天一

hdu 4122 Alice&#39;s mooncake shop(单调队列)

题目链接:hdu 4122 Alice's mooncake shop 题目大意:给定N和M,表示有N个订单,M个时刻可以做月饼,时刻以小时计算,任意时刻可以做若干个月饼.接着 N行为N个订单的信息,包括时间和数量.再给定T和S,表示每个月饼的保质时间和每保存一小时的开销.然后M行为 对应每个时刻制作月饼的代价.问说最少花费多少代价完成所有订单. 解题思路:单调队列或者RMQ,单调队列即用一个deque维护一个代价递增的队列,每次将头部保质期不够的剔除. RMQ可以将预处理处每个区间时刻代价的最

HDU 4123 Bob&#39;s Race:单调队列 + st表

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[i]为:从节点i出发,不重复经过节点,所能够走的最远距离. 每次询问问你:区间[l,r]最长能有多长,同时保证 max{dis[i]} - min{dis[i]} <= q (i∈[l,r]) 题解: 首先有一个结论: 从树上的任意一个节点出发,尽可能往远走,最终一定会到达树的直径的两个端点之一.

HDU 6444 Neko&#39;s loop(单调队列)

Neko has a loop of size nn. The loop has a happy value aiai on the i−th(0≤i≤n−1)i−th(0≤i≤n−1) grid. Neko likes to jump on the loop.She can start at anywhere. If she stands at i−thi−thgrid, she will get aiai happy value, and she can spend one unit ene

HDU 5380 Travel with candy (单调队列&amp;贪心)

本文纯属原创,转载请注明出处.http://blog.csdn.net/zip_fan,谢谢. 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5380. Travel with candy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description There are n+1 cities on