HDU 6319 Ascending Rating (单调双端队列)
题意:给定一个序列a[1..n],对于每个长度为m的连续子区间,求出区间的最大值和从左往右扫描该区间最大值的变化次数。
分析:先O(n)处理出整个序列的值。求出每个长度为m的连续区间中的最大值可以用单调队列求出,但同时要维护区间最大值的变化次数,即以区间最左边的元素为最小值的递增序列的长度。如果单纯地从左往右更新单调队列的话,每次窗口的最左端出队列后,队列中的单调特性就又被打破,而这时要重新确定这个递增序列,就必须重新遍历一遍队列中的元素,肯定超时。
换个思路,如果我们从右往左滑动这个窗口,那么每次将左边窗口外的元素ai加入队列后,都能使其中元素的个数为该区间的以ai为最小值的递增序列的个数。队列中单调递减,队首为最大值,队尾为当前加入的元素。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> PLL;
const int MAXN = 1e7+;
int N, M;
LL arr[MAXN];
int k, p, q, r, mod;
int deq[MAXN],deq2[MAXN]; void generate()
{
for( int i = k+; i <= N; i++ )
arr[i] = ((LL)p *arr[i-]%mod + (LL)q *i%mod + r%mod) %mod;
}
LL ans1,ans2;
void solve()
{
ans1=ans2=;
int s=,t=;
int x = N-M+;
for(int i=N;i>=N-M+;--i){
while(s<t&& arr[deq[t-]]<=arr[i]) --t;
deq[t++]=i;
}
ans1 = x^arr[deq[s]];
ans2 = x^(t-s);
x--;
for(int i=N-M;i>=;--i){
if(deq[s]==i+M) //窗口的尾部是队首,则出队
s++;
while(s<t&& arr[deq[t-]]<=arr[i]) --t;
deq[t++]=i;
ans1 += (arr[deq[s]])^x;
ans2 += (t-s)^x;
x--;
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T; cin >> T;
while(T--){
scanf("%d%d", &N, &M);
scanf("%d%d%d%d%d", &k,&p, &q, &r, &mod);
for( int i = ;i <= k; i++)
scanf("%lld", arr+i);
generate();
solve();
printf("%lld %lld\n", ans1, ans2);
}
return ;
}
HDU 6319 Ascending Rating (单调双端队列)的更多相关文章
- Vijos1834 NOI2005 瑰丽华尔兹 动态规划 单调双端队列优化
设dp[t][x][y]表示处理完前t个时间段,钢琴停留在(x,y)处,最多可以走多少个格子 转移时只需逆着当前倾斜的方向统计len个格子(len为时间区间的长度,len=t-s+1),如果遇到障碍就 ...
- HDU - 6386 Age of Moyu (双端队列+bfs)
题目链接 双端队列跑边,颜色相同的边之间的花费为0,放进队首:不同的花费为1,放进队尾. 用Dijkstra+常数优化也能过 #include<bits/stdc++.h> using n ...
- 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 41844 Accepted: 12384 ...
- STL-Deque(双端队列)与单调队列的实现
前言: STl是个好东西,虽然他在不开O2的条件下会跑的很慢,但他着实会让你的代码可读性大大提高,令你的代码看起来既简单又整洁. 双端队列: 顾名思义,双端队列是有两个头的,一个队首指针,一个队尾指针 ...
- 22.1.23Manacher算法、双端队列、单调栈
22.1.23Manacher算法.双端队列.单调栈 1.Manacher算法 1)用途: Manacher算法用于解决类似求某个字符串中最长的回文子串.(回文就是正着读和倒着读一样的结构). 2)算 ...
- HDU 4286 Data Handler --双端队列
题意:有一串数字,两个指针,然后一些添加,删除,反转,以及移动操作,最后输出序列. 解法:可以splay做,但是其实双端队列更简便. 维护三个双端队列LE,MI,RI分别表示[L,R]序列左边,[L, ...
- HDU 6375(双端队列 ~)
题意是有至多150000个双端队列,400000次简单操作,直接开会导致内存超限,所以用 STL 中的 map 和 deque ,而读入过大已经在题目中有所说明,直接用已经给出的快速读入即可.要注意的 ...
- 关于双端队列 deque 模板 && 滑动窗口 (自出)
嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include < ...
- BZOJ 2457 [BeiJing2011] 双端队列
2457: [BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 340 Solved: 167[Submit][Sta ...
随机推荐
- select 自定义样式插件 selectize.js
[特别推荐]几款极好的 JavaScript 下拉列表插件 表单元素让人爱恨交加.作为网页最重要的组成部分,表单几乎无处不在,从简单的邮件订阅.登陆注册到复杂的需要多页填写的信息提交功能,表单都让 ...
- 2017 ACM区域赛(西安) 参赛流水账
day 0: 周五, 鸽了概统课,早上和紫金港的几位小伙伴一起打车去萧山机场,从咸阳机场到西北工业大学坐了五十多个站的公交车,感觉身体被掏空.晚上在宾馆本来打算补之前训练的一个题,想想还是先花个十来分 ...
- Asp.net中使用文本框的值动态生成控件的方法
这篇文章主要介绍了Asp.net中使用文本框的值动态生成控件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 看到一个网友,有论坛上问及,动态的生成checkbox控件,在文本框中输入一个“花 ...
- 如何交换a,b的数值——一个简单的问题就证明现在的你依然弱爆了
How? int c = a; a = b; b = c; 这样会浪费多一点内存去存放c,so还有吗? a ^= b; b ^= a; a ^= b; ^:异或. 答案碉堡了, 不过估计除了有可能在面 ...
- python 国内镜像
pipy国内镜像目前有: http://pypi.douban.com/ 豆瓣 http://pypi.hustunique.com/ 华中理工大学 http://pypi.sdutlinux.o ...
- 【转】防止CListCtrl闪烁的几种方法
转载出处:http://blog.sina.com.cn/s/blog_5ee42ba30100g50j.html 1.使用SetRedraw禁止窗口重绘,操作完成后,再恢复窗口重绘 m_ctlLis ...
- java获取系统时区
//Calendar cal = Calendar.getInstance(); //TimeZone timeZone = cal.getTimeZone(); TimeZone timeZone ...
- 面试心得与总结—BAT、网易、蘑菇街 - ImportNew
1. 九种基本数据类型的大小,以及他们的封装类. 2. Switch能否用string做参数? 3. equals与==的区别. 4. Object有哪些公用方法? 5. Java的四种引用,强弱软虚 ...
- Leetcode-Test Justification
Given an array of words and a length L, format the text such that each line has exactly L characters ...
- [LintCode] O(1)检测2的幂次
class Solution { public: /* * @param n: An integer * @return: True or false */ bool checkPowerOf2(in ...