分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

bzoj 1012 [JSOI2008]最大数maxnumber ?????线段树

发布时间:2023-09-06 02:28责任编辑:沈小雨关键词:暂无标签

题意:

现在请求你维护一个数列,要求提供以下两种操作:

1、 查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。

2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。

注意:初始时数列是空的,没有一个数

题解:

直接上线段树即可,记录一下我的新线段树基础板子

#include <iostream>#include <vector>>#define endl ‘\n‘#define ll long longusing namespace std;struct segnode {int l,r;ll mx;int mid(){return (r+l)>>1;}int len(){return r-l+1;}bool cover(int s,int t){return s<=l&&t>=r;}bool cross(int s,int t){return !(t<l||s>r);}};struct segtree{#define nd ?seg[now]#define ndl seg[now<<1]#define ndr seg[now<<1|1] vector<segnode> seg;segtree(int n){seg.resize((n<<2)+10); maketree(1,n);}void pushup(int now){nd.mx=max(ndl.mx,ndr.mx);}void maketree(int s,int t,int now=1){nd={s,t,0};if(s==t) return ;maketree(s,nd.mid(),now<<1); maketree(nd.mid()+1,t,now<<1|1);}void update(int pos,ll x,int now=1){if(!nd.cross(pos,pos)) return;if(nd.len()==1){nd.mx=x; return;}update(pos,x,now<<1); update(pos,x,now<<1|1);pushup(now);}ll query(int s,int t,int now=1){if(!nd.cross(s,t)) return 0;if(nd.cover(s,t)) return nd.mx;return max(query(s,t,now<<1),query(s,t,now<<1|1));}};int main() {ios::sync_with_stdio(false);cin.tie(0);ll n,m; ???????cin>>n>>m; ???????segtree tree(n);int len=0,k=n;string s;ll x,last=0;while(k--){cin>>s>>x;if(s[0]==‘Q‘)cout<<(last=tree.query(len-x+1,len))<<endl;else tree.update(++len,(last+x)%m);}return 0;}

  

bzoj 1012 [JSOI2008]最大数maxnumber ?????线段树

原文地址:https://www.cnblogs.com/nervendnig/p/10211647.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved