1589 移数博弈

基准时间限制:1 秒 空间限制:262144 KB 分值: 80 难度:5级算法题
 

小A和小B在玩一个游戏。

他们拥有一个数列。

小A在该数列中选择出最大的那个数,然后移出该数列。

小B在剩下的数列中选择出最大的那个数,并乘上小A的那个值,作为他的答案。

那么现在问题来了。

他们现在想换一种玩法,把该数列长度大于等于2的区间(即n*(n-1)/2个区间)单独作为一个数列拿出来,然后做一次上述的游戏,然后计算出小B所有的答案,考虑到输出那么多数比较困难,因此他们想知道所有答案和对 1e9+7取模后的值。

样例解释:

该数列为2,0,1,2

对于1-2的区间答案为0

对于1-3的区间答案为2

对于1-4的区间答案为4

对于2-3的区间答案为0

对于2-4的区间答案为2

对于3-4的区间答案为2

Input
第一行五个数n,a0,a,b,p(1<=n,a0,a,b,p<=10000000)。
该数列的构造方法为,a[i]=(a[i-1]*a+b)%p。该数列的下标为1~n。
Output
1行,表示答案。
Input示例
4 1 1 1 3
Output示例
10

题解:

  设当前为now

  设now之前第一个比他大的数的位置为L1,L1之前第一个比他大的数的位置为L2

  设now之后第一个比他大的数的位置为R1,R1之后第一个比他大的数的位置为R2

  那么对于now,其作为次大值存在的区间有:

    1、左端点在[L2+1,L1]之间,右端点在[now,R1-1]之间

    2、左端点在[L1+1,now]之间,右端点在[R1,R2-1]之间。

  因为此题数据范围n在1~1e7,最大值p范围在1~1e7,所以考虑用桶排序优化合适。

  然后维护一个链表,从小到大枚举数,枚举完就删除,保证每次枚举的数是链表中最小的。这样就可以控制复杂度在O(N)啦。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e7+;
const int MOD = 1e9+;
int a[N], b[N];//b[i]=j 表示a[j]排序后在i位置
int vis[N];
int pre[N], nex[N];
void del(int now) {//删除now节点
nex[pre[now]] = nex[now];
pre[nex[now]] = pre[now];
}
int main() {
int n, aa, bb, p, i, j;
ll ans = ;
scanf("%d%d%d%d%d", &n, &a[], &aa, &bb, &p);
for(i = ; i <= n; ++i) a[i] = (1ll * a[i-] * aa + bb) % p;
//桶排序
for(i = ; i <= n; ++i) vis[a[i]]++;
for(i = ; i < p; ++i) vis[i] += vis[i-];
for(i = n; i >= ; --i) b[vis[a[i]]--] = i;
//链表
pre[] = ; nex[n+] = n+;
for(i = ; i <= n; ++i) {
pre[i] = i - ;
nex[i] = i + ;
}
for(i = ; i <= n; ++i) {
int now = b[i];
int l1 = pre[now];
int l2 = pre[l1];
int r1 = nex[now];
int r2 = nex[r1];
ans = (ans + (1ll*a[now]*a[l1]%MOD*(l1-l2)%MOD*(r1-now)%MOD)) % MOD;
ans = (ans + (1ll*a[now]*a[r1]%MOD*(now-l1)%MOD*(r2-r1)%MOD)) % MOD;
del(now);
}
printf("%lld\n", ans);
return ;
}

51nod 1589 移数博弈【桶排序+链表】的更多相关文章

  1. 51nod 1589 移数博弈 | 基数排序(ノಠ益ಠ)ノ彡┻━┻

    51nod 1589 移数博弈 题面 给出一个序列a,长度 n <= 10^7, a[i] <= 10^7 求每个长度 >= 2 的区间的最大值*次大值 之和. 题解 主要思路是求每 ...

  2. 51Nod 算法马拉松12 移数博弈

    点进去发现并不是博弈QAQ 一开始考虑单调队列什么乱七八糟的发现根本做不出来 (没错我一直在想枚举最大值求次大值QAQ 不妨换个思路: 我们考虑枚举次大值求最大值 设当前为now, 设now之前第一个 ...

  3. 桶排序(BucketSort)

    1 桶排序核心思想是 根据数据规模n划分 m个相同大小的区间 (每个区间为一个桶,桶可理解为容器) 2 每个桶存储区间内的元素(区间为半开区间 例如[0,10) 或者 [200,300) ) 3 将n ...

  4. 桶排序之python实现源码

    tmp = [] def bucket_sort(old): for i in range(len(old)): tmp.append([]) for i in old: tmp[int( i * l ...

  5. Java实现桶排序和基数排序

    桶排序代码: import java.util.Arrays; /** * 桶排序 * 工作的原理是将数组分到有限数量的桶里 * 每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序 ...

  6. 记数排序 & 桶排序 & 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  7. BucketSort(桶排序)原理及C++代码实现

    桶排序假设输入数据服从均匀分布,平均情况下它的时间复杂度为O(n). 桶排序将输入数据的区间均匀分成若干份,每一份称作“桶”.分别对每一个桶的内容进行排序,再按桶的顺序输出则完成排序. 通常使用链表来 ...

  8. 【Weiss】【第03章】练习3.13:桶排序

    [练习3.13] 利用社会安全号码对学生记录构成的数组排序.编写一个程序进行这件工作,使用具有1000个桶的基数排序并且分三趟进行. Answer: 首先,对社会安全号码不了解的就把它当成一个不超过9 ...

  9. 数据结构与算法-排序(十)桶排序(Bucket Sort)

    摘要 桶排序和基数排序类似,相当于基数排序的另外一种逻辑.它是将取值范围当做创建桶的数量,桶的长度就是序列的大小.通过处理比较元素的数值,把元素放在桶的特定位置,然后遍历桶,就可以得到有序的序列. 逻 ...

随机推荐

  1. CodeBlocks "no such file or directory" 错误解决方案(创建类找不到头文件)

    在CodeBlocks下,有时候需要自己定义类,当然就要添加相应的头文件,但添加进去的头文件明明包含在项目中了, 但编译时还是会报错:no such file or directory;这是为什么呢? ...

  2. 简单的node爬虫练手,循环中的异步转同步

    简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...

  3. mysql sql语句大全(MySQL语句 整理一)

    1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建 备份 ...

  4. 南阳nyoj 56 阶乘因式分解(一)

    阶乘因式分解(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数, ...

  5. LeetCode SQL:Employees Earning More Than Their Managers

    # Write your MySQL query statement below SELECT a.Name FROM Employee AS a INNER JOIN Employee AS b O ...

  6. Layabox 3D游戏开发学习笔记---射线检测,鼠标控制物体运动

    核心要点:3D物体碰撞是靠射线检测,射线与碰撞器相撞获取对应的碰撞点信息. class RayPicking03 { private ray: Laya.Ray; private point: Lay ...

  7. Vue.js 的一些小技巧

    给 props 属性设置多个类型 这个技巧在开发组件的时候用的较多,为了更大的容错性考虑,同时代码也更加人性化: export default { props: { width: { type: [S ...

  8. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  9. 【vue】webpack插件svg-sprite-loader---实现自己的icon组件

    引言:最近开始写vue的项目,借鉴了一下vue-element-admin源码,针对vue有一个关于icon图标的处理,最近也找了很多关于vue的icon处理的解决方案,大部分都是按照之前小程序的方式 ...

  10. Kubernetes核心概念简介

    本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...