洛谷P1198最大数

Posted 那一抹落日的橙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P1198最大数相关的知识,希望对你有一定的参考价值。

这个题最大的难点在于插入,实际上我们可以假设这是一棵早就建好的线段树,插入只是单点赋值而已

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long lo;
lo m,d,t,tail,x;
char s;
struct in
{
    lo l,r,mx;
}ter[800080];
inline void build(lo l,lo r,lo w)//我们可以把它看做这是一棵有m个点的线段树,那么只要支持单点修改和区间查询即可 
{
    ter[w].l=l,ter[w].r=r,ter[w].mx=0;
    if(l==r)
        return;
    lo mid=l+r>>1;
    build(l,mid,w<<1),build(mid+1,r,w<<1|1);
}
inline void up(lo w)
{
    ter[w].mx=max(ter[w<<1].mx,ter[w<<1|1].mx);
}
void add(lo l,lo z,lo n,lo w)
{
    if(ter[w].l==ter[w].r&&ter[w].l==l)
    {
        ter[w].mx=(z+n)%d;return;//单点赋值 
    }
    lo mid=ter[w].l+ter[w].r>>1;
    if(l<=mid)
        add(l,z,n,w<<1);
    else
        add(l,z,n,w<<1|1);
    up(w);
}
lo ask(lo l,lo r,lo w)
{
    if(ter[w].l==l&&ter[w].r==r)
        return ter[w].mx;
    lo mid=ter[w].l+ter[w].r>>1;
    if(r<=mid)
        return ask(l,r,w<<1);
    else if(l>mid)
        return ask(l,r,w<<1|1);
    else
        return max(ask(l,mid,w<<1),ask(mid+1,r,w<<1|1));
}
int main()
{
    scanf("%lld%lld",&m,&d);
    build(1,m,1);
    for(int i=1;i<=m;i++)
    {
        cin>>s>>x;
        if(s==A)
            add(++tail,t,x,1); 
        else
        {
            t=ask(tail-x+1,tail,1);printf("%lld\n",t);
        }//需要记录下有用的区间右端点和上次所查询的答案 
    }
}

 

以上是关于洛谷P1198最大数的主要内容,如果未能解决你的问题,请参考以下文章

洛谷P1198 [JSOI2008]最大数

洛谷P1198最大数

洛谷 P1198 [JSOI2008]最大数

洛谷P1198 [JSOI2008]最大数

洛谷 P1198 [JSOI2008]最大数

BZOJ——1012: [JSOI2008]最大数maxnumber || 洛谷—— P1198 [JSOI2008]最大数