线段树——最大数——洛谷——1198

这题可以说是模板题了。

只需要预先开好m大小的线段树,就好了,这就可以处理加点的问题。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
inline ll read(){
    ll t=1,num=0;char c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
    return num*t;
}
inline ll max(ll a,ll b){return a>b?a:b;}
const ll maxn=200010,INF=0x7fffffff;
ll m,d,t[maxn*3];
void build(ll ro,ll l,ll r){
    if(l==r){t[ro]=0;return;}
    ll mid=(l+r)>>1;
    build(ro*2,l,mid);build(ro*2+1,mid+1,r);
    t[ro]=max(t[ro*2],t[ro*2+1]);
}
ll ask(ll ro,ll l,ll r,ll x,ll y){
    if(x>r||y<l)return -INF;
    if(x<=l&&r<=y)return t[ro];
    ll mid=(l+r)>>1;
    return max(ask(ro*2,l,mid,x,y),ask(ro*2+1,mid+1,r,x,y));
}
void change(ll ro,ll l,ll r,ll x,ll add){
    if(l==r){if(l==x)t[ro]=(t[ro]+add)%d;return;}
    ll mid=(l+r)>>1;
    if(x<=mid)change(ro*2,l,mid,x,add);
    else change(ro*2+1,mid+1,r,x,add);
    t[ro]=max(t[ro*2],t[ro*2+1]);
}
int main()
{
    m=read();d=read();
    ll tmp=0,cnt=0;build(1,1,m);
    for(ll i=1;i<=m;i++){
        char c[3];scanf("%s",c);
        if(c[0]==‘A‘){
            ll x=read()+tmp;
            change(1,1,m,++cnt,x);
        }
        else{
            ll x=read();
            tmp=ask(1,1,m,cnt-x+1,cnt);
            printf("%d\n",tmp);
        }
    }
    return 0;
}

然而,我一开始交上去,wa了,too few or too much lines

因为我读入的时候是getchar读入字符,快速读入数字。

改成scanf就AC了。

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

时间: 2024-10-24 21:46:45

线段树——最大数——洛谷——1198的相关文章

线段树——忠诚——洛谷——1816

本次的目的主要在于练一练线段树的模板. 这题做法颇多,可以RMQ也可以线段树 #include<iostream> #include<cstdio> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();} while(c>='0'&&c<='9'){num=n

【模板】线段树 1(洛谷_3372)

这题的做法就像题目说的那样. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long inline ll read(){ ll t=1,num=0;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar(

AC日记——最大数 洛谷 P1198 [JSOI2008]

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

洛谷P3372 【模板】线段树 1

P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷评测机出问题了吗? 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接

20190729 线段树

线段树真是一个很重要很重要的数据结构!!! 一.概念 线段树是一棵二叉树,每个节点维护序列的一段区间 二.复杂度 o(nlogn) 开数组一般要开四倍空间 三.相关量 儿子:除了叶子节点,每个节点都有左儿子和右儿子 左儿子:左儿子的节点编号是父节点的两倍2 * ro,对应父节点左一半区间[l,mid] 右儿子:右儿子的节点编号是父节点的二倍加一2 * ro + 1,对应父节点右一半区间[mid + 1,r] 四.一些操作 1.建树o(n) 我比较喜欢用结构体存每个节点的信息 struct nod

[洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?

其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度.(L>=0) 2. 插入操作. 语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾. 限制:n是整数(可能为负数)并且在长整

二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)

在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即对于每份

洛谷P1531 I Hate It 线段树

洛谷P1531 I Hate It 线段树 单点修改 区间求最大 1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using

洛谷1558 色板游戏 线段树

我先立个Flag 我,这几天,要过1W道线段树题. 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C.2. "P A B" 指老师的提问:A到 B号方格中有几种颜色.学校的颜料盒中一共有 T 种颜料.为简便起见,我