HDU 1754 I Hate It!(线段树)
2016-07-25 10:58
393 查看
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1754题解:
线段树记录一下最大值搞一搞就好了,注意要用scanf输入,同时数据不止一组。AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define lc (d<<1) #define rc (d<<1|1) #define mid ((l+r)>>1) using namespace std; int b[200050]; struct node { int mx, l, r; }tr[800000]; void build(int d, int l, int r) { tr[d].l = l, tr[d].r = r; if(l == r) { tr[d].mx = b[l]; return ; } build(lc, l, mid); build(rc, mid+1, r); tr[d].mx = max(tr[lc].mx, tr[rc].mx); } int query(int d, int l, int r, int L, int R) { if(tr[d].l == L && tr[d].r == R) { return tr[d].mx; } if(R <= mid)return query(lc,l,mid,L,R); else if(L > mid)return query(rc,mid+1,r,L,R); else return max(query(lc, l, mid,L,mid), query(rc, mid+1, r,mid+1,R)); } void update(int d, int pos, int k) { if(tr[d].l == pos && tr[d].l == tr[d].r) { tr[d].mx = k; return; } int midd = (tr[d].r + tr[d].l)/2; if(pos <= midd)update(lc,pos,k); else update(rc,pos,k); tr[d].mx = max(tr[lc].mx, tr[rc].mx); } int main() { int n ,m; while(~scanf("%d%d", &n, &m)) { char s[2]; int n1,n2; for(int i = 1; i <= n; i++) { int grade; scanf("%d",&grade); b[i] = grade; } build(1,1,n); while(m--) { scanf("%s", &s); scanf("%d%d", &n1, &n2); if(s[0] == 'Q') cout << query(1,1,n,n1,n2) <<endl; else update(1, n1 ,n2); } } return 0; }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002