zoukankan      html  css  js  c++  java
  • 【洛谷P1198】最大数

    题目大意:在线维护一个序列,支持插入一个数,查询区间最值。

    题解:直接建立线段树,插入就单点修改,查询就正常查。。orz开始还真没想到。。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=2e5+10;
    const int inf=0x3f3f3f3f;
    
    struct node{
    	#define ls(x) t[x].lc
    	#define rs(x) t[x].rc
    	int lc,rc,mx;
    }t[maxn<<1];
    int tot,root;
    inline void pushup(int o){t[o].mx=max(t[ls(o)].mx,t[rs(o)].mx);}
    int build(int l,int r){
    	int o=++tot;
    	if(l==r){t[o].mx=-inf;return o;}
    	int mid=l+r>>1;
    	ls(o)=build(l,mid),rs(o)=build(mid+1,r);
    	return pushup(o),o;
    }
    void modify(int o,int l,int r,int pos,int val){
    	if(l==r){t[o].mx=val;return;}
    	int mid=l+r>>1;
    	if(pos<=mid)modify(ls(o),l,mid,pos,val);
    	else modify(rs(o),mid+1,r,pos,val);
    	pushup(o);
    }
    int query(int o,int l,int r,int x,int y){
    	if(l==x&&r==y)return t[o].mx;
    	int mid=l+r>>1;
    	if(y<=mid)return query(ls(o),l,mid,x,y);
    	else if(x>mid)return query(rs(o),mid+1,r,x,y);
    	else return max(query(ls(o),l,mid,x,mid),query(rs(o),mid+1,r,mid+1,y));
    }
    
    int q,mod,val,lastans,cnt;
    char s[4];
    
    int main(){
    	scanf("%d%d",&q,&mod);
    	root=build(1,2e5);
    	while(q--){
    		scanf("%s%d",s,&val);
    		if(s[0]=='Q')printf("%d
    ",lastans=query(root,1,2e5,cnt-val+1,cnt));
    		else{
    			val=(val+lastans)%mod,++cnt;
    			modify(root,1,2e5,cnt,val);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    ojdbc15-10.2.0.4.0.jar maven 引用报错 Dependency 'com.oracle:ojdbc15:10.2.0.4.0' not found
    两个js文件之间函数互调问题
    Win10连接远程桌面时提示“您的凭据不工作”
    Examples_08_03
    ant打包命令
    SVN版本日志对话框命令使用指南
    activiti_SpringEnvironment
    shell脚本
    python爬虫
    php正则表达式总结
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10559930.html
Copyright © 2011-2022 走看看