点进去发现并不是博弈QAQ

一开始考虑单调队列什么乱七八糟的发现根本做不出来

(没错我一直在想枚举最大值求次大值QAQ

不妨换个思路:

我们考虑枚举次大值求最大值

设当前为now,

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

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

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

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

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

这也就是说我们可以O(1)的算每个位置的贡献

具体求L1,L2,R1,R2的做法如下:

我们先对于数据做一遍桶排序(注意相同的数位置越小优先级越高)

之后维护一个链表,从小到大枚举数,每枚举一个删掉一个

链表中的L1,L2,R1,R2就是上述的L1,L2,R1,R2

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std; const int maxn=10000010;
const int mod=1000000007;
typedef long long LL;
int n,A,B,p;
int a[maxn],b[maxn];
int t[maxn];
int next[maxn],pre[maxn];
int L1,R1,L2,R2; void del(int now){
next[pre[now]]=next[now];
pre[next[now]]=pre[now];
} int main(){
scanf("%d%d%d%d%d",&n,&a[0],&A,&B,&p);
for(int i=1;i<=n;++i)a[i]=(1LL*A*a[i-1]+B)%p,t[a[i]]++;
for(int i=1;i<p;++i)t[i]+=t[i-1];
for(int i=n;i>=1;--i)b[t[a[i]]--]=i;
for(int i=1;i<=n;++i)next[i]=i+1,pre[i]=i-1;
pre[0]=0;next[n+1]=n+1;
LL ans=0;
for(int i=1;i<=n;++i){
int now=b[i];
L1=pre[now];R1=next[now];
L2=pre[L1];R2=next[R1];
ans=ans+1LL*a[L1]*a[now]%mod*(L1-L2)%mod*(R1-now)%mod;
if(ans>=mod)ans-=mod;
ans=ans+1LL*a[R1]*a[now]%mod*(R2-R1)%mod*(now-L1)%mod;
if(ans>=mod)ans-=mod;
del(now);
}printf("%lld\n",ans);
return 0;
}

  

51Nod 算法马拉松12 移数博弈的更多相关文章

  1. 51nod算法马拉松12

    A 第K大区间 不妨考虑二分答案x,则问题转化成计算有多少个区间满足众数出现的次数>=x. 那么这个问题我们使用滑动窗口,枚举右端点,则左端点肯定单调递增,然后维护一个简单的数组就能资瓷添加元素 ...

  2. 51NOD 算法马拉松12

    OTZ做出题目的神犇..断断续续改完了在这里存一下思路吧 A题:第K大区间题意:定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 分析:二分答案mid,任务 ...

  3. 51Nod 算法马拉松12 Rikka with sequences

    当时做比赛的时候听说过这类用KD_Tree维护的数据结构题 然后知道是KD_Tree,然而并不知道怎么写QAQ 比赛完了之后%了一发代码 其基本思路是这样的: 1.首先我们把询问[L,R]看成二维平面 ...

  4. 51NOD 算法马拉松8

    题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...

  5. 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)

    题目链接  51nod 算法马拉松 34  Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...

  6. 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3

    先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...

  7. 51Nod 算法马拉松21(迎新年)

    这次打算法马拉松是在星期五的晚上,发挥还算正常(废话,剩下的题都不会= =). 讲讲比赛经过吧. 8:00准时发题,拿到之后第一时间开始读. A配对,看上去像是二分图最大权匹配,一看范围吓傻了,先跳过 ...

  8. 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛

    OwO 故事的起源大概是zcg前天发现51Nod晚上有场马拉松,然后他就很开心的过去打了 神奇的故事就开始了: 晚上的时候我当时貌似正在写线段树?然后看见zcg一脸激动告诉我第一题有九个点直接输出B就 ...

  9. 51Nod 算法马拉松23 开黑记

    惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...

随机推荐

  1. redis主从同步配置

    主服务器无需操作,从服务器 SLAVEOF 主服务器IP 端口 即可. 断开主从,执行 SLAVEOF NO ONE 即可. 同事和我在内网配置了连内网测试的服务器可以执行,但是连对方的不行,开始以为 ...

  2. Linux 访问权限

    [TOC] Linux访问权限 Linux用户和用户组 查看当前用户用命令who am i 用命令id username可以显示指定用户的用户id.用户组id(GID).和所属附加群组的信息. 所有的 ...

  3. ubuntu开机后弹出System program problem detected的解决办法

    sudo gedit /etc/default/apport 将enabled=1改为enabled=0保存退出重启后就可以了

  4. LeetCode - 804. Unique Morse Code Words

    International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...

  5. bootstrap 使用总结

    1.如何设置一行两列? <div class="container"> <div class="row"> <div class= ...

  6. vscode编辑器自动生成.vue文件

    1.选择“文件 -> 首选项 -> 用户代码片段”,此时,会弹出一个搜索框,输入vue 选择vue后,编辑器会自动打开一个名字为vue.json的文件 2.复制以下内容到这个文件中: { ...

  7. cf954H

    挖我自闭了这是什么东西啊. 给出一棵深度为  的树,其中深度为  的节点有  个儿子.问树上的简单路径中长度在  之间的每个有多少条.  表示对于在  层的  个节点,向下走  步的方案数  表示对于 ...

  8. node 把文件封装一层文件夹

    把 pages 下面的单个js文件,封装上一个文件夹 var glob = require("glob"); const fs = require("fs-extra&q ...

  9. APP安全在线检测

    腾讯金刚审计系统 http://service.security.tencent.com/kingkong 免费 无限制 腾讯御安全 http://yaq.qq.com/ 免费 查看漏洞详情需认证 阿 ...

  10. Redis 教程 Java工程师学习知识点

    1. Redis简介及安装 1.1 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下 ...