P5012 水の数列
P5012 水の数列
离线处理出选择每个数得到区间数得到刚开始的得分
\(RMQ_{ij}\)表示\(i\)~\(i\)+\(2^j\)-1的区间最大值
#include<cstdio>
#include<vector>
using namespace std;
typedef long long LL;
const LL maxn=1e6+10;
inline LL Read(){
LL x=0,f=1; char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}return x*f;
}
LL n,m;
LL ans[maxn],len[maxn],lg[maxn>>1],a[maxn];
int RMQ[maxn>>1][20];
inline LL Chkmax(LL x,LL y){
if(!x||!y)
return x+y;
if(ans[x]*y>ans[y]*x)
return x;
else if(ans[y]*x,ans[x]*y)
return y;
else
return (x>y)?x:y;
}
vector<LL> vec[maxn];
inline void First(){
LL up=0;
for(LL i=1;i<=n;++i)
vec[a[i]].push_back(i),
up=max(up,a[i]);
LL val=0,cnt=0;
for(LL i=1;i<=up;++i){
if(!vec[i].size())
continue;
for(LL j=0;j<vec[i].size();++j){
LL v=vec[i][j];
if(!len[v+1]&&!len[v-1]){
++val;
++cnt;
len[v]=1;
}else if(len[v+1]&&len[v-1]){
val+=2*len[v+1]*len[v-1]+2*len[v+1]+2*len[v-1]+1;
--cnt;
len[v-len[v-1]]=len[v+len[v+1]]=len[v-1]+len[v+1]+1;
}else if(len[v-1]){
val+=2*len[v-1]+1;
len[v-len[v-1]]=len[v]=len[v-1]+1;
}else{
val+=2*len[v+1]+1;
len[v+len[v+1]]=len[v]=len[v+1]+1;
}
}
ans[i]=val;
RMQ[cnt][0]=Chkmax(i,RMQ[cnt][0]);
}
for(LL i=2;i<=(n+1)/2;++i)
lg[i]=lg[i>>1]+1;
for(LL j=1;j<=19;++j)
for(LL i=1;i+(1<<j)-1<=(n+1)/2;++i)
RMQ[i][j]=Chkmax(RMQ[i][j-1],RMQ[i+(1<<(j-1))][j-1]);
}
inline LL Query(LL l,LL r){
if(l>(n+1)/2)
return 0;
if(r>(n+1)/2)
r=(n+1)/2;
LL x=lg[r-l+1];
return Chkmax(RMQ[l][x],RMQ[r-(1<<x)+1][x]);
}
int main(){
n=Read(),m=Read();
for(LL i=1;i<=n;++i)
a[i]=Read();
First();
LL last_ans=0;
while(m--){
LL a=Read(),b=Read(),x=Read(),y=Read();
LL l=(a*last_ans+x-1)%n+1,r=(b*last_ans+y-1)%n+1;
if(l>r)
swap(l,r);
LL now=Query(l,r);
if(!now){
printf("-1 -1\n");
printf("%lld %lld %lld\n",l,r,last_ans);
last_ans=1;
}else{
printf("%lld %lld\n",ans[now],now);
printf("%lld %lld %lld\n",l,r,last_ans);
last_ans=ans[now]%n*now%n;
}
}
return 0;
}
P5012 水の数列的更多相关文章
- luogu5012 水の数列 (并查集+线段树)
如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...
- hdu 2044:一只小蜜蜂...(水题,斐波那契数列)
一只小蜜蜂... Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepte ...
- hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
解题思路: 一只母猪生下第二头后立马被杀掉,可以这样想即,生下第二头便被杀掉,可以看成母猪数量没变 第一天 1 第二天 2 第三天 3 :第一头生第二头后杀掉还是1头,第二头再加上第二头生下的,一共三 ...
- 蓝桥杯 入门训练 Fibonacci数列(水题,斐波那契数列)
入门训练 Fibonacci数列 时间限制:1.0s 内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非 ...
- 入门训练 Fibonacci数列 (水题)
入门训练 Fibonacci数列 时间限制:1.0s 内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n ...
- CCF 201509-1 数列分段 (水题)
问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, …, an,表示 ...
- 洛谷 P1181 数列分段Section I(水题日常)
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...
- zzulioj--1712--神秘的数列(水题)
1712: 神密的数列 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 122 Solved: 92 SubmitStatusWeb Board De ...
- 洛谷P3901 数列找不同(莫队水题)
重温下手感,判断区间是否全是不同的数字有两种做法,一个长度为len的区间不同的数字,参见HH的项链,一种是区间众数,参见蒲公英,是水题没错了.明天搞数据库,然后继续自己的gre和训练计划 #inclu ...
随机推荐
- wxWidgets 安装方法(Windows 8.1 + Visual Studio 2013)
在windows 8.1上面,搭建基于visual studio 2013的wxWidgets的开发环境,方法如下: 下载 目前最新版本为3.0.0,下载地址: http://sourceforge ...
- EVB-P6UL:一识庐山真面目
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验与正确的图片链接显示,请访问我的博客原文: 在爱板网上看到这个活动,昨晚确认,今 ...
- binary-tree-inorder-traversal——二叉树中序遍历
Given a binary tree, return the inordertraversal of its nodes' values. For example:Given binary tree ...
- java 动态实现接口
package com.yhouse.modules.daos; public interface IUserDao { public String getUserName(); public Str ...
- HDFS源码分析之LightWeightGSet
LightWeightGSet是名字节点NameNode在内存中存储全部数据块信息的类BlocksMap需要的一个重要数据结构,它是一个占用较低内存的集合的实现,它使用一个数组array存储元素,使用 ...
- Qt QImageReader 相似乎有bug
Qt 版本号 5.4.1 (VS2010) 近期在做一个小程序,事实上非常easy,就是打开一个gif 动画.能够静态显示当中随意一帧图像.Qt 中有一个QImageReader 类.用这个类理论上说 ...
- Array容易被忽略的join
var lists, items = '', i; lists = [{ Fruits:'苹果' },{ Fruits:'香蕉' },{ Fruits:'菠萝' }]; /*items += '< ...
- Ejabberd作为推送服务的优化手段(转)
AVOS Cloud目前还在用Ejabberd做Android的消息推送服务.当时选择Ejabberd,是因为Ejabberd是一个发展很长时间的XMPP实现,并且基于Erlang,设想能在我们自主研 ...
- 小程序踩坑之不同屏幕下动态改变translate值
案例还原 小程序做一个进度条,可以通过拽转控制进度 那么肯定有一个进度条,不过小程序自己会做适配宽高 6s下这个div的width 是250 6splus就是276 但是问题来了,我拖拽用的是tran ...
- 17 nginx连接memcached
一:配置php扩展memcached wget http://memcached.googlecode.com/files/memcached-1.4.9.tar.gz # tar zvxf memc ...