线段树之单点更新

单点更新,其实就是对一个点进行更新。

HDU 1166

  

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #define lson l,m,rt<<1
 5 #define rson m+1,r,rt<<1|1
 6 using namespace std;
 7 const int MAX = 50010;
 8 int tree[MAX<<2];
 9 void Push(int rt){
10     tree[rt] = tree[rt<<1]+tree[rt<<1|1];
11 }
12 void build(int l, int r, int rt){
13     if(l == r){
14         scanf("%d",&tree[rt]);
15         return ;
16     }
17     int m = (l+r)>>1;
18     build(lson);
19     build(rson);
20     Push(rt);
21 }
22 void update(int x, int p, int l, int r, int rt){
23     if(l == r){
24         tree[rt] += p;
25         return;
26     }
27     int m = (l+r)>>1;
28     if(m >=x)update(x,p,lson);
29     else update(x,p,rson);
30     Push(rt);
31 }
32 int query(int LL, int RR, int l, int r, int rt){
33     if(LL <= l && r <= RR){
34         return tree[rt];
35     }
36     int m = (l+r)>>1;
37     int sum = 0;
38     if(m >= LL) sum+=query(LL,RR,lson);
39     if(m < RR) sum+=query(LL,RR,rson);
40     return sum;
41 }
42 int main(){
43     int t,n,k=1;
44     scanf("%d",&t);
45     while(t--){
46         scanf("%d",&n);
47         printf("Case %d:\n",k++);
48         build(1,n,1);
49         char str[10];
50         int l,r;
51         while(scanf("%s",str)!=EOF){
52             if(str[0] == ‘E‘)break;
53             scanf("%d %d",&l,&r);
54             if(str[0] == ‘Q‘){
55                 printf("%d\n",query(l,r,1,n,1));
56             }else if(str[0] == ‘A‘){
57                 update(l,r,1,n,1);
58             }else {
59                 update(l,-r,1,n,1);
60             }
61         }
62     }
63     return 0;
64 }

HDU - 2795

 1 #include <iostream>
 2 #include <cstdio>
 3 #define lson l, m, rt<<1
 4 #define rson m+1, r, rt<<1|1
 5
 6 using namespace std;
 7 const int maxn = 2e5+10;
 8 int n, h, w;
 9 int MAX[maxn<<2];
10 void PushUP(int rt){
11     MAX[rt] = max(MAX[rt<<1], MAX[rt<<1|1]);
12 }
13
14 void build(int l, int r, int rt){//建立线段树
15     MAX[rt] = w;
16     if(l == r)return;
17     int m = (l + r) >> 1;
18     build(lson);
19     build(rson);
20 }
21 int query(int q, int l, int r, int rt){
22     if(l == r){
23         MAX[rt] -= q;//每次查询时减下q
24         return l;
25     }
26     int m = (l + r) >> 1;
27     int ret = (MAX[rt<<1] >= q)?query(q, lson):query(q, rson);//求出满足条件的最左边区间
28     PushUP(rt);
29     return ret;
30 }
31
32 int main()
33 {
34     while(~scanf("%d%d%d",&h,&w,&n)){
35         if(h > n) h = n;//这样建立的区间更少些
36         build(1, h, 1);
37         while(n--){
38             int x;
39             scanf("%d",&x);
40             if(MAX[1] < x) printf("-1\n");
41             else printf("%d\n",query(x, 1, h, 1));
42         }
43     }
44     return 0;
45 }
时间: 2024-10-01 05:11:14

线段树之单点更新的相关文章

线段树 基础单点更新 敌兵布阵

题:敌兵布阵 标准线段树模板代码: #include<cstdio> #include<cstring> const int maxn = 500000 + 10; struct Node{ int left, right, count; }node[maxn]; int a[maxn]; /*********************************** ***************建树**************** ************i是区间序号********

Can you answer these queries?(线段树之单点更新)

萌萌哒的传送门 因为一个long long 范围内的数开方不会超过10次,所以题目就转化为线段树的单点更新问题. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <queue> #include <vector> #include <cstdlib> #includ

hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

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

hdu 1754 I Hate It(线段树 之 单点更新 求最值)

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

POJ 3264-Balanced Lineup(线段树:单点更新+区间查询)

Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 34522   Accepted: 16224 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer Joh

HDU 4027 Can you answer these queries?(线段树的单点更新+区间查询)

题目链接 题意 : 给你N个数,进行M次操作,0操作是将区间内的每一个数变成自己的平方根(整数),1操作是求区间和. 思路 :单点更新,区间查询,就是要注意在更新的时候要优化,要不然会超时,因为所有的数开几次方之后都会变成1,所以到了1不用没完没了的更新. 1 //HDU 4027 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <iostream> 6 #defi

HDU 1754-I Hate It(线段树:单点更新,区间最值)

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

HDU 3074-Multiply game(线段树:单点更新,区间求积)

Multiply game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1450    Accepted Submission(s): 508 Problem Description Tired of playing computer games, alpc23 is planning to play a game on numbe

HDU 1166-敌兵布阵(线段树:单点更新,区间求和)

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