标签:队列 getchar one 个数 lib efi main 还需 --
题目大意:
一个空队列,两种操作
1.查询数列内末尾l个数的最大值
2.每次在数列末尾插入一个数,该数为输入的数和上一次查询的值之和对固定常数取模
思路:
很明显线段树
维护一个就好了
中间写错好多次
还需多练
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstdlib> 6 #include<cstring> 7 #include<vector> 8 #include<queue> 9 #define ll long long 10 #define MAXN 801010 11 #define inf 2147483611 12 using namespace std; 13 ll read() 14 { 15 ll x=0,f=1; 16 char ch=getchar(); 17 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘) f=-1;ch=getchar();} 18 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 19 return x*f; 20 } 21 struct data 22 { 23 ll k,l,r,maxn; 24 }tr[MAXN]; 25 ll n,mod,len,t; 26 void build(ll k,ll l,ll r) 27 { 28 if(l==r) {tr[k].l=tr[k].r=r;tr[k].maxn=-inf;return;} 29 ll m=(l+r)>>1; 30 tr[k].l=l;tr[k].r=r; 31 tr[k].maxn=-inf; 32 build(k<<1,l,m); 33 build(k<<1|1,m+1,r); 34 } 35 void add(ll k,ll pos,ll a) 36 { 37 ll l=tr[k].l,r=tr[k].r; 38 if(l==r) {tr[k].maxn=a;return ;} 39 ll m=(l+r)>>1; 40 if(pos<=m) add(k<<1,pos,a); 41 else add(k<<1|1,pos,a); 42 tr[k].maxn=max(tr[k<<1].maxn,tr[k<<1|1].maxn); 43 } 44 ll query(ll k,ll a,ll b) 45 { 46 ll l=tr[k].l,r=tr[k].r; 47 if(l==a&&r==b) return tr[k].maxn; 48 ll m=(l+r)>>1; 49 if(b<=m) return query(k<<1,a,b); 50 else if(a>m) return query(k<<1|1,a,b); 51 else return max(query(k<<1,a,m),query(k<<1|1,m+1,b)); 52 } 53 int main() 54 { 55 n=read();mod=read(); 56 char ch[5];ll a; 57 build(1,1,n); 58 len=t=0; 59 while(n--) 60 { 61 scanf("%s",ch); 62 a=read(); 63 if(ch[0]==‘A‘) {len++;add(1,len,(a+t)%mod);} 64 if(ch[0]==‘Q‘) 65 { 66 t=query(1,len-a+1,len); 67 printf("%lld\n",t); 68 } 69 } 70 }
标签:队列 getchar one 个数 lib efi main 还需 --
原文地址:http://www.cnblogs.com/yyc-jack-0920/p/7615783.html