51Nod 算法马拉松12 移数博弈
点进去发现并不是博弈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 移数博弈的更多相关文章
- 51nod算法马拉松12
A 第K大区间 不妨考虑二分答案x,则问题转化成计算有多少个区间满足众数出现的次数>=x. 那么这个问题我们使用滑动窗口,枚举右端点,则左端点肯定单调递增,然后维护一个简单的数组就能资瓷添加元素 ...
- 51NOD 算法马拉松12
OTZ做出题目的神犇..断断续续改完了在这里存一下思路吧 A题:第K大区间题意:定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 分析:二分答案mid,任务 ...
- 51Nod 算法马拉松12 Rikka with sequences
当时做比赛的时候听说过这类用KD_Tree维护的数据结构题 然后知道是KD_Tree,然而并不知道怎么写QAQ 比赛完了之后%了一发代码 其基本思路是这样的: 1.首先我们把询问[L,R]看成二维平面 ...
- 51NOD 算法马拉松8
题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...
- 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)
题目链接 51nod 算法马拉松 34 Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
- 51Nod 算法马拉松21(迎新年)
这次打算法马拉松是在星期五的晚上,发挥还算正常(废话,剩下的题都不会= =). 讲讲比赛经过吧. 8:00准时发题,拿到之后第一时间开始读. A配对,看上去像是二分图最大权匹配,一看范围吓傻了,先跳过 ...
- 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛
OwO 故事的起源大概是zcg前天发现51Nod晚上有场马拉松,然后他就很开心的过去打了 神奇的故事就开始了: 晚上的时候我当时貌似正在写线段树?然后看见zcg一脸激动告诉我第一题有九个点直接输出B就 ...
- 51Nod 算法马拉松23 开黑记
惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...
随机推荐
- iowait
https://www.cnblogs.com/fuyuanming/articles/6497005.html
- 一、Sql Server 基础培训《进度1-建库建数据表(实际操作)》
知识点: 1.建数据库示例参考 --创建一个数据库名为‘dbtest’ create database dbtest go --打开数据库 dbtest use dbtest go 2.建表示例参考 ...
- kubernetes-deployments
Kubernetes令部署应用.管理应用变得简单直白,令大多数操作简化为单个API或单个命令行,包括发布新的应用程序,升级.那么为什么我们还需要部署呢? 自动化Deployment和滚动更新程序.相比 ...
- 将Windows 8.1 系统窗口背景设置成淡绿色?
1.右键点击开始→运行. 2.在运行中输入: regedit 按回车键之后,打开注册表编辑器. 3.依次定位到:HKEY_CURRENT_USER\Control Panel\Colors. 4.然后 ...
- ASP.NET Core MVC+EF Core从开发到部署
笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...
- wpgcms---循环导航
使用wpgcms的时候,在后台设置了导航菜单,那么在前端是如何循环呢? 第一种:简便方法 {% set array = [ {name:'移动APP',icon:'icon-yidongAPP',co ...
- VC++ 字符串Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
类 型 MBCS UNICODE TCHAR char char WCHAR wchar_t wchar_t LPSTR char* char* LPCSTR const ...
- python 笔记 week1-- if while for
1.添加环境变量 windows要加环境变量.linux若升级版本不一致, #!/usr/bin/env python 调用环境变量中的python #!/usr/bin/python 调用系统中默认 ...
- 查看 java 中的编译的字节码文件
javap -c Atomicity ---------- javap -c 产生的字节码文件---------- Compiled from "Atomicity.java" p ...
- Java编程基础篇第五章
数组概述 概念:数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器.数组既可以存储基本数据类型,也可以存储引用数据类型.应用场景:为了存储同种数据类型的多个值 数组定义格式 格式1:元素类型 ...