• 2018年6月3号(线段树(3))


      今天想分享一下一道题的心得:

      P1198 [JSOI2008]最大数

      题目描述

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

    1、 查询操作。

    语法:Q L

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

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

    2、 插入操作。

    语法:A n

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

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

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

    输入输出格式

    输入格式:

    第一行两个整数, MM 和 DD ,其中 MM 表示操作的个数 (M le 200,000)(M200,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
    这道题想一下应该能想到线段树,同时题目也很好理解:A带个数字n:表示n加上之前的计算出的答案插入到树中;
    Q带个数字L表示将树的末尾几个取最大值输出;看似(搜易贼
    对于大佬们都是简单的,但是我为了这道题改了3个小时:
    我只想分享自己易错的地方:
    1.错误

    一开始过样例,只得到这个答案:心态崩溃;

    可是为什么,我也不知道,最后找到老师,才搞清楚输入问题:

    错误输入:

    1 scanf("%c%d",&ch,&l);//输入问题
    2         if(ch=='A') 
    3         add(1,++cnt,(l+ask(1,cnt-l+1,cnt))%m);
    4         else
    5         printf("%lld
    ",ask(1,cnt-l+1,cnt));

    更改:

    cin>>ch>>l;
            if(ch=='A')
            add(1,++cnt,(l+c)%n);
            else
            {
                c=ask(1,cnt-l+1,cnt);
                printf("%d
    ",c);
            }

    只是把scnaf改成cin得到:

    舒服,但是不知道为什么,也许只是个bug,求大佬指教!!!

  • 相关阅读:
    LeetCode 345. Reverse Vowels of a String 题解
    LeetCode 344. Reverse String 题解
    LeetCode 27. Remove Element 题解
    LeetCode 61. Rotate List 题解
    LeetCode 19.Remove Nth Node From End of List 题解
    Android耗电量
    Android 使用adb查看和修改电池信息
    Android AOP AspectJ 插桩
    Flask相关用法
    Monkey日志信息的11种Event percentage
  • 原文地址:https://www.cnblogs.com/zssmg/p/9130982.html
Copyright © 2020-2023  润新知