1. 程式人生 > >2018年6月3號(線段樹(3))

2018年6月3號(線段樹(3))

錯誤 格式 是個 每一個 並且 限制 自己 輸出結果 IT

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

  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\n",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\n",c);
        }

只是把scnaf改成cin得到:

技術分享圖片

舒服,但是不知道為什麽,也許只是個bug,求大佬指教!!!

2018年6月3號(線段樹(3))