蓝桥杯 操作格子(线段树例题)
来源:互联网 发布:如何评价食草家族 知乎 编辑:程序博客网 时间:2024/05/19 12:26
http://www.tudou.com/programs/view/ek_xh3IaBWw/?qq-pf-to=pcqq.group
线段树视频讲解
http://blog.csdn.net/x314542916/article/details/7837276
博客讲解
#include<stdio.h>int Testmax(int a,int b)//判断大小的函数{return a>b?a:b;}typedef struct node//构造一个线段树的结构体{ int l,r; int sum,max;}node;node a[400010];//申请线段树节点空间void Build(int n,int l,int r);//构建一棵范围在l至r范围的线段树void Insert(int n, int v, int num);//为线段树插入一个值void Change(int n, int v, int num);//为线段树改变一个权值int QSum(int n, int l, int r);//求一个范围内的权值总和int QMax(int n, int l, int r);//求一个范围内的最大值int main(){ int i,j,n,m,value,que,b,c; scanf("%d%d",&n,&m); Build(1,1,n);//构建一个范围为1至n的线段树 for(i=1;i<=n;i++) { scanf("%d",&value); Insert(1,i,value);//向已有线段树中插入权值 } while(m--) { scanf("%d%d%d",&que,&b,&c); switch(que) { case 1:Change(1,b,c);break;//改变节点b的权值为c case 2:printf("%d\n", QSum(1,b,c));break;//计算b至c范围内的权值和 case 3:printf("%d\n", QMax(1,b,c));break;//计算b至c范围内的最大权值 } } return 0;}void Build(int n,int l,int r)//构建一棵范围在l至r范围的线段树{ a[n].l=l;//左边距 a[n].r=r;//右边距 a[n].sum=0;//范围在l至r之间权值和 a[n].max=0;//范围在l至r之间权值最大值 if(l==r)//如果左右边距相同不再构建孩子 return; Build(n*2,l,(l+r)/2);//构建范围为l至(l+r)/2的左孩子 Build(n*2+1,(l+r)/2+1,r);//构建范围为l至(l+r)/2的右孩子}void Insert(int n, int v, int num)//为线段树插入一个值{ a[n].sum += num;//总和加入新数 if(a[n].max < num) a[n].max = num;//更新最大值 if(a[n].l == a[n].r)//左右边距相等不再插入更新 return; if(v <= (a[n].l + a[n].r) / 2) Insert(n*2, v, num);//更新左孩子 else Insert(n*2+1, v, num);//更新右孩子}void Change(int n, int v, int num)//为线段树改变一个权值{ if(v == a[n].l && v == a[n].r)//下标与左右范围相等 ,存本数 { a[n].sum = num; a[n].max = num; return; } int middle = (a[n].l + a[n].r) / 2; if(v <= middle) Change(n*2, v, num);//更改左孩子 else Change(n*2+1, v, num);//更改右孩子 a[n].sum = a[n*2].sum + a[n*2+1].sum;//更新总和 a[n].max = Testmax(a[n*2].max,a[n*2+1].max);//更新最大值}int QSum(int n, int l, int r)//求一个范围内的权值总和{ if(l == a[n].l && r == a[n].r)//所求范围与左右范围相等 ,直接输出总和 return a[n].sum; int middle = (a[n].l + a[n].r) / 2; if(r <= middle) return QSum(n*2, l, r);//若所求范围在左孩子范围内,从左孩子寻找 else if(l > middle) return QSum(n*2+1, l, r);//若所求范围在右孩子范围内,从右孩子寻找 else return QSum(n*2,l,middle) + QSum(n*2+1,middle+1,r);//若范围在左右孩子之间,分别求总和}int QMax(int n, int l, int r)//计算b至c范围内的最大权值{ if(l == a[n].l && r == a[n].r)//所求范围与左右范围相等 ,直接输出最大值 return a[n].max; int middle = (a[n].l + a[n].r) / 2; if(r <= middle) return QMax(n*2, l, r);//若所求范围在左孩子范围内,从左孩子寻找 else if(l > middle) return QMax(n*2+1, l, r);//若所求范围在右孩子范围内,从右孩子寻找 else return Testmax(QMax(n*2, l, middle), QMax(n*2+1, middle+1, r));//若范围在左右孩子之间,分别求最大值,然后求最终最大值}
简单例题HDU1754
AC代码
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{ int l,r; int ma;}a[1000000];void init(int l,int r,int i){ a[i].l=l; a[i].r=r; a[i].ma=0; if(r!=l) { int mid=(l+r)/2; init(l,mid,2*i); init(mid+1,r,2*i+1); }}void insert(int i,int x,int m){ if(x>=a[i].l&&x<=a[i].r) { a[i].ma=m; } if(a[i].l==a[i].r) return; int mid=(a[i].l+a[i].r)/2; if(x>mid) insert(2*i+1,x,m); else insert(2*i,x,m); a[i].ma=max(a[2*i].ma,a[2*i+1].ma);}int find_max(int x,int y,int i){ if(a[i].l==x&&a[i].r==y) return a[i].ma; int mid=(a[i].l+a[i].r)/2; if(x>mid) return find_max(x,y,2*i+1); else if(y<=mid) return find_max(x,y,2*i); else return max(find_max(x,mid,2*i),find_max(mid+1,y,2*i+1));}int main(){ int n,m; while(~scanf("%d %d",&n,&m)){ //建树 init(1,n,1); for(int i=1;i<=n;i++) { int b; scanf("%d",&b); insert(1,i,b); } getchar(); while(m--) { char op; int x,y; scanf("%c %d %d",&op,&x,&y); getchar(); if(op=='U') insert(1,x,y); if(op=='Q') printf("%d\n",find_max(x,y,1)); } } return 0;}
0 0
- 蓝桥杯 操作格子(线段树例题)
- 蓝桥杯 操作格子(线段树)
- 蓝桥杯:操作格子(线段树)
- 蓝桥杯 操作格子(线段树)
- 蓝桥杯:操作格子(线段树)
- 蓝桥杯 - 操作格子 (线段树)
- 蓝桥杯 操作格子(线段树)
- 蓝桥杯-操作格子(线段树)
- 蓝桥杯 操作格子 (线段树)
- 蓝桥杯 操作格子 线段树
- 蓝桥杯---操作格子 (线段树)
- 蓝桥杯 操作格子 线段树
- 操作格子(线段树)
- 操作格子(线段树)
- 操作格子(线段树)
- 操作格子 线段树
- 操作格子(线段树)
- 线段树-操作格子
- javaScript 外部对象2
- 使用Fresco实现大图浏览(支持手势放大、拖拽)
- 使用Sblime Text开发TypeScript(TS)的编译环境搭建
- FIDO Metadata Statements(译)
- java-动态代理-从源码分析
- 蓝桥杯 操作格子(线段树例题)
- ASP.NET C#学习二(数据库开发)
- h5本地存储的sessionStorage和localStorage
- Keras Tensorflow TF_NewStatus错误修改
- Java基础——常量
- 1583
- UML类图画法及其之间的几种关系
- test
- IDEA远程调试的