1. 程式人生 > >線段樹——最大數——洛谷——1198

線段樹——最大數——洛谷——1198

while mes 只需要 namespace cst tmp too lines uil

這題可以說是模板題了。

只需要預先開好m大小的線段樹,就好了,這就可以處理加點的問題。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
inline ll read(){
    ll t=1,num=0;char c=getchar();
    while(c>9||c<0){if(c==-)t=-1;c=getchar();}
    while
(c>=0&&c<=9){num=num*10+c-0;c=getchar();} return num*t; } inline ll max(ll a,ll b){return a>b?a:b;} const ll maxn=200010,INF=0x7fffffff; ll m,d,t[maxn*3]; void build(ll ro,ll l,ll r){ if(l==r){t[ro]=0;return;} ll mid=(l+r)>>1; build(ro*2,l,mid);build(ro*2+1,mid+1,r); t[ro]
=max(t[ro*2],t[ro*2+1]); } ll ask(ll ro,ll l,ll r,ll x,ll y){ if(x>r||y<l)return -INF; if(x<=l&&r<=y)return t[ro]; ll mid=(l+r)>>1; return max(ask(ro*2,l,mid,x,y),ask(ro*2+1,mid+1,r,x,y)); } void change(ll ro,ll l,ll r,ll x,ll add){ if(l==r){if(l==x)t[ro]=(t[ro]+add)%d;return
;} ll mid=(l+r)>>1; if(x<=mid)change(ro*2,l,mid,x,add); else change(ro*2+1,mid+1,r,x,add); t[ro]=max(t[ro*2],t[ro*2+1]); } int main() { m=read();d=read(); ll tmp=0,cnt=0;build(1,1,m); for(ll i=1;i<=m;i++){ char c[3];scanf("%s",c); if(c[0]==A){ ll x=read()+tmp; change(1,1,m,++cnt,x); } else{ ll x=read(); tmp=ask(1,1,m,cnt-x+1,cnt); printf("%d\n",tmp); } } return 0; }

然而,我一開始交上去,wa了,too few or too much lines

因為我讀入的時候是getchar讀入字符,快速讀入數字。

改成scanf就AC了。

本文由Yzyet編寫,網址為www.cnblogs.com/Yzyet。非Yzyet同意,禁止轉載,侵權者必究。

線段樹——最大數——洛谷——1198