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应该是 ...
随机推荐
- 判断当前的Activity的是否处于栈顶
lockAppName 是需要判断Activity的全称(包括包名). private boolean getTopApp(Context mContext) { String lockAppName ...
- [原][openstack-pike][controller node][issue-3][horizon] dashboard show internal error 500 Cannot serve directory /var/www/html
问题点: 安装完pike后发现只能使用 ip:80 登录到http的主页面 不能使用 http://controller_ip:80/dashboard 登录openstack登录页面.如下图 重启h ...
- java第一次上机实验--验证码
package javashiyan; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event. ...
- 10、DOM(文档对象模型)
1.认识DOM html 骨架 css 装修 javascript 物业 ==DOM 打破上述三者的通道.== [注]script标签一般情况下要写在head标签. <div id ...
- 怎么用js实现jq的removeClass方法
1.addClass:为指定的dom元素添加样式. 2.removeClass:删除指定dom元素的样式. 3.toggleClass:如果存在(不存在),就删除(添加)一个样式. 4.hasClas ...
- mui 窗口管理及窗口之间的数据传递
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- Django中URL有关
django 模板中url的处理 在模板中直接添加‘/home’这样的链接是十分不推荐的,因为这是一个相对的链接,在不同网页中打开可能会返回不一样的结果. 所以推荐的是 1 <a href= ...
- Java图片合并
/** * 纵向合并图片,ossObject.getObjectContent()返回InputStream对象 */ private BufferedImage mergeImage(List< ...
- ADB命令(全)
当熟悉Shell命令的人使用adb是没有任何难度的,因为adb中绝大多少命令都是引用的shell命令 以下命令进行归类,红色部分字体是测试人员常用的adb命令 基础命令 1.启动adb服务 adb s ...
- EFM32G232F64时钟树
1.为了熟悉MCU的时钟树,先看看EFM32G232F64的CMU(ClockManagementUnit) 时钟管理单元(CMU)用于管控晶振(时钟源)和各个时钟节点.出于降低功耗和启动时间的目的, ...