【bzoj题解】1012 最大数

题目描述

现在请求你维护一个数列,要求提供以下两种操作:
1、查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。
2、插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。
注意:初始时数列是空的,没有一个数。

输入

第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足D在int内。
接下来M行,查询操作或者插入操作。

输出

对于每一个询问操作,输出一行。该行只有一个数,即序列中最后L个数的最大数。

样例输入

5 100
A 96
Q 1
A 97
Q 1
Q 2

样例输出

96
93
96

题解

暴力线段树搞……据说有单调队列做法,不会做。

 1 #include<cstdio>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 int Max(int p,int q){return p>q?p:q;}
 4 int m,d,dat[524289];
 5 void A(int a,int b,int i,int p,int x){
 6     dat[i]=Max(dat[i],x);
 7     if(a==b) return;
 8     if(((a+b)>>1)<p) A(((a+b)>>1)+1,b,(i<<1)+1,p,x);
 9     else A(a,(a+b)>>1,i<<1,p,x);
10 }
11 int Q(int a,int b,int i,int l,int r){
12     if(b<l||r<a) return 0;
13     if(l<=a&&b<=r) return dat[i];
14     return Max(Q(a,(a+b)>>1,i<<1,l,r),Q(((a+b)>>1)+1,b,(i<<1)+1,l,r));
15 }
16 int main(){
17     scanf("%d%d",&m,&d);
18     int n=0,t=0,k;
19     char ch;
20     F(i,1,m){
21         scanf("%*c%c%d",&ch,&k);
22         if(ch==‘A‘) A(1,200000,1,++n,(t+k)%d);
23         else printf("%d\n",t=Q(1,200000,1,n-k+1,n));
24     }
25     return 0;
26 }
时间: 2024-10-29 05:54:40

【bzoj题解】1012 最大数的相关文章

【BZOJ】1012 最大数

[解析1]线段树 [分析] 这道题数据M<=200000,最直观的就是开棵线段树 O(M log M) 就过了. 没想到随手写的居然一次AC了,以后要杜绝这种坏习惯. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> using namespace std; const int M=200001; const int L=INT_MAX; co

【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+区间最值)

http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个,1a了. 区间最值其实和区间求和差不多,就是将sum数组的含义转移到max,然后通过特定的区间更新max. 在区间求和中,当我们维护max[i]的时候,要找到它前面所有的max[j]来更新,在这里因为是树状数组,所以可以降成一个log级,画图可知,max[i]需要的max只有max[i-2^0],

【单调栈】Bzoj 1012: 最大数maxnumber

1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 6255  Solved: 2676[Submit][Status][Discuss] Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次

[BZOJ 1012] 最大数maxnumber

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1012 分析 刚看以为是线段树或者是平衡树, 然后看了一种接近暴力的方法–单调队列. 感觉这个方法可以被卡住, 所以之后再发几种其他做法. 代码 https://code.csdn.net/snippets/607317

BZOJ 1012 最大数

这个?乱入线段树.我写的还特别暴力结果还是过了.... #include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define maxn 1000050using namespace std;long long ls[maxn],rs[maxn],value[maxn];long long m,d,last=0,n,rec=0,tot=0,root=0;char type[5];lo

[Bzoj]1012最大数maxnumber

献上黑历史: CE的几次是因为蒟蒻内外循环用同一个量,ce++ WA是因为蒟蒻不会写线段树,写了个单调队列,OK——W TLE是因为蒟蒻脑子有病: while m<>0 do begin ………… end;没有加dec(m); RE是因为蒟蒻数组开太小:第一次开110000:第二次开200000:结果就………… AC是因为数组开大一点,学学MZL大神的线段树,数组开到800005(⊙o⊙)… sb代码献上,并在此献上膝盖给MZL var len,x,n,d,m,lst:longint; op:

BZOJ 1012 最大数maxnumber(单调队列)

Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾.限制:n是非负整数并且在长整范围内.注意:初始时数列是空的,没有一个数. Input 第一行两个整数,M和D,其中M表示操作

【NOI题解】【bzoj题解】NOI2008 bzoj1063 道路设计

@ACMLCZH学长出的毒瘤题T3.再也不是"善良"的出题人了. 题意:bzoj. 题解: 经典的树形DP题目,屡见不鲜了,然而我还是没有写出来. 这一类的题目有很多,例如这里的C题. 主要套路是把对儿子的枚举变成一个类似背包的转移方式,实现降复杂度. 需要注意的是某一个地方的DP值不能直接拿来判断是否有解,例如mod=1时,DP值全为0就没法判断了. 这里比较骚的操作是把mod的倍数变成mod,而0变成0,这样就不会漏判. #include<bits/stdc++.h>

PAT甲题题解-1012. The Best Rank (25)-排序水题

排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询,建立id与索引的映射即可. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <map> using namespace s