1. 程式人生 > >P1198 [JSOI2008]最大數

P1198 [JSOI2008]最大數

執行 限制 bsp 答案 turn 一行 其中 span ont

題目描述

現在請求你維護一個數列,要求提供以下兩種操作:

1、 查詢操作。

語法:Q L

功能:查詢當前數列中末尾L個數中的最大的數,並輸出這個數的值。

限制:L不超過當前數列的長度。

2、 插入操作。

語法:A n

功能:將n加上t,其中t是最近一次查詢操作的答案(如果還未執行過查詢操作,則t=0),並將所得結果對一個固定的常數D取模,將所得答案插入到數列的末尾。

限制:n是整數(可能為負數)並且在長整範圍內。

註意:初始時數列是空的,沒有一個數。

輸入輸出格式

輸入格式:

第一行兩個整數,M和D,其中M表示操作的個數(M <= 200,000),D如上文中所述,滿足(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]

思路的話。

首先沖著最大值

建一顆空樹

然後加入就是單點修改

查詢就是插後面的m位。。。。

但是這題在洛谷上AC

在COGS上爆零

-.-

還有就是不能開讀入優化

 1 #include<iostream>
 2
#include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #define lglg long long int 6 using namespace std; 7 const int n=200001; 8 lglg mod,m; 9 struct node 10 { 11 lglg l,r,w; 12 }tree[n*4]; 13 lglg num=1; 14 lglg last=0; 15 lglg ans=-1; 16 void updata(int k)
17 { 18 tree[k].w=max(tree[k*2].w,tree[k*2+1].w); 19 } 20 void build(int ll,int rr,int k) 21 { 22 tree[k].l=ll;tree[k].r=rr; 23 if(tree[k].l==tree[k].r) 24 { 25 tree[k].w=0; 26 return ; 27 } 28 int m=(ll+rr)/2; 29 build(ll,m,k*2); 30 build(m+1,rr,k*2+1); 31 updata(k); 32 } 33 int read(lglg &x) 34 { 35 int flag=0; 36 char c=getchar();x=0; 37 if(c==-)flag=1; 38 while(c<0||c>9)c=getchar(); 39 while(c>=0&&c<=9)x=x*10+c-48,c=getchar(); 40 return flag==1?x=-x:x; 41 } 42 void point_add(int where,int p,int k) 43 { 44 if(tree[k].l==tree[k].r) 45 { 46 tree[k].w=p; 47 return ; 48 } 49 int m=(tree[k].l+tree[k].r)/2; 50 if(where<=m) 51 point_add(where,p,k*2); 52 else 53 point_add(where,p,k*2+1); 54 updata(k); 55 } 56 void interval_ask(int ll,int rr,int k) 57 { 58 if(ll<=tree[k].l&&rr>=tree[k].r) 59 { 60 if(ans<tree[k].w)ans=tree[k].w; 61 return ; 62 } 63 int m=(tree[k].l+tree[k].r)/2; 64 if(ll<=m) 65 interval_ask(ll,rr,k*2); 66 if(rr>=m+1) 67 interval_ask(ll,rr,k*2+1); 68 } 69 int main() 70 { 71 //read(m);read(mod); 72 cin>>m>>mod; 73 build(1,n,1); 74 for(int i=1;i<=m;i++) 75 { 76 char c; 77 cin>>c; 78 if(c==A) 79 { 80 lglg p; 81 //read(p); 82 cin>>p; 83 p=(p+last)%mod; 84 point_add(num++,p,1); 85 } 86 else 87 { 88 lglg p; 89 ans=-1; 90 //read(p); 91 cin>>p; 92 interval_ask(num-p,num-1,1); 93 last=ans%mod; 94 printf("%lld\n",ans); 95 } 96 } 97 return 0; 98 }

P1198 [JSOI2008]最大數