51nod 1589 移数博弈 | 基数排序(ノಠ益ಠ)ノ彡┻━┻
51nod 1589 移数博弈
题面
给出一个序列a,长度 n <= 10^7, a[i] <= 10^7
求每个长度 >= 2 的区间的最大值*次大值 之和。
题解
主要思路是求每个元素作为次大值做了多少贡献。
对于一个元素 a[i], 设从i向左走能找到的第一个比a[i]大的位置为l[i], 第二个比a[i]大的位置为ll[i], 向右走能找到的第一个比a[i]大的位置为r[i], 第二个为rr[i]。
a[i]作为次大值的时候,区间最大值要么是a[l[i]], 要么是a[r[i]]。

如上图(竖直柱表示不同大小的数,之前未画出的均比a[i]小),若a[l[i]]是最大值,那么区间左、右端点应分别在橙色区间的两部分中;否则应该在紫色区间的两部分中。
对应计算区间数量求贡献即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
const int N = 1e7 + 5, P = 1e9 + 7;
int n, A, B, p, a[N], b[N], cnt[N], pre[N], nxt[N];
ll ans;
//b[i]是a中排名第i的元素的位置
int main(){
read(n), read(a[0]), read(A), read(B), read(p);
for(int i = 1; i <= n; i++)
a[i] = ((ll)a[i - 1] * A + B) % p, cnt[a[i]]++;
a[0] = 0;
for(int i = 1; i <= 1e7; i++)
cnt[i] += cnt[i - 1];
for(int i = n; i; i--)
b[cnt[a[i]]--] = i;
for(int i = 0; i <= n + 1; i++)
pre[i] = i - 1, nxt[i] = i + 1;
pre[0] = 0, nxt[n + 1] = n + 1;
for(int i = 1; i <= n; i++){
ans = (ans + (ll) a[b[i]] * a[pre[b[i]]] % P
* (pre[b[i]] - pre[pre[b[i]]]) % P
* (nxt[b[i]] - b[i]) % P) % P;
ans = (ans + (ll) a[b[i]] * a[nxt[b[i]]] % P
* (nxt[nxt[b[i]]] - nxt[b[i]]) % P
* (b[i] - pre[b[i]]) % P) % P;
pre[nxt[b[i]]] = pre[b[i]];
nxt[pre[b[i]]] = nxt[b[i]];
}
write(ans), putchar('\n');
return 0;
}
51nod 1589 移数博弈 | 基数排序(ノಠ益ಠ)ノ彡┻━┻的更多相关文章
- 51nod 1589 移数博弈【桶排序+链表】
1589 移数博弈 基准时间限制:1 秒 空间限制:262144 KB 分值: 80 难度:5级算法题 小A和小B在玩一个游戏. 他们拥有一个数列. 小A在该数列中选择出最大的那个数,然后移出该数 ...
- 51Nod 算法马拉松12 移数博弈
点进去发现并不是博弈QAQ 一开始考虑单调队列什么乱七八糟的发现根本做不出来 (没错我一直在想枚举最大值求次大值QAQ 不妨换个思路: 我们考虑枚举次大值求最大值 设当前为now, 设now之前第一个 ...
- 51Nod 1067 Bash博弈V2
这道题告诉我,一定要去尝试,去推算,不要动不动就找度娘要答案.(惭愧惭愧) 既然是博弈问题,按理我们应该找出规律,怎么找呢,推,把前几项写出来找规律,动手很重要. 上题: 1067 Bash游戏 V2 ...
- 可持久化trie 学习总结
QAQ 以前一直觉得可持久化trie很难,今天强行写了一发觉得还是蛮简单的嘛 自己的模板是自己手写的,写了几道题目并没有出过错误 THUSC的第二题的解法五貌似就是可持久化trie,时间复杂度O(60 ...
- codeforces #305 B Mike and Feet
跟之前做过的51Nod的移数博弈是一样的QAQ 我们考虑每个数的贡献 定义其左边第一个比他小的数的位置为L 定义其右边第一个比他小的数的位置为R 这个可以用排序+链表 或者 单调队列 搞定 那么对于区 ...
- 51nod算法马拉松12
A 第K大区间 不妨考虑二分答案x,则问题转化成计算有多少个区间满足众数出现的次数>=x. 那么这个问题我们使用滑动窗口,枚举右端点,则左端点肯定单调递增,然后维护一个简单的数组就能资瓷添加元素 ...
- 51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径
51nod 1766 树上的最远点对 | LCA ST表 线段树 树的直径 题面 n个点被n-1条边连接成了一颗树,给出a~b和c~d两个区间,表示点的标号请你求出两个区间内各选一点之间的最大距离,即 ...
- CSS学习笔记——定位position属性的学习
今天学习之前剩下的一个问题:CSS的position属性.首先归纳出和position相关的问题: position作为一个属性,它一共有哪几个属性值? position常用的属性值有哪几个?分别有什 ...
- [UWP小白日记-6]页面跳转过度动画
前言 在学习中发现页面导航默认是没有过度动画的,直接就导航过去太粗暴了( ̄へ ̄),于是打算上动画结果不言而喻自己进了坑完全不懂动画,然后就是各种疯狂(´・_・`)的搜索资料看了后终于有点头绪. 再后来 ...
随机推荐
- c语言数字图像处理(四):灰度变换
灰度变换 灰度变换函数 s = T(r) 其中r为输入图像在(x, y)点处的灰度值,s为输出图像在(x, y)点处的灰度值 灰度变换的作用 上图所示的两幅T(s)函数的图像曲线,第一幅图可以增强 ...
- Flink BLOB架构
Flink中支持的BLOB文件类型 jar包 被user classloader使用的jar包 高负荷RPC消息 1. RPC消息长度超出了akka.framesize的大小 2. 在HA摸式中,利用 ...
- 企业上云这四大要点,你 get 了吗?
本文由 Platform9(一家专注于云计算.专有云.混合云.OpenStack 以及容器技术的北美初创公司)技术产品营销经理 Akshai Parthasarathy 撰写,描述了企业在向云基础设施 ...
- dp算法之有代价的最短路径
题目:有代价的最短路径 题目介绍:如下图所示,现在平面上有N个点,此时N=7,每个点可能和其他点相连,相连的线有一定权值,求出从0点到N-1点的消耗权值的最小值. 分析:用动态规划的思路来解决,每一点 ...
- windows 7 php 7.1 命令行 执行 中文文件名 的PHP文件
在PHP5.6时代直接执行 php.exe 文件.php 是没有的这个问题 在win下的命令行中 活动代码页命令 chcp 修改 chcp 936 //gbk chcp 65001 //utf-8 ...
- NIO_通道之间传输数据
通道之间传输数据 transferFrom() transferTo() @Test public void test3() throws IOException { FileChannel inCh ...
- 使用OpenCV通过摄像头捕获实时视频并探测人脸
在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...
- 【quickhybrid】组件(自定义)API的实现
前言 前文在API规划时就已经有提到过组件API这个概念,本文将会介绍它的原理以及实现 理解组件API这个概念 quick.ui.xxx quick.page.xxx 在quick hybrid中,A ...
- java把map转json
JSONUtils.toJSONString(requestMap); com.alibaba.fastjson.JSON <!-- https://mvnrepository.com/a ...
- SpringMvc跨域支持
SpringMvc跨域支持 在controller层加上注解@CrossOrigin可以实现跨域 该注解有两个参数 1,origins : 允许可访问的域列表 2,maxAge:飞行前响应的缓存持续 ...