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

题解:线段树大水题

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<cstring>
  7. #define PAU putchar(' ')
  8. #define ENT putchar('\n')
  9. #define CH for(int d=0;d<=1;d++) if(ch[d])
  10. using namespace std;
  11. const int maxn=+,maxnode=+,inf=-1u>>;
  12. struct node{
  13. node*ch[];int mi,mx,sm,add,set,siz;node(){mi=inf;mx=-inf;sm=;set=inf;}
  14. void sett(int tag){mi=mx=set=tag;sm=tag*siz;return;}
  15. void down(){
  16. if(set!=inf){CH{ch[d]->sett(set);}set=inf;}
  17. return;
  18. }
  19. void update(){
  20. mi=inf;mx=-inf;sm=;
  21. CH{mi=min(mi,ch[d]->mi);mx=max(mx,ch[d]->mx);sm+=ch[d]->sm;}
  22. return;
  23. }
  24. }seg[maxnode],*nodecnt=seg,*root;
  25. int A[maxn],ql,qr,cv,tp;
  26. void build(node*&x,int L,int R){
  27. x=nodecnt++;
  28. if(L==R) x->mi=x->mx=x->sm=A[L];
  29. else{
  30. int M=L+R>>;
  31. build(x->ch[],L,M);
  32. build(x->ch[],M+,R);
  33. x->update();
  34. } x->siz=R-L+;return;
  35. }
  36. void update(node*&x,int L,int R){
  37. if(ql<=L&&R<=qr) x->sett(cv);
  38. else{
  39. int M=L+R>>;
  40. x->down();
  41. if(ql<=M) update(x->ch[],L,M);
  42. if(qr>M) update(x->ch[],M+,R);
  43. x->update();
  44. }
  45. return;
  46. }
  47. int _mi,_mx,_sm;
  48. void query(node*x,int L,int R){
  49. if(ql<=L&&R<=qr){
  50. _mi=min(_mi,x->mi);
  51. _mx=max(_mx,x->mx);
  52. _sm+=x->sm;
  53. }
  54. else{
  55. int M=L+R>>;
  56. x->down();
  57. if(ql<=M) query(x->ch[],L,M);
  58. if(qr>M) query(x->ch[],M+,R);
  59. } return;
  60. }
  61. inline int read(){
  62. int x=,sig=;char ch=getchar();
  63. while(!isdigit(ch)){if(ch=='-')sig=-;ch=getchar();}
  64. while(isdigit(ch))x=*x+ch-'',ch=getchar();
  65. return x*sig;
  66. }
  67. inline void write(int x){
  68. if(x==){putchar('');return;}if(x<)putchar('-'),x=-x;
  69. int len=,buf[];while(x)buf[len++]=x%,x/=;
  70. for(int i=len-;i>=;i--)putchar(buf[i]+'');return;
  71. }
  72. inline char readc(){
  73. char x=getchar();
  74. while(!isalpha(x)) x=getchar();
  75. return x;
  76. }
  77. int n,Q;
  78. void init(){
  79. n=read();
  80. for(int i=;i<=n;i++) A[i]=read();
  81. build(root,,n);
  82. return;
  83. }
  84. void work(){
  85. Q=read();char ch;
  86. while(Q--){
  87. ch=readc();ql=read();qr=read();
  88. if(ql>qr) swap(ql,qr);
  89. if(ch=='C'){
  90. cv=read();
  91. update(root,,n);
  92. }
  93. else{
  94. _mi=inf;_mx=-inf;_sm=;
  95. query(root,,n);
  96. printf("MaxNum: %d, MinNum: %d, Sum: %d\n",_mx,_mi,_sm);
  97. }
  98. }
  99. return;
  100. }
  101. void print(){
  102. return;
  103. }
  104. int main(){init();work();print();return ;}

COJ 0358 xjr考考你数据结构(根号3)线段树区间修改的更多相关文章

  1. COJ 0359 xjr考考你数据结构(根号2)线段树区间增加

    xjr考考你数据结构(根号2) 难度级别:C: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 请你编写一个数据结构,完成以下功能: 1)求出第 ...

  2. Codeforces 258E - Little Elephant and Tree(根号暴力/线段树+标记永久化/主席树+标记永久化/普通线段树/可撤销线段树,hot tea)

    Codeforces 题目传送门 & 洛谷题目传送门 yyq:"hot tea 不常有,做过了就不能再错过了" 似乎这是半年前某场 hb 模拟赛的 T2?当时 ycx.ym ...

  3. 【UOJ228】基础数据结构练习题(线段树)

    [UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...

  4. COJ 1010 WZJ的数据结构(十) 线段树区间操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: ...

  5. 【数据结构系列】线段树(Segment Tree)

    一.线段树的定义 线段树,又名区间树,是一种二叉搜索树. 那么问题来了,啥是二叉搜索树呢? 对于一棵二叉树,若满足: ①它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ②若它的右子树不空, ...

  6. 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 ...

  7. HDU-4027-Can you answer these queries?线段树+区间根号+剪枝

    传送门Can you answer these queries? 题意:线段树,只是区间修改变成 把每个点的值开根号: 思路:对[X,Y]的值开根号,由于最大为 263.可以观察到最多开根号7次即为1 ...

  8. ACM/ICPC 之 数据结构-线段树+区间离散化(POJ2528)

    这道题用线段树做更方便更新和查询,但是其数据范围很大,因此要将离散化和线段树结合起来,算是一道比较经典的线段树+离散化的例题. 线段树的离散化有很多方法,在这里,我先用一次结点离散化,间接将源左右端点 ...

  9. uoj#228. 基础数据结构练习题(线段树区间开方)

    题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...

随机推荐

  1. analytics.js

    Analytics.js简介   analytics.js JavaScript代码段是一种可用于衡量用户与您网站的互动情况的全新方式.它与之前的跟踪代码ga.js类似,但为开发者自定义实现方案提供了 ...

  2. View Controller 生命周期的各个方法的用法

    (void)awakeFromNib; 这个方法用的时候,outlet还没有连接起来,是view Controller刚从storyboard建的时候,没有完全建好,不过可能有一些事情要在这个方法里面 ...

  3. Lucene自定义扩展QueryParser

    Lucene版本:4.10.2 在使用lucene的时候,不可避免的需要扩展lucene的相关功能来实现业务的需要,比如搜索时,需要在满足一个特定范围内的document进行搜索,如年龄在20和30岁 ...

  4. linux内核--中断处理程序

    一个设备的中断处理程序是它设备驱动程序的一部分--设备驱动程序是用于对设备进行管理的内核代码.中断处理程序与其他内核函数的真正区别在于,中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断 ...

  5. Java基础知识强化69:基本类型包装类之Character案例(统计字符串中大写小写以及数字的次数)

    我们直接看案例如下: package cn.itcast_03; import java.util.Scanner; /* * 统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数.(不考虑 ...

  6. 一览css布局标准

    回顾历史,CSS1于1996.12.17发正式版,它是为辅助HTML的展现效果而生的.1998.5.12,CSS2发正式版.随后发修订版CSS2.1,纠正了CSS2中的一些错误.注意从CSS2起,CS ...

  7. C#链接远程SQL 服务器方法

     C#链接远程SQL 服务器方法第一步:申请花生壳内网版,要求交1块钱给花生壳服务器做验证.第二步:把你自己主机本地连接那里的内网地址不要自动获取,写成192.168.0.105,子网掩码255.25 ...

  8. hdu 5105

    题意: y=|a*x^3+b*x^2+c*x+d|    求y的最大值? 题目是bc上的,之前写的时候,没考虑0的情况(太笨了).... 水题吧.... AC代码: #include <iost ...

  9. java中Class.forName与new

    一.使用Class.forName 1.装载类 Class clazz = Class.forName("xx.xx.xx"); 2.初始化对象 clazz.newInstance ...

  10. 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- ...