2018年6月3號(線段樹(3))
阿新 • • 發佈:2018-06-04
錯誤 格式 是個 每一個 並且 限制 自己 輸出結果 IT
今天想分享一下一道題的心得:
P1198 [JSOI2008]最大數
題目描述
現在請求你維護一個數列,要求提供以下兩種操作:
1、 查詢操作。
語法:Q L
功能:查詢當前數列中末尾L個數中的最大的數,並輸出這個數的值。
限制: LL 不超過當前數列的長度。 (L \ge 0)(L≥0)
2、 插入操作。
語法:A n
功能:將 n 加上 tt ,其中 tt 是最近一次查詢操作的答案(如果還未執行過查詢操作,則 t=0t=0 ),並將所得結果對一個固定的常數 D 取模,將所得答案插入到數列的末尾。
限制: n 是整數(可能為負數)並且在長整範圍內。
註意:初始時數列是空的,沒有一個數。
輸入輸出格式
輸入格式:
第一行兩個整數, 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這道題想一下應該能想到線段樹,同時題目也很好理解: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))