COJ 0358 xjr考考你数据结构(根号3)线段树区间修改
| xjr考考你数据结构(根号3) |
| 难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
|
试题描述
|
|
请你编写一个数据结构,完成以下功能: 1)求出第L个到第R个数中的最大、最小值以及连续和。 2)将第addL到addR个数改成v。 |
|
输入
|
|
第一行:n,表示数的个数
第二行:空格分开每个数Ai 第三行:Q,表示操作数目 后Q行:先输入一个字母, 若字母为“Q”则后面跟上两个数,分别为L与R 若字母为“C”则后面跟上三个数,分别为addL,addR与v |
|
输出
|
|
若干行,按顺序针对每个查询(Q)操作分别输出最大、最小值以及连续和。每行遵守以下格式(行末无空格):
MaxNum: 整数, MinNum: 整数, Sum: 整数 |
|
输入示例
|
|
5
1 2 3 4 5 3 Q 1 4 C 3 3 5 Q 1 5 |
|
输出示例
|
|
MaxNum: 4, MinNum: 1, Sum: 10
MaxNum: 5, MinNum: 1, Sum: 17 |
|
其他说明
|
|
0 < n, q < 100001
0 < Ai < 2001 0 < L, R < n + 1 |
题解:线段树大水题
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>
#define PAU putchar(' ')
#define ENT putchar('\n')
#define CH for(int d=0;d<=1;d++) if(ch[d])
using namespace std;
const int maxn=+,maxnode=+,inf=-1u>>;
struct node{
node*ch[];int mi,mx,sm,add,set,siz;node(){mi=inf;mx=-inf;sm=;set=inf;}
void sett(int tag){mi=mx=set=tag;sm=tag*siz;return;}
void down(){
if(set!=inf){CH{ch[d]->sett(set);}set=inf;}
return;
}
void update(){
mi=inf;mx=-inf;sm=;
CH{mi=min(mi,ch[d]->mi);mx=max(mx,ch[d]->mx);sm+=ch[d]->sm;}
return;
}
}seg[maxnode],*nodecnt=seg,*root;
int A[maxn],ql,qr,cv,tp;
void build(node*&x,int L,int R){
x=nodecnt++;
if(L==R) x->mi=x->mx=x->sm=A[L];
else{
int M=L+R>>;
build(x->ch[],L,M);
build(x->ch[],M+,R);
x->update();
} x->siz=R-L+;return;
}
void update(node*&x,int L,int R){
if(ql<=L&&R<=qr) x->sett(cv);
else{
int M=L+R>>;
x->down();
if(ql<=M) update(x->ch[],L,M);
if(qr>M) update(x->ch[],M+,R);
x->update();
}
return;
}
int _mi,_mx,_sm;
void query(node*x,int L,int R){
if(ql<=L&&R<=qr){
_mi=min(_mi,x->mi);
_mx=max(_mx,x->mx);
_sm+=x->sm;
}
else{
int M=L+R>>;
x->down();
if(ql<=M) query(x->ch[],L,M);
if(qr>M) query(x->ch[],M+,R);
} return;
}
inline int read(){
int x=,sig=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
while(isdigit(ch))x=*x+ch-'',ch=getchar();
return x*sig;
}
inline void write(int x){
if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
int len=,buf[];while(x)buf[len++]=x%,x/=;
for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
}
inline char readc(){
char x=getchar();
while(!isalpha(x)) x=getchar();
return x;
}
int n,Q;
void init(){
n=read();
for(int i=;i<=n;i++) A[i]=read();
build(root,,n);
return;
}
void work(){
Q=read();char ch;
while(Q--){
ch=readc();ql=read();qr=read();
if(ql>qr) swap(ql,qr);
if(ch=='C'){
cv=read();
update(root,,n);
}
else{
_mi=inf;_mx=-inf;_sm=;
query(root,,n);
printf("MaxNum: %d, MinNum: %d, Sum: %d\n",_mx,_mi,_sm);
}
}
return;
}
void print(){
return;
}
int main(){init();work();print();return ;}
COJ 0358 xjr考考你数据结构(根号3)线段树区间修改的更多相关文章
- COJ 0359 xjr考考你数据结构(根号2)线段树区间增加
xjr考考你数据结构(根号2) 难度级别:C: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你编写一个数据结构,完成以下功能: 1)求出第 ...
- Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)
Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...
- 【UOJ228】基础数据结构练习题(线段树)
[UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...
- COJ 1010 WZJ的数据结构(十) 线段树区间操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: ...
- 【数据结构系列】线段树(Segment Tree)
一.线段树的定义 线段树,又名区间树,是一种二叉搜索树. 那么问题来了,啥是二叉搜索树呢? 对于一棵二叉树,若满足: ①它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ②若它的右子树不空, ...
- hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和
Can you answer these queries? Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...
- HDU-4027-Can you answer these queries?线段树+区间根号+剪枝
传送门Can you answer these queries? 题意:线段树,只是区间修改变成 把每个点的值开根号: 思路:对[X,Y]的值开根号,由于最大为 263.可以观察到最多开根号7次即为1 ...
- ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)
这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...
- uoj#228. 基础数据结构练习题(线段树区间开方)
题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...
随机推荐
- 组合数学第一发 hdu 2451 Simple Addition Expression
hdu 2451 Simple Addition Expression Problem Description A luxury yacht with 100 passengers on board ...
- 建立企业内部mavenserver并使用Android Studio公布公共项目
由于Android Studio使用了Gradle构建工具,在library依赖的处理上是将被依赖的library作为一个module引入(拥有一份完整的library拷贝),而Eclipse的ADT ...
- 获取web路径的几种方式
1.string str1 = Request.ApplicationPath.ToString(); 返回路径为:\HolterClientWeb 2.HttpServerUti ...
- Hibernate 关联查询 相关错误
错误提示: could not resolve property: 确定有相关属性时,记得使用 criteria.createAlias @ManyToOne 若可能为null 要加上 @NotFou ...
- Android开发手记(7) 按钮类控件的使用
1.点击Button改变页面背景色 通过Button改变页面背景色,首先新建相应的对象,让后绑定到Layout上的元素. final RelativeLayout layout = (Relative ...
- zepto源码研究 - zepto.js - 1
简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...
- JAVA-5-关于for循环的几个例子
打印一个*组成的矩形 public static void main(String[] args) { // TODO 自动生成的方法存根 for (int i = 0; i < 5; i++) ...
- C++ Primer 5th 第8章 IO库
IO类对象不允许进行拷贝操作. IO类中定义后一些函数和标志,可以用于访问和操作流的状态. 一旦流发生错误,后续IO操作都是失败的. 读写IO对象会改变IO对象的状态. 每个输出流都管理一个缓冲区. ...
- Css3从IE6-IE9的支持查看
http://msdn.microsoft.com/en-us/library/cc351024%28v=vs.85%29.aspx http://caniuse.com/
- 常用的JavaScript正则匹配规则代码收藏,很实用
收集一些常用的JavaScript正则表达式匹配规则,比如匹配电话号码.Email.中文字符.身份证号.邮编.QQ号.过滤空白行.匹配特定数字等.觉得这玩意是很有用的,只不过自己水平菜,老是自己写不出 ...