P1198 [JSOI2008]最大數
阿新 • • 發佈:2017-05-11
執行 限制 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]最大數