B1012 [JSOI2008]最大数maxnumber 分块||RMQ
这个题有毒,卡最大值。。。我开1 << 30爆零让我以为我分块错了。。。gg,然后去写RMQ,但是这个题st表是真简单啊。后来刘胜与巨佬一眼看出来我最大值不够大。。。然后1LL<<60也爆零,然而1 << 60 AC,(60LL)AC,1e8爆零。。。无良数据。。。
题目:
Description 现在请求你维护一个数列,要求提供以下两种操作:、 查询操作。语法:Q L 功能:查询当前数列中末尾L
个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。、 插入操作。语法:A n 功能:将n加
上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=),并将所得结果对一个固定的常数D取
模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个
数。
Input 第一行两个整数,M和D,其中M表示操作的个数(M <= ,),D如上文中所述,满足D在longint内。接下来
M行,查询操作或者插入操作。
Output
对于每一个询问操作,输出一行。该行只有一个数,即序列中最后L个数的最大数。
Sample Input A
Q
A
Q
Q
Sample Output
分块代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const long long INF = (60LL);
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
int bl,n,m,d,len = ;
ll k[];
ll a[];
char s[];
int main()
{
read(m);read(d);
bl = sqrt(m);
int t = ,l = ;
duke(i,,m)
{
ll x;
scanf("%s%lld",s,&x);
if(s[] == 'Q')
{
n = len - x + ;
if(n > (len / bl - ) * bl)
{
ll maxn = ;
duke(i,n,len)
{
if(maxn < a[i])
maxn = a[i];
}
printf("%lld\n",maxn);
t = maxn;
}
else
{
ll maxn = ;
duke(i,n / bl + ,len / bl)
{
if(maxn < k[i])
maxn = k[i];
}
duke(i,l,len)
{
if(maxn < a[i])
maxn = a[i];
}
duke(i,n,(n / bl + ) * bl)
{
if(maxn < a[i])
maxn = a[i];
}
t = maxn;
printf("%lld\n",maxn);
}
}
else
{
x += t;
if(x < )
x += d;
x %= d;
a[++len] = x;
if(len % bl == )
{
ll maxn = INF;
duke(i,l,len)
{
if(maxn < a[i])
maxn = a[i];
}
k[len / bl] = maxn;
l = len + ;
}
}
}
}
/*
9 100
A 1
A 2
A 3
A 4
A 5
Q 3
A 7
A 8
Q 4
*/
/*
5 100
A 96
Q 1
A 97
Q 1
Q 2
*/
RMQ代码:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
ll a[],f[][],t,D;
int n,m;
bool flag;
void change(int u) //用change函数来进行修改
{
f[u][]=a[u];
for(int i=; u-(<<i)>=; i++) f[u][i]=max(f[u][i-],f[u-(<<(i-))][i-]);
}
ll find(int x,int y)
{
double t=log(y-x+)/log();
int K=t;
return max(f[y][K],f[x+(<<K)-][K]);
}
int main()
{
memset(f,,sizeof(f));
scanf("%d%lld",&m,&D);
for (int i=; i<=m; i++)
{
char c;
cin>>c;
ll x;
if (c=='A') //根据题面的操作,注意细节。
{
scanf("%lld",&x);
a[++n]=(x+t)%D;
change(n);
}
else
{
int L;
scanf("%d",&L);
ll ans;
if (L==)
{
printf("%lld\n",a[n]);
t=a[n];
continue;
}
ans=find(n-L+,n);
printf("%lld\n",ans);
t=ans;
}
}
return ;
}
B1012 [JSOI2008]最大数maxnumber 分块||RMQ的更多相关文章
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 9851 Solved: 4318[Submi ...
- BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 4750 Solved: 2145[Submi ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ-1012[JSOI2008]最大数maxnumber 线段树区间最值
这道题相对简单下面是题目: 1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6542 Solve ...
- 【bzoj1012】[JSOI2008]最大数maxnumber
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8339 Solved: 3624[Submi ...
- Cogs 1844. [JSOI2008]最大数maxnumber
[JSOI2008]最大数maxnumber ★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比 时间限制:3 s 内存限制:162 MB [题目描述] 现在请求 ...
- BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 10374 Solved: 4535[Subm ...
- [JSOI2008]最大数maxnumber
[JSOI2008]最大数maxnumber 标签: 线段树 单独队列 题目链接 题解 线段树裸题. 如果一直RE可能是你用的cin/cout. Code #include<cstdio> ...
- bzoj 1012: [JSOI2008]最大数maxnumber (线段树)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 13081 Solved: 5654[Subm ...
随机推荐
- SQL Server 一个简单的游标
先看一下原表: DECLARE @id INT; DECLARE @name NVARCHAR(100); DECLARE c_department CURSOR FOR SELECT StuID, ...
- 【Oracle】append
我们在生产环境中经常遇到需要往表中插入大量数据的情况,怎么样才能让插入数据的速度变快呢?Oracle中的append简直就是神器!!没图说个**,直接上图: 是不是看晕了?哈哈,莫慌,请看下面总结: ...
- Dll中的方法向外返回dynamic类型可能会失败
如果Dll中有某个类的方法返回dynamic实例,并且dynamic对象实际实例为匿名类类型,则Dll的外部使用者可能最终无法正常使用此dynamic对象.当使用此dynamic对象时,可能会遇到x属 ...
- MAMP PRO php的session保存在哪里
session的概念就不介绍了,最近接触php,很好奇session会保存在哪里. mac上用了MAMP PRO集成环境,作为服务器. 查了网上,说session的保存路径在php.ini中声明,于是 ...
- .NET Framework 3.5 安装
今天vCenter服务器悲剧了,只好火速重新部署新vCenter服务器... Windows server 2016 中,安装VCenter 5.5 提示 未安装 .NET Framework 3. ...
- Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
public static IWebHostBuilder UseContentRootAsEnv(this IWebHostBuilder hostBuilder) { bool IsWindows ...
- js与Jquery的对比
// document.getElementById("divCommit").style.display="none";// document.g ...
- spring学习地址
http://developer.51cto.com/art/201006/205212_2.htm
- 单点登录之 CAS SSO 从入门到精通(第一天)
转自:http://blog.csdn.net/lifetragedy/article/details/43817903 啊......it's quite a long time. 好久没更新博客了 ...
- Qt5.11+opencv3.4的配置安装
系统:Windows 10 64位 前期准备: 1.CMake下载安装 下载地址:https://cmake.org/download/ 选择msi安装文件,按照提示一步一步按照就好 可以参考:htt ...