洛谷P1531 I Hate It 线段树

洛谷P1531 I Hate It

线段树 单点修改 区间求最大

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <iostream>
 9 using namespace std ;
10
11 const int maxn = 200011 ;
12 struct node{
13     int l,r,mx ;
14 }tree[4*maxn] ;
15 int a[maxn] ;
16 int n,Q,ans,x,y ;
17 char s[2] ;
18
19 inline int read()
20 {
21     char ch = getchar() ;
22     int x = 0 ,f = 1 ;
23     while(ch<‘0‘||ch>‘9‘) { if(f==‘-‘) f = -1 ; ch = getchar() ; }
24     while(ch>=‘0‘&&ch<=‘9‘) { x = x*10 + ch - 48 ; ch = getchar() ; }
25     return x * f ;
26 }
27
28 inline void pushup(int root)
29 {
30     tree[root].mx = max( tree[root*2].mx,tree[root*2+1].mx ) ;
31 }
32
33 inline void build(int l,int r,int root)
34 {
35     tree[root].l = l ;   tree[root].r = r ;
36     if(l==r)
37     {
38         tree[root].mx = a[ l ] ;
39         return ;
40     }
41     int mid = (l+r) / 2  ;
42     build(l,mid,root*2) ;
43     build(mid+1,r,root*2+1) ;
44     pushup(root) ;
45 }
46
47 inline void updata(int pos,int val,int root)
48 {
49     if(tree[root].l==tree[root].r)
50     {
51         if(val > tree[root].mx) tree[root].mx = val ;
52         return ;
53     }
54     int mid = (tree[root].l+tree[root].r) / 2 ;
55     if( pos<=mid )
56         updata(pos,val,root*2) ;
57     else
58         updata(pos,val,root*2+1) ;
59     pushup(root) ;
60 }
61
62 inline int query(int l,int r,int root)
63 {
64     if(tree[root].l==l&&tree[root].r==r)
65         return tree[root].mx ;
66     int mid = ( tree[root].l + tree[root].r ) / 2 ;
67     if ( l > mid ) return query(l,r,root*2+1) ;
68     if ( r<=mid )  return query(l,r,root*2) ;
69     int ans = max( query(l,mid,root*2),query(mid+1,r,root*2+1) ) ;
70     return ans ;
71 }
72
73 int main()
74 {
75     n = read() ;   Q = read() ;
76     for(int i=1;i<=n;i++)
77         a[ i ] = read() ;
78     build(1,n,1) ;
79
80     for(int i=1;i<=Q;i++)
81     {
82         scanf("%s",s) ;
83         x = read() ;  y = read() ;
84         if(s[0]==‘U‘)
85             updata(x,y,1) ;
86         else
87         {
88             ans = query(x,y,1) ;
89             printf("%d\n",ans) ;
90         }
91     }
92     return 0 ;
93 }
时间: 2024-12-13 00:21:52

洛谷P1531 I Hate It 线段树的相关文章

洛谷P3372 【模板】线段树 1

P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷评测机出问题了吗? 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接

[洛谷3373]【模板】线段树 2

思路: 线段树.同时维护两个 lazy tag ,一个维护乘,一个维护加.根据加法结合律,可以得出:当同一个结点进行两次加操作时,新的标记等于两次标记之和.根据乘法结合律,可以得出:当同一个结点进行两次乘操作时,新的标记等于两次标记之积.根据乘法分配律,可以得出:当同一个结点先进行了加操作,再进行乘操作时,两个标记都要乘以新乘上的值. 1 #include<cstdio> 2 #include<cctype> 3 #include<cstring> 4 #include

洛谷P3373 【模板】线段树 2

 P3373 [模板]线段树 2 47通过 186提交 题目提供者HansBug 标签 难度提高+/省选- 提交  讨论  题解 最新讨论 为啥WA(TAT) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字的个数.操作的总个数和模数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4

洛谷P3372 【模板】线段树 1(节省内存版)

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和 输出格式: 输出包含若干行整

洛谷 P3372 【模板】线段树 1

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=3372 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下

洛谷—— P3372 【模板】线段树 1

P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的

洛谷 P3924 康娜的线段树

P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息,是非常厉害的东西.康娜试着写了一棵维护区间和的线段树.由于她不会打标记,因此所有的区间加操作她都是暴力修改的.具体的代码如下: struct Segment_Tree{ #define lson (o<<1) #define rson (o<<1|1) int sumv[N<&l

洛谷 P3373 【模板】线段树 2

P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字的个数.操作的总个数和模数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数乘上k 操作2: 格式:2 x

洛谷 3373 【模板】线段树 2

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字的个数.操作的总个数和模数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数乘上k 操作2: 格式:2 x y k 含义:将区间[x,y]内