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=100000+10,maxnode=200000+10,inf=-1u>>1;
 12 struct node{
 13     node*ch[2];int mi,mx,sm,add,set,siz;node(){mi=inf;mx=-inf;sm=0;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=0;
 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>>1;
 31         build(x->ch[0],L,M);
 32         build(x->ch[1],M+1,R);
 33         x->update();
 34     } x->siz=R-L+1;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>>1;
 40         x->down();
 41         if(ql<=M) update(x->ch[0],L,M);
 42         if(qr>M) update(x->ch[1],M+1,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>>1;
 56         x->down();
 57         if(ql<=M) query(x->ch[0],L,M);
 58         if(qr>M) query(x->ch[1],M+1,R);
 59     } return;
 60 }
 61 inline int read(){
 62     int x=0,sig=1;char ch=getchar();
 63     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
 64     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
 65     return x*sig;
 66 }
 67 inline void write(int x){
 68     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
 69     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
 70     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');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=1;i<=n;i++) A[i]=read();
 81     build(root,1,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,1,n);
 92         }
 93         else{
 94             _mi=inf;_mx=-inf;_sm=0;
 95             query(root,1,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 0;}

转载于:https://www.cnblogs.com/chxer/p/4572445.html

COJ 0358 xjr考考你数据结构(根号3)线段树区间修改相关推荐

  1. 数据结构(终极线段树篇)

    数据结构(终极线段树篇) 摘要: 问题的提出:如何解决多样化的区间操作问题? solve:线段树!!! 关键字: 线段树,可持久化线段树,权值线段树,线段树森林,动态开点线段树,区间操作,线段树应用. ...

  2. 【数据结构专题】线段树(一)

    题目 算法 A.AcWing 1275. 最大数 线段树求区间最大值 B.SP1043 Can you answer these queries III 线段树求最长连续子段和 C.AcWing 24 ...

  3. java 数据结构源码--线段树

    线段树模板 package segmentTree;public class SegmentTree {private class Segment { int left; int right; int ...

  4. 【地狱副本】数据结构之线段树Ⅲ——区间最值/赋值/修改/历史值操作(HDU5306,Tyvj 1518,【清华集训2015】V,HDU6315,HDU1828,POJ3162)

    文章目录 Gorgeous Sequence Tyvj 1518 CPU监控 [清华集训2015]V Naive Operations Picture Walking Race Gorgeous Se ...

  5. 数据结构二之线段树Ⅱ——KiKi‘s K-Number,ball,The Child and Sequence,「雅礼集训 2017 Day1」市场,Atlantis

    值域线段树+势能线段树+扫描线 KiKi's K-Number ball The Child and Sequence 「雅礼集训 2017 Day1」市场 Atlantis KiKi's K-Num ...

  6. 数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

    普通的下标线段树 Count Color Hotel Transformation Tree Generator™ Count Color POJ2777 查询区间内颜色种类数,观察到颜色种类数只有3 ...

  7. Comet OJ-栈的数据结构题【线段树】

    正题 题目链接:https://cometoj.com/contest/79/problem/E?problem_id=4207 题目大意 nnn个栈,要求支持操作 l∼rl\sim rl∼r区间内的 ...

  8. Codeforces1422 F.Boring Queries(根号分治+线段树+可持久化线段树)

    题意: 解法: 如果问题可以离线,那么莫队可以直接冲过去,可惜离不得. 每个数最多只有一个>sqrt的质因子,sqrt(2e5)<90, 开90棵线段树分别维护前90个质因子的区间最大指数 ...

  9. 2015 UESTC 数据结构专题A题 秋实大哥与小朋友 线段树 区间更新,单点查询,离散化...

    秋实大哥与小朋友 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Desc ...

  10. 【数据结构2-2】线段树与树状数组 题解

    头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...

最新文章

  1. PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
  2. Spring Cloud异常
  3. inotify 机制
  4. python语言是一门编程语言_python是一门怎样的编程语言?老男孩python入门
  5. java null和 的区别_java中null和的区别
  6. Python老师遇到的那些无语的问题
  7. 用SignalR 2.0开发客服系统[系列5:使用SignalR的中文简体语言包和其他技术点]
  8. linux mysql 建索引_MySQL在创建索引之前一定要想到的事情
  9. Web 端集成融云 SDK 如何发送正确图片消息给移动端展示?
  10. 解方程(equation)
  11. ipad、iphone 怎么真机调试
  12. 无线Beacon帧解析
  13. 从后端到前端的转变:如何选择框架?
  14. 常用的配电箱有哪几种?
  15. 算法 - 求一个数组的最长递减子序列(C++)
  16. SpringBoot工程使用shiro 进行MD5加密
  17. BUUCTF解题十一道(04)
  18. js 动态修改iframe的src
  19. 瑞萨单片机boot程序中串口打印字符串乱码-问题记录
  20. 如何掌握高效学习方法,提高学习效率?

热门文章

  1. 有什么软件测试固态硬盘,SSD差距有多大?两款主流NVMe固态硬盘测试,一看就包懂...
  2. java数据过载,处理服务器过载的三大解决方法
  3. 开关电源的电感选择和布局布线
  4. MDK与keilC51共存的方法(成功)MDK与keilC51破解
  5. 2007-2008 火箭赛程表
  6. “跳出内卷”ROttKRON乐旷陶瓷耳机的新视野,“形、质、声”打开耳机新话题
  7. Shell脚本 | 考勤统计
  8. 案例集|不仅仅是酒店,还有更多可能——高星级酒店的跨界营销
  9. 三防数据存储: 3U Open VPX 存储模块
  10. cordova弹框插件 cordova-plugin-dialogs