【线段树】【JSOI 2008】【bzoj 1012】最大数maxnumber

1012: [JSOI2008]最大数maxnumber

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 5996  Solved: 2589

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

题解:

裸的线段树。不解释。

Code:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 200010
#define root 1,1,200000
#define lch rt<<1,l,mid
#define rch rt<<1|1,mid+1,r

int m,p,num,t,tree[N<<2];

int in(){
    int x=0; char ch=getchar();
    while (ch<‘0‘ || ch>‘9‘) ch=getchar();
    while (ch>=‘0‘ && ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar();
    return x;
}

void change(int rt,int l,int r,int x,int k){
    if (l==r){
        tree[rt]=k;
        return;
    }
    int mid=(l+r)>>1;
    if (x<=mid) change(lch,x,k);
    else change(rch,x,k);
    tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
int query(int rt,int l,int r,int ll,int rr){
    if (ll<=l && r<=rr) return tree[rt];
    int mid=(l+r)>>1,k=0;
    if (ll<=mid) k=max(k,query(lch,ll,rr));
    if (rr>mid) k=max(k,query(rch,ll,rr));
    return k;
}

int main(){
    m=in(),p=in(); num=t=0;

    while (m--){
        char opt=getchar();
        while (opt!=‘A‘ && opt!=‘Q‘) opt=getchar();
        int x=in();
        if (opt==‘A‘){
            x=(x+t)%p; num++;
            change(root,num,x);
        }
        else {
            t=query(root,num-x+1,num);
            printf("%d\n",t);
        }
    }

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 02:37:41

【线段树】【JSOI 2008】【bzoj 1012】最大数maxnumber的相关文章

【单调栈】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最大数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表示操作

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 1568 [JSOI2008]Blue Mary开公司

1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit][Status][Discuss] Description Input 第 一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Blue Mary询问第T天的最大收益. 若单词为Project,则

数据结构(线段树):BZOJ 1103 [POI2007]大都市meg

1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1791  Solved: 925[Submit][Status][Discuss] Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之间有一些双 向的土路.从每个村庄都恰好有一条路径

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 3211】花神游历各国

3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 1508 Solved: 573 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 2 3 1 1 4 Sample Output 101 11 11 HINT 对于100%的数据, n ≤ 100000,m≤200000 ,data[

BZOJ 1012 题解

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