杭电hdu 1754 i hate it 线段树

来源:互联网 发布:软件关键性等级 编辑:程序博客网 时间:2024/04/28 18:55

http://acm.hdu.edu.cn/showproblem.php?pid=1754

讨论里面的一个数据没有过,结果就wrong了两次,很是悲剧啊,

5 3
1 2 3 4 5
Q 1 5
U 5 0
Q 1 5

就是这组该死的数据,以后还是要多测试两组数据的。

#include <stdio.h>#define MAX 200010typedef struct _node{int left;int right;int high;}node;node no[MAX*3];int n, m;int t, grade[MAX];int maxh(int a, int b){return a > b ? a : b;}void initTree(int l, int r, int i){no[i].left = l;no[i].right = r;if(l==r){no[i].high = grade[t ++];//这里有点儿问题,当为grade[l]时有组测试数据错误return ;}int mid = (l+r)/2;initTree(l, mid, i*2);initTree(mid+1, r, i*2+1);no[i].high = maxh(no[i*2].high, no[i*2+1].high);}//修改void modify(int l, int r, int i, int tmp, int value){if(no[i].left==no[i].right){no[i].high = value;return ;}int mid = (no[i].left+no[i].right)/2;if(tmp <= mid){modify(l, r, i*2, tmp, value);}else {modify(l, r, i*2+1, tmp, value);}no[i].high = maxh(no[i*2].high, no[i*2+1].high);}int tmpgd;//查询void query(int start, int end, int i){if(no[i].left==start&&no[i].right==end){if(tmpgd<no[i].high)tmpgd = no[i].high;return ;}int mid = (no[i].left+no[i].right)/2;if(end <= mid){query(start, end, i*2);}else if(start > mid){query(start, end, i*2+1);}else {query(start, mid, i*2);query(mid+1, end, i*2+1);}}int main(){//freopen("input.txt","r",stdin);int i;char c[2];int a, b;while(scanf("%d%d", &n, &m)!=EOF){for(i = 0; i < n; i ++){scanf("%d", &grade[i]);}t = 0;initTree(1, n, 1);while(m--){scanf("%s%d%d", c, &a, &b);if(c[0] == 'U')modify(1, n, 1, a, b);else {tmpgd = 0;query(a, b, 1);printf("%d\n", tmpgd);}}}return 0;}


原创粉丝点击