1476.线段树--那个苑区的人最瘦 (10分)
C时间限制:500 毫秒 |  C内存限制:655350 Kb
题目内容:
每年九月份开学的时候, 学校为了迎接新生, 食堂的伙食自然会比平时稍微好一些, 然而各个苑区食堂的伙食改善程度不尽相同.比如,南苑食堂的饭菜看起来就高大上一些, 而欣苑食堂的饭菜,emmmm, 我们还是去小吃街吃吧! 宝宝还在长身体呢,要吃好一点.这就可能导致某个苑区的学生的平均体重有所差异, 甚至差异还比较明显. 那么问题来了, 假如我现在告诉你全校所有人的体重信息,然后每次操作或者是修改编号从 x 到 y的所有人的体重, 或者是询问编号从 x 到 y 的人的平均体重, 怎么破!

输入描述
第一行两个正整数N,Q, 表示人数和操作次数
接下来一行有N个正整数, 第i个数表示编号为i的人的初始体重(1<=i<=N)
接下来有Q行, 每行或者是0 L R X 表示编号从L到R的所有人体重改变了X, 或者是1 L R 表示询问编号从L到R的人的平均体重
(x>0表示体重增加了,x<0表示体重减小了)对于100%的数据,满足N<=10^6,Q<=10^4, 1<=L<=R<=N, -15<= x <=15

输出描述
对于每组询问, 输出一行一个浮点数(保留两位小数)表示编号从L到R(闭区间[L,R])的人的平均体重

输入样例
20 10
97 126 124 83 81 81 92 99 108 114 96 103 103 92 101 116 112 93 123 122 1 1 12
0 7 19 -9
0 6 19 1
0 5 17 9
1 0 6
0 6 15 -10
1 7 12
0 12 18 12
1 6 7
1 0 8

输出样例
100.33
87.29
93.00
82.00
86.00
/** 线段树模板* 区间修改 区间查询* 版本一:当前区间值正确,tag未下传*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int MAXN=1e6+5;
const LL INF=2e18;
//const int INF=0x3f3f3f3f;//根据是否超long long修改
LL a[MAXN];//线段树节点结构体
struct Node{int left,right;//左右边界LL mi,ma;//最小值 最大值LL sum;//和LL add;//增减标记int set;//重置标记
}tree[MAXN*4];//空间开四倍//向上更新
void PushUp(int rt){int lson=rt<<1,rson=rt<<1|1;   //rt << 1 | 1 等价与 rt * 2 + 1 tree[rt].mi=min(tree[lson].mi,tree[rson].mi);tree[rt].ma=max(tree[lson].ma,tree[rson].ma);tree[rt].sum=tree[lson].sum+tree[rson].sum;
}//向下传递标记
void PushDown(int rt){if(tree[rt].left<tree[rt].right){//如果不是叶子int lson=rt<<1,rson=rt<<1|1;if(tree[rt].set!=-1){//set初始为一个不会重置到的数,这里是-1tree[lson].set=tree[rt].set;tree[rson].set=tree[rt].set;tree[lson].add=tree[rson].add=0;//add失效tree[lson].mi=tree[rson].mi=tree[rt].set;tree[lson].ma=tree[rson].ma=tree[rt].set;tree[lson].sum=(LL)tree[rt].set*(tree[lson].right-tree[lson].left+1);tree[rson].sum=(LL)tree[rt].set*(tree[rson].right-tree[rson].left+1);tree[rt].set=-1;}if(tree[rt].add){tree[lson].add+=tree[rt].add; tree[rson].add+=tree[rt].add;tree[lson].mi+=tree[rt].add;  tree[rson].mi+=tree[rt].add;tree[lson].ma+=tree[rt].add;  tree[rson].ma+=tree[rt].add;tree[lson].sum+=(LL)tree[rt].add*(tree[lson].right-tree[lson].left+1);tree[rson].sum+=(LL)tree[rt].add*(tree[rson].right-tree[rson].left+1);tree[rt].add=0;}}
}//建立函数
void Build(int rt,int L,int R){tree[rt].left=L;tree[rt].right=R;tree[rt].add=0;tree[rt].set=-1;if(L==R) {tree[rt].sum=tree[rt].mi=tree[rt].ma=a[L]; return;}int mid=(tree[rt].left+tree[rt].right)>>1;Build(rt<<1,L,mid);//只有Build时LR才会变Build(rt<<1|1,mid+1,R);PushUp(rt);
}LL QuerySum(int rt,int L,int R){if(R<tree[rt].left||L>tree[rt].right) return  0;if(L<=tree[rt].left&&tree[rt].right<=R)  return tree[rt].sum;PushDown(rt);int mid=(tree[rt].left+tree[rt].right)>>1;LL res=0;if(L<=mid)  res+=QuerySum(rt<<1,L,R);if(R>mid)   res+=QuerySum(rt<<1|1,L,R);PushUp(rt);return  res;
}LL QueryMin(int rt,int L,int R){if(L<=tree[rt].left&&tree[rt].right<=R) return tree[rt].mi;PushDown(rt);int mid=(tree[rt].left+tree[rt].right)>>1;LL res=INF;if(L<=mid) res=min(res,QueryMin(rt<<1,L,R));if(R>mid) res=min(res,QueryMin(rt<<1|1,L,R));PushUp(rt);return  res;
}LL QueryMax(int rt,int L,int R){if(L<=tree[rt].left&&tree[rt].right<=R) return  tree[rt].ma;//完全包含才产生贡献PushDown(rt);int mid=(tree[rt].left+tree[rt].right)>>1;LL res=-INF;if(L<=mid) res=max(res,QueryMax(rt<<1,L,R));if(R>mid) res=max(res,QueryMax(rt<<1|1,L,R));PushUp(rt);return  res;
}void UpdateAdd(int rt,int L,int R,int x){//把区间[L,R]加上xif(L<=tree[rt].left&&tree[rt].right<=R){tree[rt].add+=x;tree[rt].sum+=(LL)x*(tree[rt].right-tree[rt].left+1);tree[rt].mi+=x;tree[rt].ma+=x;return;}PushDown(rt);int mid=(tree[rt].left+tree[rt].right)>>1;if(L<=mid) UpdateAdd(rt<<1,L,R,x);if(R>mid) UpdateAdd(rt<<1|1,L,R,x);PushUp(rt);
}void Display(int rt){cout<<"-------------"<<endl;cout<<"id: "<<rt<<endl;cout<<"["<<tree[rt].left<<","<<tree[rt].right<<"]"<<endl;cout<<"mi: "<<tree[rt].mi<<endl;cout<<"ma: "<<tree[rt].ma<<endl;cout<<"sum: "<<tree[rt].sum<<endl;cout<<"add: "<<tree[rt].add<<endl;cout<<"set: "<<tree[rt].set<<endl;
}void bfs(int rt){queue<int> q;while(!q.empty()) q.pop();q.push(rt);while(!q.empty()){int fst=q.front();q.pop();Display(fst);if(tree[fst].right>tree[fst].left){q.push(fst<<1);q.push(fst<<1|1);}}
}void UpdateSet(int rt,int L,int R,int x){//把区间[x,y]置为xif(L<=tree[rt].left&&tree[rt].right<=R){tree[rt].set=x;tree[rt].sum=(LL)x*(tree[rt].right-tree[rt].left+1);tree[rt].mi=x;tree[rt].ma=x;tree[rt].add=0;return;}PushDown(rt);int mid=(tree[rt].left+tree[rt].right)>>1;if(L<=mid) UpdateSet(rt<<1,L,R,x);if(R>mid){UpdateSet(rt<<1|1,L,R,x);}PushUp(rt);
}int main(){int n,m;//n个数 m次询问while(scanf("%d%d",&n,&m)!=EOF){for(int i=1;i<=n;i++) scanf("%lld",&a[i]);Build(1,1,n);//建立线段树int op,x,y,z;for(int i=1;i<=m;i++){scanf("%d%d%d",&op,&x,&y);if(op==1){//询问[x,y]的和,除以总数的平均
//                printf("Case #%d:\n",i);printf("%.2lf\n",QuerySum(1,x,y) * 1.0 / (y - x + 1));}else if(op==2){//询问[x,y]的最大值printf("Case #%d:\n",i);printf("%lld\n",QueryMax(1,x,y));}else if(op==3){//询问[x,y]的最小值printf("Case #%d:\n",i);printf("%lld\n",QueryMin(1,x,y));}else if(op==0){//在[x,y]区间加上zscanf("%d",&z);UpdateAdd(1,x,y,z);}else{//把[x,y]置为zscanf("%d",&z);UpdateSet(1,x,y,z);}}}return 0;
}

  

转载于:https://www.cnblogs.com/zhumengdexiaobai/p/9540672.html

87-区间线段树(板子)--那个苑区的人最瘦相关推荐

  1. 几个线段树板子(区间加/区间加与乘)

    一直仰慕dl能够把线段树玩出花来,所以就想手写并整理一下几个常见的线段树板子(主要是结构化得好看一些) Part Ⅰ区间加法+区间求和 洛谷P3372 基础中的基础 //luogu P3372 199 ...

  2. 热身小游戏(线段树,单修区修区查)

    热身小游戏(线段树,单修区修区查) 链接:https://ac.nowcoder.com/acm/contest/37160/G 来源:牛客网 Alice 和 Bob 在玩热身小游戏,Alice 给出 ...

  3. 51NOD 1631 小鲨鱼在51nod小学 区间线段树

    1631 小鲨鱼在51nod小学 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依 ...

  4. 线段树板子(区间修改)

    测试题目:P3372 [模板]线段树 1 https://www.luogu.org/problemnew/show/P3372 #include<cstdio> #include< ...

  5. 牛客 - 骚区间(线段树+思维)

    题目链接:点击查看 题目大意:给出一个 1 ~ n 的排列 a ,现在规定骚区间当且仅当 a[ l ] 是 [ l , r ] 这段区间内的次小值,同时 a[ r ] 是 [ l , r ] 这段区间 ...

  6. 等差区间 线段树+GCD

    Description 已知一个长度为 nn 的数组 a[1],a[2],-,a[n]a[1],a[2],-,a[n],我们进行 qq 次询问,每次询问区间 a[l],a[l+1],-,a[r−1], ...

  7. BZOJ4653: [Noi2016]区间(线段树 双指针)

    题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...

  8. [NOI2016]区间-线段树

    一道很巧妙的题. 首先我们需要解决的问题,怎么快速判断选出的m个区间是否存在交. 我们反过来考虑这个问题, 我们每一个选出的区间,就对应的在线段树上区间加1,那么只要存在最大值等于m,就一定有m个区间 ...

  9. 发个ZKW线段树板子测试一下代码高亮

    是我,Long time no see          --Jim 先安利 Wolves  歌手:Madilyn Bailey http://music.163.com/song/524149464 ...

最新文章

  1. 去年一个百万级的小软件项目经验分享,20来个功能模块,项目不太好做有些棘手...
  2. 全球及中国水彩调色板行业销售前景与投资商机研究报告2022版
  3. 【C语言】switch…case无break情况(2)
  4. TextKit简单示例
  5. 智慧教室解决方案和移动授课概念说明
  6. echarts柱状图,改变柱状颜色
  7. 阅读类app界面设计UI可临摹素材模板
  8. WCDMA是什么意思?CDMA是什么意思?GSM是什么意思
  9. 【js】【cornerstone】cornerstone使用url方式加载图像
  10. 动画学习android,Android动画学习
  11. 猜数字游戏的提示 (Master-Mind Hints, UVa 340)
  12. 四川大学计算机应用基础第二次作业,四川大学川成教2017年秋季《计算机应用基础》第二次作业...
  13. PC蛋蛋 按键精灵手机助手 安装+拉代码(视频)
  14. Activiti工作流画图工具介绍
  15. 笔记 c语言99乘法表
  16. 批量下载CMIP6数据
  17. 安卓加载图片四大框架
  18. leetcode1567. 乘积为正数的最长子数组长度(Python3、c++)
  19. wifi一到晚上服务器无响应,wifi到晚上网速很慢(为啥一到晚上网速就慢)
  20. 用python实现颜值打分,还能测测自己的颜值

热门文章

  1. python解决问题asp_用python实现面向对像的ASP程序实例
  2. 华为鸿蒙发布会新手机,曝华为 P50/Pro 系列最终版确定,6 月 2 日揭晓鸿蒙手机发布时间...
  3. php遍历中记录所有,php遍历类中包含的所有元素的方法
  4. php 接口继承,PHP面向对象之旅:接口的继承
  5. js oop写法小例子
  6. java 中映射关系_java – 在Hibernate中映射一对多的关系?
  7. Burpsuite技巧之MD5加密密码爆破、带验证码爆破
  8. Linux调试分析诊断利器----strace
  9. Faker库:一个数据造假的神库
  10. javascript的全局变量