• 洛谷 P1198 [JSOI2008]最大数


    题目原网址:https://www.luogu.org/problemnew/show/P1198

    题目描述

    现在请求你维护一个数列,要求提供以下两种操作:

    1、 查询操作。

    语法:Q L

    功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。

    限制:L不超过当前数列的长度。(L > 0)

    2、 插入操作。

    语法:A n

    功能:将n加上t,其中tt是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。

    限制:n是整数(可能为负数)并且在长整范围内。

    注意:初始时数列是空的,没有一个数。

    输入输出格式

    输入格式:

    第一行两个整数,MD,其中MM表示操作的个数(M200,000),DD如上文中所述,满足(0<D<2,000,000,000)

    接下来的M行,每行一个字符串,描述一个具体的操作。语法如上文所述。

    输出格式:

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

    输入输出样例

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

    说明

    [JSOI2008]

    本题数据已加强

    解题思路:

    一道线段树的题目,只不过这道题比较特殊,这道题的线段树只需要修改和查询操作.(所以根本不需要考虑lazy标记和建树)

    AC代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 const long long inf = -(1<<62);
     4 
     5 using namespace std;
     6 
     7 int m,d,a[800004],cnt;
     8 long long t;
     9 char pp[2];
    10 
    11 void add(int s,int l,int r,int len,int h) {
    12     if(l == r) {
    13         a[h] = len;
    14         return ;
    15     }
    16     int mid = (l + r) >> 1;
    17     if(mid >= s) add(s,l,mid,len,h * 2);
    18     if(mid < s) add(s,mid + 1,r,len,h * 2 + 1);
    19     a[h] = max(a[h*2],a[h*2+1])%d;
    20 }
    21 
    22 long long query(int l,int r,int h,int ll,int rr) {
    23     if(l <= ll && r >= rr) return a[h];
    24     int mid = (ll + rr) >> 1;
    25     long long max1 = inf,max2 = inf;
    26     if(l <= mid) max1 = query(l,r,h << 1,ll,mid);
    27     if(r > mid) max2 = query(l,r,h << 1 | 1,mid + 1,rr);
    28     return max(max1,max2);
    29 }
    30 
    31 int main() {
    32     scanf("%d%d",&m,&d);
    33     for(int i = 1;i <= m; i++) {
    34         scanf("%s",pp);
    35         if(pp[0] == 'A') {
    36             int k;
    37             scanf("%d",&k);
    38             add(++cnt,1,m,(k + t) % d,1);
    39         }
    40         if(pp[0] == 'Q') {
    41             int L;
    42             scanf("%d",&L);
    43             if(L == 0) t = 0;
    44             else t = query(cnt - L + 1,cnt,1,1,m) % d;
    45             printf("%lld
    ",t);
    46         }
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    Spider爬虫清洗数据(re方法)
    Python 操作 mongodb 数据库
    python操作mysql数据库
    BeautifulSoup高级应用 之 CSS selectors /CSS 选择器
    mongoDB在centos7上的安装
    CentOS7安装mongoDB数据库
    [洛谷P4602] CTSC2018 混合果汁
    [洛谷P2605] ZJOI2016 基站选址
    [CF1039D] You Are Given a Tree
    [CF1105E] Helping Hiaset
  • 原文地址:https://www.cnblogs.com/lipeiyi520/p/10883791.html
Copyright © 2020-2023  润新知