zoukankan      html  css  js  c++  java
  • 洛谷 P1198 [JSOI2008]最大数

    又一道非常简单的线段树入门题
    先看题

    题目描述

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

    输入输出格式

    输入格式:
    第一行两个整数, MM 和 DD ,其中 MM 表示操作的个数 (M le 200,000)(M≤200,000) , DD 如上文中所述,满足 (0<D<2,000,000,000)(0<D<2,000,000,000)
    接下来的 MM 行,每行一个字符串,描述一个具体的操作。语法如上文所述。

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

    输入输出样例

    输入样例#1:
    5 100
    A 96
    Q 1
    A 97
    Q 1
    Q 2

    输出样例#1:
    96
    93
    96

    这道题唯一的特殊性就在于,元素最初未给出,塞进去的元素跟后续运算结果有关,由于元素个数起初也不确定,所以这是唯一特殊的地方
    对于这种特殊,我们的处理方法就是,在建树时,直接将长度尽可能建的大一些,剩下就是纯线段树的模板了

    但是,这道题数据有问题,自己写快读会WA,一定要用scanf

    下放代码

    #include<iostream>
    #include<cstdio>
    #include<cctype>
    #define ll long long
    #define gc() getchar()
    #define maxn 200005
    using namespace std;
    
    int n,m;
    ll a[maxn],q,g;
    inline ll read(){    //朴素的快读
        ll a=0;int f=1;char p=gc();
        while(!isdigit(p)){f|=(p=='-');p=gc();}
        while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
        return a*f;
    }
    
    struct ahaha{
        ll v;
    }t[maxn<<2];
    #define lc p<<1
    #define rc p<<1|1
    inline void pushup(int p){    //朴素的上传
        t[p].v=max(t[lc].v,t[rc].v);
    }
    void build(int p,int l,int r){     //朴素的建树
        if(l==r){t[p].v=-100000000;return;}
        int m=l+r>>1;
        build(lc,l,m);build(rc,m+1,r);
        pushup(p);
    }
    void update(int p,int l,int r,int L,ll z){    //朴素的更新
        if(l>L||r<L)return;
        if(l==r&&r==L){t[p].v=z;return;}
        int m=l+r>>1;
        update(lc,l,m,L,z);update(rc,m+1,r,L,z);
        pushup(p);
    }
    ll query(int p,int l,int r,int L,int R){   //朴素的查询
        if(l>R||r<L)return -100000000;
        if(L<=l&&r<=R)return t[p].v;
        int m=l+r>>1;
        return max(query(lc,l,m,L,R),query(rc,m+1,r,L,R));
    }
    
    inline void solve_1(){
        int x;++n;scanf("%d",&x);
        update(1,1,maxn-5,n,(x+q)%g);    //新的元素取模后塞入即可
    }
    inline void solve_2(){
        int x;scanf("%d",&x);
        if(x==0){printf("0
    ");return;}
        q=query(1,1,maxn-5,n-x+1,n);
        printf("%lld
    ",q);
    }
    
    int main(){
        //m=read();g=read();
        scanf("%d%d",&m,&g);
        build(1,1,maxn-5);
        for(int i=1;i<=m;++i){
            char zz[100];
            scanf("%s",zz);
            switch(zz[0]){
                case 'A':solve_1();break;
                case 'Q':solve_2();break;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    git 删除所有提交下的某个文件
    Sublime Text 中文
    git 常用文件目录介绍
    设计模式之——单例模式
    Mysql系统知识梳理
    Spring系列之——使用了哪些设计模式
    JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱
    集合系列问题
    做一个优秀的职场人才
    Spring系列之——Spring事务以及两大核心IOC和AOP
  • 原文地址:https://www.cnblogs.com/hanruyun/p/9135843.html
Copyright © 2011-2022 走看看