2 条题解

  • 1
    @ 2023-10-27 8:27:10
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const LL N=2e5;
    LL len=0,mylog[N+5],f[N+5][25];
    void init(){
    	for(LL i=1;i<=N;i++){
    		mylog[i]=log2(i);
    	}
    }
    void insert(LL x){
    	f[++len][0]=x;
    	for(LL j=1;j<=20;j++){
    		if(len-(1<<j)>=0)
    			f[len][j]=max(f[len][j-1],f[len-(1<<(j-1))][j-1]);
    	}
    }
    LL query(LL l,LL r){
    	LL k=mylog[r-l+1];
    	return max(f[l+(1<<k)-1][k],f[r][k]);
    }
    int main(){
    	init();
    	LL n,mod,last=0;
    	scanf("%lld%lld",&n,&mod);
    	for(LL i=1;i<=n;i++){
    		char op[10];LL x;
    		scanf("%s",op+1);
    		if(op[1]=='Q'){
    			scanf("%lld",&x);
    			printf("%lld\n",last=query(len-x+1,len));
    		}
    		if(op[1]=='A'){
    			scanf("%lld",&x);
    			insert((x+last)%mod);
    		}
    	}
    	return 0;
    }
    
    • 0
      @ 2024-4-23 8:24:17

      强制在线,不超过m使用线段树维护。也可以使用rmq简化查询使编码更简化高效。

      1、线段树

      #include<stdio.h>
      #include<iostream>
      #define lson l,mid,rt<<1
      #define rson mid+1,r,rt<<1|1
      #define mid (l+r)/2
      #define debug(x) cout<<#x<<" :"<<x<<endl 
      using namespace std;
      typedef long long ll;
      const int maxn=2e5+10;
      
      int t,x,y,z,n,m;
      int d;
      char s[10];
      int pos[maxn],val[maxn];
      int q[maxn];
      int ans[maxn];
      struct node{
          int tr[maxn<<2],lazy[maxn<<2];
          void pushup(int rt){//由儿子更新到当前父亲节点
              tr[rt]=max(tr[rt<<1],tr[rt<<1|1]);
          }
          void pushdown(int l,int r,int rt){
          }
          void build(int l,int r,int rt){
              if(l==r){
                  return ;
              }
              build(lson);
              build(rson);
              pushup(rt);
          }
          void update(int L,int R,int l,int r,int rt,int val){//更新
              if(L<=l&&r<=R){
              	tr[rt]=val;
              	return ;
      		}
      		if(L<=mid){
      			update(L,R,l,mid,rt<<1,val);
      		}
      		if(R>mid){
      			update(L,R,mid+1,r,rt<<1|1,val);
      		}
              pushup(rt);
          }
          int query(int L,int R,int l,int r,int rt){
              if(L<=l&&r<=R){
        
              	return tr[rt];
      		}
      		int ans=-0x3f3f3f3f;
      		if(L<=mid){
      			ans=max(ans,query(L,R,l,mid,rt<<1));
      		}
      		if(R>mid){
      			ans=max(ans,query(L,R,mid+1,r,rt<<1|1));
      		}
      		pushup(rt);
      		return ans;
          }
          void init(){
              for(int i=1;i<=maxn*4-1;++i){
                  lazy[i]=0;
              }
          }
      }sgt;
      int main(){
      
      
          while(~scanf("%d %d",&m,&d)){
      		t=0;
      		int sum=0;//almost m number 
      		for(int i=1;i<=m;++i){
      			scanf("%s %d",s,&n);
      			if(s[0]=='A'){//add a value to the end
      				n=(n+t)%d;
      				if(n<0){
      					n+=d;
      					n%=d;
      				}
      				sum++;
      				sgt.update(sum,sum,1,m,1,n);
      			}
      			else if(s[0]=='Q'){
      
      				int ans=sgt.query(sum-n+1,sum,1,m,1);
      				printf("%d\n",ans);
      				t=ans; 
      			}
      		}
      	}
        
          return 0;
      }
      
      
      • 1

      信息

      ID
      1012
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      递交数
      73
      已通过
      39
      上传者