比赛地址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=804

题目编号:第一题 A. Ascending Rating  hdu6319

题意:

给定一个序列 a[1..n],对于每个长度为 m 的连续子区间, 求出区间 a 的最大值以及从左往右扫描该区间时 a 的最大值的 变化次数。

题解:按照 r 从 m 到 n 的顺序很难解决这个问题。 考虑按照 r 从 n 到 m 的顺序倒着求出每个区间的答案。 按照滑窗最大值的经典方法维护 a 的单调队列,那么队列 中的元素个数就是最大值的变化次数。 时间复杂度 O(n)。

我的理解:由于从前向后的顺序来做的话,当窗口向后滑动一格时,当前L的值若比L-1的值小的话,那么可能会出现之前没有在队列里的值需要重新进队的情况,所以很难做到O(n),ljj虽然有想法,但是直观上来看,从后向前的顺序更简单一点。因为每次向前滑动一格,队头如果是R,那么去掉队头,如果不是R那么R值对后面也没有用且R值本身并没有在队列中,所以是O(1),对于L,将L值插入单调队列并设置为新的队尾即可,新队尾之前的部分在之后不可能再用到,所以每个值最多只可能在队列中被新增和删除一次,所以平均每个窗口滑动对于L值得操作也是O(1)的。队列就开个足够大数组往后挪就好了,懒得写循环队列了。然后取模本身是很慢的操作,尽量少取模吧(删了几个%就ac了)。。。

自己的代码还是参考了下题解的:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
int T;
long long n,m,k,p,q,r,MOD;
long long a[];
long long q1[];
long long ans1,ans2;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&m,&k,&p,&q,&r,&MOD);
for(int i=;i<=k;i++)
scanf("%lld",&a[i]);
for(int i=k+;i<=n;i++)
{
a[i]=(((p*a[i-])+(q*i))+r)%MOD;
}
int top=;//用来记录当前单调队列队顶的位置,因为数组大于总共的ai的个数,所以不需要每次把新队列整理,而是动态的用这个空间,记录当前队列的队顶队尾即可。
int rec=;//队尾的位置
for(int i=n;i>=n-m+;i--)
{
while(rec>=top&&a[i]>=a[q1[rec]])rec--;
rec++;
q1[rec]=i;
}
ans1+=a[q1[top]]^(n-m+);
ans2+=(rec-top+)^(n-m+);
int i=n-m;
for(int l=n-m;l>=;l--)
{
int r=l+m-;
if(r+==q1[top])//当新区间不包括当前队顶时,则更新队列,去掉队顶,队尾前移。
{
top++;
}
while(rec>=top&&a[l]>=a[q1[rec]])rec--;
rec++;
q1[rec]=i;
ans1+=a[q1[top]]^i;
ans2+=(rec-top+)^i;
i--;
}
printf("%lld %lld\n",ans1,ans2);
ans1=ans2=;
q1[]=;
}
}

2018年多校第三场第一题 A. Ascending Rating hdu6319的更多相关文章

  1. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  2. 2019年杭电多校第三场 1011题Squrirrel(HDU6613+树DP)

    题目链接 传送门 题意 给你一棵无根树,要你寻找一个根节点使得在将一条边权变为\(0\)后,离树根最远的点到根节点的距离最小. 思路 本题和求树的直径很像,不过要记得的东西有点多,且状态也很多. \( ...

  3. [题解]Magic Line-计算几何(2019牛客多校第三场H题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意: 给你偶数个点的坐标,找出一条直线将这n个点分成数量相等的两部分 并在这条直线上取不同的两个点,表示 ...

  4. [题解] 2019牛客暑期多校第三场H题 Magic Line

    题目链接:https://ac.nowcoder.com/acm/contest/883/H 题意:二维平面上有n个不同的点,构造一条直线把平面分成两个点数相同的部分. 题解:对这n个点以x为第一关键 ...

  5. 2018年多校第四场第二题 B. Harvest of Apples hdu6333

    题意:给定10^5以内的n,m求∑组合数(n,i),共10^5组数据. 题解: 定义 S(n, m) = \sum_{i = 0} ^ {m} {n \choose i}S(n,m)=∑​i=0​m​ ...

  6. 2019年杭电多校第三场 1008题Game(HDU6610+带修改莫队+Nim博弈)

    题目链接 传送门 题意 给你\(n\)堆石子,每堆有\(a_i\)堆石子,\(q\)次操作: 在\([L,R]\)内有多少个子区间使得\(Alice\)(先手)在\(Nim\)博弈中获胜: 交换\(a ...

  7. 2019年牛客多校第三场 F题Planting Trees(单调队列)

    题目链接 传送门 题意 给你一个\(n\times n\)的矩形,要你求出一个面积最大的矩形使得这个矩形内的最大值减最小值小于等于\(M\). 思路 单调队列滚动窗口. 比赛的时候我的想法是先枚举长度 ...

  8. [题解]Crazy Binary String-前缀和(2019牛客多校第三场B题)

    题目链接:https://ac.nowcoder.com/acm/contest/883/B 题意: 给你一段长度为n,且只有 ‘0’ 和 ‘1’ 组成的字符串 a[0,...,n-1].求子串中 ‘ ...

  9. 启发式分治:2019牛客多校第三场 G题 Removing Stones

    问题可以转换为求有多少个区间数字的总和除2向下取整大于等于最大值.或者解释为有多少个区间数字的总和大于等于最大值的两倍(但是若区间数字总和为奇数,需要算作减1) 启发式分治: 首先按最大值位置分治,遍 ...

随机推荐

  1. Eclipse MAT 安装及使用

    Eclipse MAT官方网页:https://www.eclipse.org/mat/downloads.php 一.MAT是什么? MAT(Memory Analyzer Tool),一个基于Ec ...

  2. 安装windows server 2008r2服务器操作系统

    R4900 G2 UEFI使用RAID-1000配置阵列 http://123.57.42.60/12755.html 首先进入到进到UEFI中阵列配置界面, 1Legacy BIOS Mode进入阵 ...

  3. DirectX11--深入理解与使用缓冲区资源

    前言 在Direct3D 11中,缓冲区属于其中一种资源类型,它在内存上的布局是一维线性的.根据HLSL支持的类型以及C++的使用情况,缓冲区可以分为下面这些类型: 顶点缓冲区(Vertex Buff ...

  4. django——个人博客之分页/筛选功能

    在完成了注册.登录后就应该显示主页,在主页中有各种功能的按钮,用户点击后进入后台管理,不同角色的用户根据权限不同显示的页面是不相同的,在个人博客页面会显示自己发布的文章,以及自己的保障记录,在进入后台 ...

  5. Springboot自定义异常处理

    1.自定义异常类 import lombok.Data; @Data public class UserException extends RuntimeException { private Lon ...

  6. 五十九、linux 编程—— I/O 多路复用 fcntl

    59.1 介绍 前面介绍的函数如,recv.send.read 和 write 等函数都是阻塞性函数,若资源没有准备好,则调用该函数的进程将进入阻塞状态.我们可以使用 I/O 多路复用来解决此问题(即 ...

  7. 轻型Database- sqlite入门

    SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 是在世界上最广泛部署的 SQL 数据库引擎.SQLite 源代码不受版权限制. 下面跟着 ...

  8. 课程设计个人报告——基于ARM实验箱的捕鱼游戏的设计与实现

    课程设计个人报告--基于ARM实验箱的捕鱼游戏的设计与实现 一.个人贡献 参与课设题目讨论及部分过程 资料收集 负责代码调试 捕鱼游戏相应功能的实现 实验环境 Eclipse软件开发环境: ARM实验 ...

  9. 移动端1px问题处理方法

    在做移动端开发时,设计师提供的视觉稿一般是750px,当你定义 border-width:1px 时,在iphone6手机上却发现:边框变粗了.. 这是因为,1px是相对于750px的(物理像素),而 ...

  10. Spring框架-IOC和AOP简单总结

    参考博客: https://blog.csdn.net/qq_22583741/article/details/79589910 1.Spring框架是什么,为什么,怎么用 1.1 Spring框架是 ...