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 水の数列的更多相关文章

  1. luogu5012 水の数列 (并查集+线段树)

    如果我们能求出来每个区间个数的最大分值,那就可以用线段树维护这个东西 然后出答案了 然后这个的求法和(luogu4269)Snow Boots G非常类似,就是我们把数大小排个序,每次都拿<=x ...

  2. hdu 2044:一只小蜜蜂...(水题,斐波那契数列)

    一只小蜜蜂... Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepte ...

  3. hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)

    解题思路: 一只母猪生下第二头后立马被杀掉,可以这样想即,生下第二头便被杀掉,可以看成母猪数量没变 第一天 1 第二天 2 第三天 3 :第一头生第二头后杀掉还是1头,第二头再加上第二头生下的,一共三 ...

  4. 蓝桥杯 入门训练 Fibonacci数列(水题,斐波那契数列)

    入门训练 Fibonacci数列 时间限制:1.0s   内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非 ...

  5. 入门训练 Fibonacci数列 (水题)

    入门训练 Fibonacci数列   时间限制:1.0s   内存限制:256.0MB        问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n ...

  6. CCF 201509-1 数列分段 (水题)

    问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, …, an,表示 ...

  7. 洛谷 P1181 数列分段Section I(水题日常)

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...

  8. zzulioj--1712--神秘的数列(水题)

    1712: 神密的数列 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 122  Solved: 92 SubmitStatusWeb Board De ...

  9. 洛谷P3901 数列找不同(莫队水题)

    重温下手感,判断区间是否全是不同的数字有两种做法,一个长度为len的区间不同的数字,参见HH的项链,一种是区间众数,参见蒲公英,是水题没错了.明天搞数据库,然后继续自己的gre和训练计划 #inclu ...

随机推荐

  1. 使用virtualenv, uwsgi, nginx来布署django

    http://blog.csdn.net/lihao21/article/details/47731903 http://www.cnblogs.com/lxg226/p/3468558.html h ...

  2. linux下ftp、telnet的安装和使用

    1.ftp的安装和使用 一般在各种linux的发行版中,默认带有的ftp软件是vsftp. 使用如下命令#rpm -qa | grep vsftpd可以检测出是否安装了vsftpd软件,如果没有安装, ...

  3. APNS push server端 SSL3.0 转 TLS (iPhone苹果推送服务)

    (转载此文,请说明原文出处) 苹果的官方公布 Update to the Apple Push Notification Service October 22, 2014 The Apple Push ...

  4. 【GLSL教程】(八)纹理贴图 【转】

    http://blog.csdn.net/racehorse/article/details/6664717 简单的纹理贴图(Simple Texture) 为了在GLSL中应用纹理,我们需要访问每个 ...

  5. Linux下ntp时间同步

    在root用户下执行 先安装同步时间软件,每台机器执行 yum install -y ntp 然后执行以下命令: crontab -e */10 * * * * /usr/sbin/ntpdate - ...

  6. 在容器内执行go编译程序的坑

    如果你编译了一个go程序,让后把它放到容器里面.很多时候这个程序都会无法执行,大概的样子是: /tmp # ls pub sub /tmp # ./pub /bin/ash: pub: not fou ...

  7. 分布式数据库中间件–(1) Cobar初始化过程

    Cobar-Server的源代码地址:GitHub 欢迎Fork. 官方文档描写叙述Cobar的网络通信模块见下图. Cobar使用了Java的NIO进行处理读写.NIO是Java中的IO复用.而不须 ...

  8. UNP学习笔记(第二十六章 线程)

    线程有时称为轻权进程(lightweight process) 同一进程内的所有线程共享相同的全局内存.这使得线程之间易于共享信息,然后这样也会带来同步的问题 同一进程内的所有线程处理共享全局变量外还 ...

  9. Android源代码解析之(六)--&gt;Log日志

    转载请标明出处:一片枫叶的专栏 首先说点题外话,对于想学android framework源代码的同学,事实上能够在github中fork一份,详细地址:platform_frameworks_bas ...

  10. C语言数据类型的转换

    C语言的类型转换,一个是强制类型进行转换,而在这里要介绍的是自动的数据类型的转换,自动的数据类型转换很多时候是发生在多种数据类型混合使用的时候就会进行类型的转换,这样就会带来不能控制的结果,所以必须进 ...