2016夏季练习——线段树
2016-07-19 11:22
357 查看
来源:BZOJ1012
BZOJ竟然用cout会RE。。。。
很简单的线段树
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int m,MOD,pre,cnt;
const int INF = 0x7fffffff;
struct Tree{
int l,r;
int d;
};
Tree tree[800005];
void build(int rt,int left,int right){
tree[rt].l=left;
tree[rt].r=right;
tree[rt].d=-INF;
if(left==right) return ;
int mid=(left+right)>>1;
build(rt<<1,left,mid);
build(rt<<1|1,mid+1,right);
}
void update(int rt,int left,int data){
int l=tree[rt].l;
int r=tree[rt].r;
if(l==r){
tree[rt].d=data;
return ;
}
int mid=(l+r)>>1;
if(left<=mid) update(rt<<1,left,data);
else update(rt<<1|1,left,data);
tree[rt].d=max(tree[rt<<1].d,tree[rt<<1|1].d);
}
int query(int rt,int left,int right){
int l=tree[rt].l;
int r=tree[rt].r;
if(left==l&&r==right){
return tree[rt].d;
}
int mid=(l+r)>>1;
if(right<=mid) return query(rt<<1,left,right);
else if(left>mid) return query(rt<<1|1,left,right);
else return max(query(rt<<1,left,mid),query(rt<<1|1,mid+1,right));
}
int main(){
scanf("%d%d",&m,&MOD);
build(1,1,m);
for(int i=0;i<m;i++){
char ch[5];
scanf("%s",&ch);
if(ch[0]=='A'){
cnt++;
int x;
scanf("%d",&x);
x=(x+pre)%MOD;
update(1,cnt,x);
}
else{
int x;
scanf("%d",&x);
pre=query(1,cnt-x+1,cnt);
printf("%d\n",pre);
}
}
return 0;
}
BZOJ竟然用cout会RE。。。。
很简单的线段树
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int m,MOD,pre,cnt;
const int INF = 0x7fffffff;
struct Tree{
int l,r;
int d;
};
Tree tree[800005];
void build(int rt,int left,int right){
tree[rt].l=left;
tree[rt].r=right;
tree[rt].d=-INF;
if(left==right) return ;
int mid=(left+right)>>1;
build(rt<<1,left,mid);
build(rt<<1|1,mid+1,right);
}
void update(int rt,int left,int data){
int l=tree[rt].l;
int r=tree[rt].r;
if(l==r){
tree[rt].d=data;
return ;
}
int mid=(l+r)>>1;
if(left<=mid) update(rt<<1,left,data);
else update(rt<<1|1,left,data);
tree[rt].d=max(tree[rt<<1].d,tree[rt<<1|1].d);
}
int query(int rt,int left,int right){
int l=tree[rt].l;
int r=tree[rt].r;
if(left==l&&r==right){
return tree[rt].d;
}
int mid=(l+r)>>1;
if(right<=mid) return query(rt<<1,left,right);
else if(left>mid) return query(rt<<1|1,left,right);
else return max(query(rt<<1,left,mid),query(rt<<1|1,mid+1,right));
}
int main(){
scanf("%d%d",&m,&MOD);
build(1,1,m);
for(int i=0;i<m;i++){
char ch[5];
scanf("%s",&ch);
if(ch[0]=='A'){
cnt++;
int x;
scanf("%d",&x);
x=(x+pre)%MOD;
update(1,cnt,x);
}
else{
int x;
scanf("%d",&x);
pre=query(1,cnt-x+1,cnt);
printf("%d\n",pre);
}
}
return 0;
}
相关文章推荐
- Javascript 使用小案例
- 纯代码适配优化方案之一(内联函数的使用)
- 【MongoDB】MongoDB VS SQL数据库
- 解决网页元素无法定位(NoSuchElementException: Unable to locate element)的几种方法
- Shell学习之路和我发布过的Shell脚本博文
- jquery sortable实现table拖拽排序,更新时只更新受影响的行
- Jquery 常用的 选择器 归纳
- 抽象类和接口的区别
- java实现微信公众号支付
- 启动Tomcat服务报错,端口被占用解决方案
- 2016年国内开源maven镜像站点汇总
- 学习Hadoop整体理解
- php 取某一日期的前一天
- 新手安装ubuntu系统
- http://www.zhiguoguo.com/ 商标 知果果 问问,免费注册
- dz论坛修改用户信息-dz第三方修改论坛用户密码
- node版本问题过低
- js组件化 2 拖拽
- Maximal Rectangle
- SLF4J-jar包多绑定冲突解决