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. Mysql中delimiter作用

    1. delimiter delimiter是mysql分隔符.在mysqlclient中分隔符默认是分号(:). 假设一次输入的语句较多,而且语句中间有分号,这时须要新指定一个特殊的分隔符. 2. ...

  2. vue 组件创建与销毁

    vue 组件(如对话框组件)实时创建与销毁: 使用v-if <search-history :show="showSearchHistory" @close="sh ...

  3. Oracle 修改带数据的字段类型

    http://www.cnblogs.com/LDaqiang/articles/1157998.html由于需求变动,现要将一个类型NUMBER(8,2)的字段类型改为 char.大体思路如下:   ...

  4. html的table使用div创建

    午休时间写了一个使用div创建table的案例 1.样式 <style> .table { display: table; } .tableRow { display: table-row ...

  5. SQL之相关语法及操作符

    概述:UNION.SELECT INTO.INSERT INTO SELECT.SQL约束 UNION操作符 UNION操作符用于合并两个或多个SELECT语句的结果集 请注意,UNION内部的每个S ...

  6. 在EA中用ER图生成数据库

    ER图 E-R图也称实体-联系图(Entity Relationship Diagram).提供了表示实体类型.属性和联系的方法.用来描写叙述现实世界的概念模型. 实体就是看的见摸得着或者能被人感知接 ...

  7. linux使用crontab实现PHP执行定时任务(转)

    前几天写过一篇文章,利用单纯的php实现定时执行任务,但是效率不佳,对于linux来说用crontab实现更加合理. 首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 c ...

  8. Lua学习六----------Lua流程控制

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua流程控制 - 通过程序设定一个或多个条件语句 - 在条件为true时执行指定程序代码,在条件为false时指定其他指定程序代码 - 控制结构语句 ...

  9. Oracle:复合触发器

    ----- CF_DEPTUCORGANIZATION  INSERT UPDATE DELETE 触发器CREATE  OR REPLACE TRIGGER tr_del_CF_DEPTUCORGA ...

  10. 可执行Jar包调用动态链接库(DLL/SO)

    踩过了很多的坑,查了很多资料,在此记录一下,以SpringBoot项目为基础. Maven加入JNA依赖 <!-- JNA start --> <dependency> < ...