hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场

题意:

输入一行数字,查询第i个数到第j个数之间的最大值。可以修改其中的某个数的值。

输入:

包含多组输入数据。

每组输入首行两个整数n,m。表示共有n个数,m次操作。

接下来一行包含n个整数。

接下来m行,每行包含一个字母s,两个整数a,b。

当s为’Q’,表示查询第a个数到第b个数之间的最大值。

当s为’U’,表示将第a个数更改为b。

输出:

每次查询输出一个结果,每次输出占一行。

题解:

点修改区间求最值,可以用树状数组模板。

具体见代码——

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6
 7 const int N = 200010;
 8
 9 int a[N], c[N];
10 int t, n, m;
11
12 int lowbit(int x)
13 {
14     return x&(-x);
15 }
16
17 void Maxn(int x, int y)
18 {
19     a[x] = y;
20     for(int i = x; i <= n; i += lowbit(i))              //需要修改的c[]
21     {
22         c[i] = y;
23         for(int j = 1; j < lowbit(i); j <<= 1)          //修改时需要比较的c[]
24         {
25             c[i] = c[i] > c[i-j] ? c[i] : c[i-j];
26         }
27     }
28 }
29
30 void Init()
31 {
32     int  y;
33     memset(c, 0, sizeof(c));
34     for(int i = 1; i <= n; i++)
35     {
36         scanf("%d", &y);
37         a[i] = y;
38         c[i] = y;
39         for(int j = 1; j <lowbit(i); j <<= 1)           //需要比较的c[]
40             c[i] = c[i] > c[i-j] ? c[i] : c[i-j];
41     }
42 }
43
44 void Query(int l, int r)
45 {
46     int ans = 0;
47     while(1)
48     {
49         ans = ans > a[r] ? ans : a[r];
50         if(r == l) break;
51         for(r -= 1; r-l >= lowbit(r); r -= lowbit(r))
52             ans = ans > c[r] ? ans : c[r];
53     }
54     printf("%d\n", ans);
55 }
56
57 void Work()
58 {
59     char s[2];
60     int x, y;
61     for(int i = 1; i <= m; i++)
62     {
63         scanf("%s%d%d", s, &x, &y);
64         if(s[0] == ‘U‘) Maxn(x, y);
65         else if(s[0] == ‘Q‘) Query(x, y);
66     }
67 }
68
69 int main()
70 {
71     //freopen("test.in", "r", stdin);
72     while(~scanf("%d%d", &n, &m))
73     {
74         Init();
75         Work();
76     }
77 }

树状数组区间求最值模板——

http://www.cnblogs.com/mypride/p/5002556.html

时间: 2024-10-11 17:10:02

hdu 1754 I Hate It(树状数组区间求最值)2007省赛集训队练习赛(6)_linle专场的相关文章

hdu 1116 敌兵布阵(树状数组区间求最值)

题意: 给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j). 输入: 首行输入一个t,表示共有t组数据. 接下来每行首行输入一个整数n,表示共有n个数字. 接下来每行首先输入一个字符串,如果是”Add”,接下来是两个整数a,b,表示给第i个数增加b.如果是”Query”,接下来是两个整数a,b,表示查询从第i个数到第j个数之间的和.如果是”End”,表示这组数据结束. 输出: 每组数据首先输出”Case X: ”,其中X表示第x组数. 每次查询,输出计算结

HDU 1556-Color the ball(树状数组-区间修改 单点查询)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 15491    Accepted Submission(s): 7731 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"

HDU3874 /HDU3333 树状数组 区间求不重复数和

Necklace Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4604    Accepted Submission(s): 1581 Problem Description Mery has a beautiful necklace. The necklace is made up of N magic balls. Each b

hdu 3015 Disharmony Trees (离散化+树状数组)

Disharmony Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 663    Accepted Submission(s): 307 Problem Description One day Sophia finds a very big square. There are n trees in the square. T

HDU 2852 KiKi&#39;s K-Number (树状数组 &amp;&amp; 二分)

题意:给出对容器的总操作次数n, 接下来是这n个操作.这里对于一个容器提供三种操作, 分别是插入.删除和查找.输入0  e表示插入e.输入1  e表示删除e,若元素不存在输出No Elment!.输入2  e  k表示查找比e大且第k大的数, 若不存在则输出Not Find! 分析:这里考虑树状数组做的原因是在第三个操作的时候, 只要我们记录了元素的总数, 那通过求和操作, 便能够高效地知道到底有多少个数比现在求和的这个数要大, 例如 tot - sum(3)就能知道整个集合里面比3大的数到底有

HDU 3584 Cube (三维 树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584 Cube Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. Initially we have A[i, j, k] = 0 (1 <= i, 

hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8984    Accepted Submission(s): 4594 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球

HDU 5592 ZYB&#39;s Premutation(树状数组+二分)

题意:给一个排列的每个前缀区间的逆序对数,让还原 原序列. 思路:考虑逆序对的意思,对于k = f[i] - f[i -1],就表示在第i个位置前面有k个比当前位置大的数,那么也就是:除了i后面的数字之外,它是在剩下的数字当中第k+1大的. 知道这个之后,可以用树状数组来帮助找出剩下的数中第k大的数,刚开始我们可以让1-n中每个元素都标记为1,那么他们的前缀和就代表它是第几小.所以,我们可以对于他们的和来二分快速寻找第k大数.其实在树状数组里面是按照第(i-k)小来找的.找完之后要删除这个元素的

hdu 5592 ZYB&#39;s Game 树状数组

ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5592 Description ZYB has a premutation P,but he only remeber the reverse log of each prefix of the premutation,now he ask you to restore the premutation