分享web开发知识

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

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

P1198 [JSOI2008]最大数 - 线段树

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

传送门

思路:操作数M<=200000,假设每次都是插入,那么得到的序列长度也不会超过200000,考虑对区间[1,m]建一棵线段树,然后就是板子题了。

AC Code:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=200000+100;typedef long long ll;int tot;struct node{ ???int l,r; ???ll maxx;}tr[N<<2];void updata(int u){ ???tr[u].maxx=max(tr[u<<1].maxx,tr[u<<1|1].maxx);}void build(int u,int l,int r){ ???tr[u].l=l,tr[u].r=r; ???if(l==r){ ???????tr[u].maxx=0;return ; ???} ???int mid=(l+r)>>1; ???build(u<<1,l,mid);build(u<<1|1,mid+1,r); ???updata(u);}void modify(int u,int p,ll k){ ???int l=tr[u].l,r=tr[u].r; ???if(l==r){ ???????tr[u].maxx=k;return ; ???} ???int mid=(l+r)>>1; ???if(p<=mid) modify(u<<1,p,k); ???else modify(u<<1|1,p,k); ???updata(u);}ll query(int u,int ql,int qr){ ???ll ans=-(1<<30); ???int l=tr[u].l,r=tr[u].r; ???if(ql<=l&&qr>=r) return tr[u].maxx; ???if(ql>r||qr<l) return -(1<<30); ???int mid=(l+r)>>1; ???if(ql<=mid) ans=max(ans,query(u<<1,ql,qr)); ???if(qr>mid) ans=max(ans,query(u<<1|1,ql,qr)); ???return ans;} ?int main(){ ???int m; ???ll d; ???scanf("%d%lld",&m,&d); ???build(1,1,m); ???char op[3];ll t=0; ???for(int i=1;i<=m;i++){ ???????scanf("%s",op); ???????if(op[0]==‘A‘){ ????????????ll n;scanf("%lld",&n); ????????????n=(n+t)%d; ????????????tot++; ????????????modify(1,tot,n); ???????} ???????else if(op[0]==‘Q‘){ ???????????int l;scanf("%d",&l); ???????????int r=tot;l=tot-l+1; ???????????t=query(1,l,r); ???????????printf("%lld\n",t); ???????} ???} ???return 0;}

P1198 [JSOI2008]最大数 - 线段树

原文地址:https://www.cnblogs.com/Loi-Brilliant/p/9460941.html

知识推荐

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