[洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?
其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客
Description
现在请求你维护一个数列,要求提供以下两种操作:
1、 查询操作。
语法:Q L
功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。
限制:L不超过当前数列的长度。(L>=0)
2、 插入操作。
语法:A n
功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。
限制:n是整数(可能为负数)并且在长整范围内。
注意:初始时数列是空的,没有一个数。
Input&Output
Input
第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0<D<2,000,000,000)
接下来的M行,每行一个字符串,描述一个具体的操作。语法如上文所述。
Output
对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。
Sample
Input
5 100
A 96
Q 1
A 97
Q 1
Q 2
Output
96
93
96
Solution
- 本来一开始打的线段树,但洛谷的加强数据T了最后一个点,所以改用了树状数组。因为只在队列末尾插入数据,所以其实线段树有点大材小用了。树状数组可以维护区间最大值,查询时通过不断更新ret即可。
90分线段树(也可能是本蒟蒻太水了):
#include<iostream> #include<cstdio> #include<algorithm> #define maxm 200001 using namespace std; typedef long long ll; struct node{ ll mx; int l,r,lc,rc; node(){ lc=rc=-1; } }tree[maxm<<1]; ll m,d,L,n,sum,t; char c; inline ll rd() { ll x=0;bool f=0; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-')f=1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return f?-x:x; } int cnt; int rt=cnt++; void pushup(int cur) { int lc=tree[cur].lc,rc=tree[cur].rc; tree[cur].mx=max(tree[lc].mx,tree[rc].mx); tree[cur].l=tree[lc].l; tree[cur].r=tree[rc].r; } void build(int l,int r,int cur) { if(l==r){ tree[cur].mx=0; tree[cur].l=tree[cur].r=l; return; } int mid=(l+r)>>1; tree[cur].lc=cnt++; tree[cur].rc=cnt++; build(l,mid,tree[cur].lc); build(mid+1,r,tree[cur].rc); pushup(cur); } void upd(int pos,ll c,int cur) { if(tree[cur].l==tree[cur].r) { tree[cur].mx=c; return; } int mid=(tree[cur].l+tree[cur].r)>>1; if(pos<=mid)upd(pos,c,tree[cur].lc); if(pos>mid)upd(pos,c,tree[cur].rc); pushup(cur); } ll query(int l,int r,int cur) { if(tree[cur].l>=l&&tree[cur].r<=r){ return tree[cur].mx; } int mid=(tree[cur].l+tree[cur].r)>>1; ll mx=0; if(l<=mid)mx=max(mx,query(l,r,tree[cur].lc)); if(r>mid)mx=max(mx,query(l,r,tree[cur].rc)); return mx; } int main() { m=rd(); d=rd(); build(1,200000,rt); for(int i=1;i<=m;++i) { cin>>c; if(c=='Q'){ L=rd(); t=query(sum-L+1,sum,rt); printf("%d\n",t); } else if(c=='A'){ n=rd(); ll tmp=(n%d+t%d)%d; upd(sum+1,tmp,rt); sum++; } } return 0; }树状数组:
#include<iostream> #include<cstdio> #include<algorithm> #define maxn 200005 using namespace std; typedef long long ll; ll mx(ll a,ll b) { return (a>b)?a:b; } inline ll rd() { ll x=0;char c=getchar(); bool f=false; while(c<'0'||c>'9'){ if(c=='-')f=true; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return f?-x:x; } ll b[maxn],d; int sum; int lowbit(int x) { return x&-x; } int add(ll v) { for(int x=sum;x;x-=lowbit(x)) b[x]=mx(b[x],v); } int query(int pos) { ll ans=0; for(int x=sum-pos+1;x<=sum;x+=lowbit(x)) ans=mx(ans,b[x]); return ans; } int main() { int m,p; char q; ll t=0; scanf("%d%lld",&m,&d); for(int i=1;i<=m;++i) { cin>>q; if(q=='A'){ sum++; ll n; scanf("%lld",&n); add((n+t)%d); } else{ scanf("%d",&p); t=query(p); printf("%lld\n",t); } } return 0; }写了快读居然没用上
[洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- 【洛谷4396/BZOJ3236】[AHOI2013]作业(莫队+分块/树状数组/线段树)
题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道 ...
- 洛谷P2880 [USACO07JAN] Balanced Lineup G(树状数组/线段树)
维护区间最值的模板题. 1.树状数组 1 #include<bits/stdc++.h> 2 //树状数组做法 3 using namespace std; 4 const int N=5 ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- 数据结构--树状数组&&线段树--基本操作
随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...
随机推荐
- 笔记:MyBatis 使用 Java API配置
我们已经讨论了各种MyBatis配置元素,如envronments.typeAlias和typeHandlers,以及如何使用XML配置它们.即使你想使用基于JavaAPI的MyBatis配置,MyB ...
- C++模板入门教程(一)——模板概念与基本语法
转载请保留以下声明 作者:赵宗晟 出处:http://www.cnblogs.com/zhao-zongsheng/ 前言 有些人提到C++模板就会下意识地觉得可怕.看不懂.避而远之.其实模板并不复杂 ...
- ASP.NET没有魔法——ASP.NET MVC Razor与View渲染
对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到 ...
- 如何使用maven搭建web项目
博客园注册了有二十多天了,还没有写过博客,今天就发一篇,也便于后面查找笔记. 我个人已经做了几年的java web开发了,由于所在的公司是业务型公司,用的都是一些老旧的稳定技术,很少接触到稍微新点的内 ...
- python web——Django架构
环境:windows/linux/OS 需要的软件:Firefox 浏览器(别的也可以 不过firfox和python的webdriver兼容性好) git版本控制系统(使用前要配置 用户 编辑器可以 ...
- Beta冲刺链接总汇
Beta冲刺 咸鱼 Beta 冲刺day1 Beta 冲刺day2 Beta 冲刺day3 Beta 冲刺day4 Beta 冲刺day5 Beta 冲刺day6 Beta 冲刺day7 凡事预则立- ...
- Alpha第八天
Alpha第八天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...
- 基于Python的Web应用开发实践总结
基于Python的Web应用开发学习总结 项目地址 本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...
- 第二周c语言PTA作业留
6-1 计算两数的和与差(10 分) 本题要求实现一个计算输入的两数的和与差的简单函数. 函数接口定义: void sum_diff( float op1, float op2, float psum ...
- VMware虚拟机误删除vmdk文件后如何恢复?
故障描述: Dell R710系列服务器(用于VMware虚拟主机),Dell MD 3200系列存储(用于存放虚拟机文件),VMware ESXi 5.5版本,因意外断电,导致某台虚拟机不能正常启动 ...