[洛谷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 ...
随机推荐
- AvalonJS前端开发源码
avBody = avalon.define("avBody", function (vm) { vm.Address = "";//地址 vm.BrandMo ...
- 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt
首先,大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 . 这篇文章介绍了Windows中GUI自动化的三种技术:Windows API, MSAA - Microsoft Ac ...
- Cesium剖面分析
- vue小demo易错点总结
1.在使用<transiton>添加过渡效果时,对应的标签需使用<router-link>,否则,transition不会达到应有的效果. 2.在路由文件里获取根实例时,需通过 ...
- CSS(CSS3)选择器(1)
这篇文章主要用于存储CSS以及CSS3的选择器部分知识,以便日后查阅及记忆. 该内容分为两部分,第一部分为css选择器的一些基本知识.第二部分为CSS3新增加的选择器. 在开始之前,先简单介绍一下选择 ...
- 1. 初识 Lucene
在学习Lucene之前呢,我们当然首先要了解下什么是Lucene. 0x01 什么是Lucene ? Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供. Lu ...
- DB2开发系列之四——触发器
1.触发器类型 1)BEFORE 触发器:在对表插入或更新之前执行该触发器,允许使用CALL 和 SIGNAL SQL 语句: 2)BEFORE DELETE 触发器:在删除操作之前执行该触发器: 3 ...
- springboot集成mybatisplus
介绍: Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生.(摘自mybatis-plus官网)Mybati ...
- Linux 终端 Bash 常用快捷键介绍及经验
1. 最重要的自动补全 命令 解释 Tab 自动补全 不用多说,自动补全可以节省大量时间 2. 编辑跳转 命令 解释 Ctrl + A 跳转到当前行首 Ctrl + E 跳转到当前行末 Alt + F ...
- C语言程序设计课程总结
第一次教授C语言程序设计课程,相比计算机组成原理.arm体系结构等偏向硬件的课程,C的教学方式要灵活一些.计算机组成原理课程偏向理论,哈尔滨工业大学的计算机组成原理是国家精品课,增加了mooc+spo ...