hdu1754 单点更新

第二道线段树,哈哈哈,已经从区间求和萌萌哒变成求最大值,我是不是好无聊哦~~~~

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <iostream>
 5 #include <algorithm>
 6
 7 using namespace std;
 8
 9 const int maxn = 200000 + 10;
10 int a[maxn];
11 struct node
12 {
13     int l, r, v;
14
15 } va[maxn<<2];
16
17 void build(int l, int r, int i)
18 {
19     va[i].l = l;
20     va[i].r = r;
21     int m = (l + r)/2;
22     if(l == r) {
23         va[i].v = a[l];
24         return ;
25     }
26     build(l, m, i<<1);
27     build(m+1, r, i<<1|1);
28     va[i].v = max(va[i<<1].v, va[i<<1|1].v);
29 }
30
31 void Update(int id, int num, int i)
32 {
33     if(va[i].l == va[i].r) {
34         va[i].v = num;
35         return ;
36     }
37     else {
38         if(id <= va[i<<1].r) Update(id, num, i<<1);
39         else Update(id, num, i<<1|1);
40     }
41     va[i].v = max(va[i<<1].v, va[i<<1|1].v);
42 }
43
44 int Quary(int l, int r, int i)
45 {
46     int m = (va[i].l + va[i].r)/2;
47     if(l == va[i].l && r == va[i].r) {
48         return va[i].v;
49     }
50     if(r <= m) return Quary(l, r, i<<1);
51     else if(l > m) return Quary(l, r, i<<1|1);
52     else return max(Quary(l, m, i<<1), Quary(m+1, r, i<<1|1));
53 }
54 int main()
55 {
56     //freopen("test.in", "r", stdin);
57     char s[5];
58     int N, M, x, y;
59     while(scanf("%d%d", &N, &M) != EOF) {
60         for(int i = 1; i <= N; i++) {
61             scanf("%d", &a[i]);
62         }
63         build(1, N, 1);
64         while(M--) {
65             scanf("%s %d %d", s, &x, &y);
66             if(s[0] == ‘Q‘) printf("%d\n", Quary(x, y, 1));
67             else Update(x, y, 1);
68         }
69     }
70     return 0;
71 }

hdu1754 单点更新,布布扣,bubuko.com

时间: 2024-12-17 16:58:03

hdu1754 单点更新的相关文章

Hdu1754单点更新

和上一题差不多,单点更新,求和,求最值,求乘积之类的,都可以照着搞. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #

hdu1754 区间更新查询(单点更新+查询求区间最大值)

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 106776    Accepted Submission(s): 40096 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的

线段树入门之单点更新

作者:zifeiy 标签:线段树 单点更新 :最最基础的线段树,只更新叶子节点,然后把信息用 push_up(int rt) 这个函数更新上来 HDU1166 敌兵布阵 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 线段树功能: update:单点增减: query:区间求和 #include <bits/stdc++.h> using namespace std; #define lson l, m, rt<<1 #def

HDU1166(线段树单点更新区间查询)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 62483    Accepted Submission(s): 26386 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就

POJ训练计划2828_Buy Tickets(线段树/单点更新)

解题报告 题意: 插队完的顺序. 思路: 倒着处理数据,第i个人占据第j=pos[i]+1个的空位. 线段树维护区间空位信息. #include <iostream> #include <cstdio> #include <cstring> using namespace std; struct node { int x,v; } num[201000]; int sum[1000000],ans[201000]; void cbtree(int rt,int l,in

HDU2852_KiKi&#39;s K-Number(线段树/单点更新)

解题报告 题目传送门 题意: 意思很好理解. 思路: 每次操作是100000次,数据大小100000,又是多组输入.普通模拟肯定不行. 线段树结点记录区间里存在数字的个数,加点删点操作就让该点个数+1,判断x存在就查询[1,x]区间的个数和[1,x-1]的个数. 求x之后第k大的数就先确定小于x的个数t,第t+k小的数就是要求的. #include <iostream> #include <cstdio> #include <cstring> using namespa

hdu1166 单点更新

第一道线段树,对着学长给的板子敲,嘿嘿,纪念一下~~~ 代码: 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <string.h> 5 #include <cmath> 6 #include <cstdlib> 7 #include <algorithm> 8 9 using namespace std; 10 11 co

POJ3264_Balanced Lineup(线段树/单点更新)

解题报告 题意: 求区间内最大值和最小值的差值. 思路: 裸线段树,我的线段树第一发.区间最值. #include <iostream> #include <cstring> #include <cstdio> #define inf 99999999 #define LL long long using namespace std; LL minn[201000],maxx[201000]; void update(LL root,LL l,LL r,LL p,LL

HDU1166_敌兵布阵(线段树/单点更新)

解题报告 题意: 略 思路: 线段树单点增减和区间求和. #include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; int sum[201000]; void update(int root,int l,int r,int p,int v) { int mid=(l+r)/2; if(l==r)sum[root]+=v; else