【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...
【原创】tyvj1038 忠诚 & 计蒜客 管家的忠诚 & 线段树(单点更新,区间查询)
最简单的线段树之一,中文题目,不翻译。。。。
注释讲的比较少,这已经是最简单的线段树,如果看不懂真的说明最基础的理论没明白
推荐一篇文章http://www.cnblogs.com/liwenchi/p/5760498.html
可能和我的线段树风格不一样,无所谓啦,多理解,理解了就可以自己编自己喜欢风格的模板
前排强势提醒!!!线段树的函数中只要涉及到区间(更新/查询),就有一个很容易出错的点。
详情见我的另一篇:http://www.cnblogs.com/liwenchi/p/5761257.html
1 #include<iostream>2 #include<cstdio>3 #include<algorithm>4 using namespace std;5 #define N 10000036 int ans[1000003];7 struct nod8 {9 int l,r;
10 int data;
11 }tree[5*N];
12
13 void push_up(int i)
14 {
15 tree[i].data = min(tree[i*2].data,tree[i*2+1].data);//更新tree[i]的最小值,由左孩子右孩子节点决定
16 }
17 void build_tree(int i,int l,int r)
18 {
19 tree[i].l=l;
20 tree[i].r=r;
21 tree[i].data = 0;
22 if(l==r)
23 {
24 return ;
25 }
26 int mid=(l+r)/2;
27 build_tree(i*2,l,mid);
28 build_tree(i*2+1,mid+1,r);
29 push_up(i); //理论上讲,建树不用加这个,加了也不错
30 }
31 void updata(int i,int k,int v)//更新
32 {
33 if(tree[i].l==k&&tree[i].r==k)
34 {
35 tree[i].data=v;
36 return ;
37 }
38 int mid=(tree[i].l+tree[i].r)/2;
39 if(k<=mid) //这里要是不懂,可以类比二叉排序树
40 updata(i*2,k,v);
41 else
42 updata(i*2+1,k,v);
43 push_up(i); //更新应该要加的啊哦,更新完以后,更新这个点的最小值
44 }
45
46 int query(int i,int l,int r)//查询
47 {
48 if(l<=tree[i].l&&tree[i].r<=r)
49 {
50 return tree[i].data;
51 }
52 int mid=(tree[i].l+tree[i].r)/2;
53 if(r<=mid) //如果R都小于MID了,说明一定是从左孩子节点来的(这里一开始怒错无数次,后来这样写过了,至今不知道为什么....)
54 return query(i*2,l,r);
55 if(l>mid) //如果L都大于MID了,说明一定是从右孩子节点来的
56 return query(i*2+1,l,r);
57 return min(query(i*2,l,r),query(i*2+1,l,r));//否则是从两个孩子节点来的,比较出最小值返回
58 }
59 int main()
60 {
61 int n,m,top = 0;
62 scanf("%d%d",&m,&n);
63 build_tree(1,1,m);
64 for(int i=1;i<=m;i++)
65 {
66 int account;
67 scanf("%d",&account);
68 updata(1,i,account);
69 }
70 for(int i=1;i<=n;i++)
71 {
72 int l,r;
73 scanf("%d%d",&l,&r);
74 ans[top++] = query(1,l,r);
75 }
76 for(int i=0;i<top-1;i++)
77 printf("%d ",ans[i]);
78 printf("%d",ans[top - 1]);//输出有点坑
79 }
当然也可以不要更新节点的函数,建树的时候直接把n组账单的值直接建到树里
我这种写法只是更具有一般性啦
【原创】tyvj1038 忠诚 计蒜客 管家的忠诚 线段树(单点更新,区间查询)...相关推荐
- 计蒜客 2238 礼物 期望 + 线段树 + 归并
题目链接:T2238 礼物 考虑 $[l,r]$ 区间中哪些二元组是优秀二元组: 发现将二元组的 $x$ 按照从大到小排序,若 $y[i]$ 是这个前缀的最大值,则该二元组是优秀的. 因为数据是随 ...
- [计蒜客T2238]礼物_线段树_归并排序_概率期望
礼物 题目大意: 数据范围: 题解: 这题有意思啊($md$卡常 直接做怎么做? 随便上个什么东西,维护一下矩阵乘和插入,比如说常数还算小的$KD-Tree$(反正我是没见人过过 我们漏掉了一个条件, ...
- 计蒜客 - Distance on the tree(树链剖分+离线处理+线段树)
题目链接:点击查看 题目大意:给出一颗含有n个节点的树,每条边都有权值,现在给出m个询问,每次询问的格式为u,v,w,我们需要求出在路径u-v上,边权小于等于w的边的个数 题目分析:因为一开始不会主席 ...
- M - Kill the tree 计蒜客 - 42552(2019icpc徐州/树的重心/树形dp)
vj地址 题目大意:找到每一颗子树的重心 思路: 树的重心的性质: 树的重心如果不唯一,则至多有两个,且这两个重心相邻 通过连接一条端点分别在两个树的边,来将两个树合并成一个,那么新的重心肯定是在原来 ...
- 计蒜客-青出于蓝胜于蓝 dfs+树状数组
题目描述: 武当派一共有 n人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都 ...
- 计蒜客 挑战难题 爬楼梯
计蒜客 挑战难题 爬楼梯 假设你现在正在爬楼梯,楼梯有n级.每次你只能爬1级或者2级,那么你有多少种方法爬到楼梯的顶部? 格式: 第一行输入一个数n(n<=50),代表楼梯的级数. 接下来一行输 ...
- 无脑博士的试管们java_计蒜客 无脑博士和他的试管们
标签: 无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直 ...
- 最短路(遍历边)计蒜客—DD坐地铁
题目: C 城有 n 个站点, m 条双向地铁,每条地铁有一个 companyicompany_icompanyi表示它的公司,如果连续乘坐同一家公司的地铁只要花 1元钱就好.DD现在想出门找萨摩耶 ...
- K - Triangle 计蒜客 - 42405
K - Triangle 计蒜客 - 42405 题意: 给你一个三角形的三点,再给你三角形边上一个点,让你求另一个点(也要在三角形上),使得平分三角形的面积 题解: 计算几何 三角形的三边ab,ac ...
最新文章
- 黑马程序员Linux系统开发视频之gdb调试方法
- ArcEngine二次开发_02(鼠标移过图层中显示特定的属性信息)
- go 递归tree关系_Go实现一个二叉搜索树
- 20145235李涛《网络对抗》逆向及Bof基础
- Robot Motion(模拟题bfs)
- 微信小程序内链微信公众号的方法
- 密码日记本密码忘记了怎样打开
- 主机安全加固终端安全管理
- 拼多多网站的服务器多大,拼多多打不开网页怎么回事
- javaweb网上购物系统,jsp网页线上购物,mysql(源码+报告)
- 面试自我介绍和简历上的内容能不能相同?
- Zero-Shot Deep Domain Adaptation[reading notes]
- C语言10进制转2进制
- php做网站需要的技术,建网站需要什么技术
- linux电子相册,基于Linux电子相册的.doc
- ChatGpt替代医生可能性分析
- 【Unity】雷达 + 照片墙效果
- 采用开盘价交易的方法
- Precision 3561 初体验
- 从 “搞不清楚” 到 “都明白了” 的费曼