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 ...
随机推荐
- analytics.js
Analytics.js简介 analytics.js JavaScript代码段是一种可用于衡量用户与您网站的互动情况的全新方式.它与之前的跟踪代码ga.js类似,但为开发者自定义实现方案提供了 ...
- View Controller 生命周期的各个方法的用法
(void)awakeFromNib; 这个方法用的时候,outlet还没有连接起来,是view Controller刚从storyboard建的时候,没有完全建好,不过可能有一些事情要在这个方法里面 ...
- Lucene自定义扩展QueryParser
Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁 ...
- linux内核--中断处理程序
一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码.中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断 ...
- Java基础知识强化69:基本类型包装类之Character案例(统计字符串中大写小写以及数字的次数)
我们直接看案例如下: package cn.itcast_03; import java.util.Scanner; /* * 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数.(不考虑 ...
- 一览css布局标准
回顾历史,CSS1于1996.12.17发正式版,它是为辅助HTML的展现效果而生的.1998.5.12,CSS2发正式版.随后发修订版CSS2.1,纠正了CSS2中的一些错误.注意从CSS2起,CS ...
- C#链接远程SQL 服务器方法
C#链接远程SQL 服务器方法第一步:申请花生壳内网版,要求交1块钱给花生壳服务器做验证.第二步:把你自己主机本地连接那里的内网地址不要自动获取,写成192.168.0.105,子网掩码255.25 ...
- hdu 5105
题意: y=|a*x^3+b*x^2+c*x+d| 求y的最大值? 题目是bc上的,之前写的时候,没考虑0的情况(太笨了).... 水题吧.... AC代码: #include <iost ...
- java中Class.forName与new
一.使用Class.forName 1.装载类 Class clazz = Class.forName("xx.xx.xx"); 2.初始化对象 clazz.newInstance ...
- IP V4地址分类
IP V4地址 共分为五类: A类地址范围:1.0.0.1---126.255.255.254 B类地址范围:128.0.0.1---191.255.255.254 C类地址范围:192.0.0.1- ...