1012: [JSOI2008]最大数maxnumber 线段树区间统计

本文详细介绍了如何使用线段树解决特定类型的问题,并提供了一个具体的实现案例。文章中包括了线段树的基本概念、更新与查询操作的具体实现,以及如何在实际编程中应用这些技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题用线段树即可AC主要是建树的时候有点难想,因为每次元素都放在最后所以我们可以每次插入时update一次。

#include <iostream>  
#include <cstring>  
#include <cstdio>  
#include <algorithm>  
#include <cstdlib>  
#include <ctime>  
#include <vector>  
#include <map>  
#define MAXN 200005  

using namespace std;
#define lson l, m ,rt<<1
#define rson m+1, r ,rt<<1|1
#define maxn 210000
int num[maxn*4];
int mod,n;
void pushup(int rt)
{
    num[rt]=max(num[rt<<1],num[(rt<<1)|1]);
}
void update(int goal,int val,int l,int r,int rt)
{
    if(l==r)
    {
        num[rt]=val;
        return;
    }
    int m=(l+r)>>1;
    if(m>=goal)
    {
        update(goal,val,lson);
    }
    else
    {
        update(goal,val,rson);
    }
    pushup(rt);
}
int query(int x,int y,int l,int r,int rt)
{
    if(x<=l && r<=y )
    {
        return num[rt];
    }
    int tmp=0;
    int m=(l+r)>>1;
    if(x<=m)
    {
        tmp=max(tmp,query(x,y,lson));
    }
    if(y>m)
    {
        tmp=max(tmp,query(x,y,rson));
    }
    return tmp;
}
int main()
{
    scanf("%d%d",&n,&mod);
    char st[10];
    int tmp=n;
    int len=0;
    int x,last=0;
    for(int i=1;i<=tmp;i++)
    {
        scanf("%s%d",st,&x);
        if(st[0]=='A')
        {
            len=len+1;
            update(len,(x+last)%mod,1,n,1);
        }
        else
        {
            last=query(len-x+1,len,1,n,1);
            printf("%d\n",last);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值