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

1012: [JSOI2008]最大数maxnumber

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 6255  Solved: 2676
[Submit][Status][Discuss]

Description

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

Input

第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0

Output

对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

Sample Input

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

Sample Output

96
93
96


  不小心水了一个单调栈过了。。(维护单调性二分)

  CLJ高级做法:http://wjmzbmr.com/archives/jsoi2008_maximum_number_maxnumber_of/  

  

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5
 6 #define maxn 200001
 7
 8 typedef long long ll;
 9
10 using namespace std;
11
12 struct node{
13     ll c;
14     int pos;
15 }sta[maxn];
16
17 ll top=0;
18
19 inline ll in()
20 {
21     ll x=0;char ch=getchar();
22     while(ch<‘0‘||ch>‘9‘)ch=getchar();
23     while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar();
24     return x;
25 }
26
27 void add(ll num,int pos)
28 {
29     while(sta[top].c<=num&&top!=0)top--;
30     top++;
31     sta[top].c=num,sta[top].pos=pos;
32 }
33
34 ll ask(int r,int pos)
35 {
36     int l=1,an;
37     while(l<=r)
38     {
39         int mid=(l+r)>>1;
40         if(sta[mid].pos>=pos)r=mid-1,an=mid;
41         else l=mid+1;
42     }
43     return sta[an].c;
44 }
45
46 int main()
47 {
48     int n,nownum=0;
49     ll d,num,lastans=0;
50     char sb;
51     n=in(),d=in();
52     for(int i=1;i<=n;i++)
53     {
54         sb=0;
55         while(sb!=‘A‘&&sb!=‘Q‘)sb=getchar();
56         num=in();
57         if(sb==‘Q‘)printf("%lld\n",lastans=ask(top,nownum-num+1));
58         else add((num%d+lastans%d)%d,++nownum);
59     }
60     return 0;
61 }

  ps:最近脑残各种小地方打错。。

  是时候考试开始写对拍了。。

   ps:初赛76简直了。。想想如果不是在HN而是ZJ而搞OI那早就以一种奇怪的方式结束OI生涯了。。而且错的貌似都是OI知识?(指针,容斥,catanlan什么的)。。感觉自己学的还是不是太扎实

时间: 2024-08-06 03:44:35

【单调栈】Bzoj 1012: 最大数maxnumber的相关文章

单调栈 BZOJ1012 [JSOI2008]最大数maxnumber

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

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

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

[BZOJ 1012] 最大数maxnumber

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

[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:

HYSBZ 1012 最大数maxnumber

思路:在单调队列不更新列首,因为查询区间大小不确定,所以不能保证下次是否还用到它 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 222222 #define ll long long int que[N]; ll m,d; ll a[N]; int cnt; char op[2]; int num; int main(){ scanf(&q

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: [JSOI2008]最大数maxnumber 单调栈

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

BZOJ 1012: [JSOI2008]最大数maxnumber 单调队列/线段树/树状数组/乱搞

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

【BZOJ 1012】 [JSOI2008]最大数maxnumber

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