HDOJ1754 I Hate It 【线段树】

来源:互联网 发布:js控制div显示隐藏 编辑:程序博客网 时间:2024/06/16 17:43

I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 35417    Accepted Submission(s): 13958


Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
 

Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
学生ID编号分别从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
 

Output
对于每一次询问操作,在一行里面输出最高成绩。
 

Sample Input
5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5
 

Sample Output
5659
Hint
Huge input,the C function scanf() will work better than cin

这题验证了宏定义要比自定义函数慢。但不知道为啥,然后问了下老师,答复是“函数调用参数是计算好的,只计算一次;宏定义没有计算,运行时每次都要计算。”

Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor

109557212014-07-07 11:20:55Accepted17541109MS7156K1513 BG++长木109556852014-07-07 11:18:05Time Limit Exceeded17543000MS7144K1491 BG++长木

最新代码:

#include <stdio.h>#include <string.h>#define maxn 200002#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1int tree[maxn << 2];int max(int a, int b){return a > b ? a : b;}void pushUp(int rt){tree[rt] = max(tree[rt << 1], tree[rt << 1 | 1]);}void build(int l, int r, int rt){if(l == r){scanf("%d", &tree[rt]);return;}int mid = (l + r) >> 1;build(lson);build(rson);pushUp(rt);}void update(int pos, int val, int l, int r, int rt){if(l == r){tree[rt] = val; return;}int mid = (l + r) >> 1;if(pos <= mid) update(pos, val, lson);else update(pos, val, rson);pushUp(rt);}int query(int left, int right, int l, int r, int rt){if(left == l && right == r) return tree[rt];int mid = (l + r) >> 1;if(right <= mid) return query(left, right, lson);else if(left > mid) return query(left, right, rson);else return max(query(left, mid, lson), query(mid + 1, right, rson));}int main(){int n, m, a, b;char com[2];while(scanf("%d%d", &n, &m) != EOF){build(1, n, 1);while(m--){scanf("%s%d%d", com, &a, &b);if(com[0] == 'Q') printf("%d\n", query(a, b, 1, n, 1));else update(a, b, 1, n, 1);}}return 0;}



AC:

#include <stdio.h>#define maxn 200002struct Node{int left, right;int max;} tree[maxn << 2];int stu[maxn];int MAX(int a, int b){return a > b ? a : b;}void build(int left, int right, int rt){tree[rt].left = left; tree[rt].right = right;if(left == right){tree[rt].max = stu[left]; return;}int mid = (left + right) >> 1;build(left, mid, rt << 1);build(mid + 1, right, rt << 1 | 1);tree[rt].max = MAX(tree[rt<<1].max, tree[rt<<1|1].max);}void update(int pos, int val, int rt){if(tree[rt].left == tree[rt].right){tree[rt].max = val; return;}int mid = (tree[rt].left + tree[rt].right) >> 1;if(pos <= mid) update(pos, val, rt << 1);else update(pos, val, rt << 1 | 1);tree[rt].max = MAX(tree[rt<<1].max, tree[rt<<1|1].max);}int query(int left, int right, int rt){if(tree[rt].left == left && right == tree[rt].right){return tree[rt].max;}int mid = (tree[rt].left + tree[rt].right) >> 1;if(right <= mid) return query(left, right, rt << 1);else if(left > mid) return query(left, right, rt << 1 | 1);return MAX(query(left, mid, rt << 1), query(mid+1, right, rt<<1|1));}int main(){int N, M, i, m, n;char com[2];while(scanf("%d%d", &N, &M) == 2){for(i = 1; i <= N; ++i)scanf("%d", stu + i);build(1, N, 1);while(M--){scanf("%s%d%d", com, &m, &n);if(com[0] == 'U') update(m, n, 1);else printf("%d\n", query(m, n, 1));}}return 0;}


TLE::

#include <stdio.h>#define MAX(a, b) a > b ? a : b#define maxn 200002struct Node{    int lson, rson;    int max;} tree[maxn << 2];int stu[maxn];void build(int left, int right, int rt){    tree[rt].lson = left; tree[rt].rson = right;    if(left == right){        tree[rt].max = stu[left]; return;    }        int mid = (left + right) >> 1;    build(left, mid, rt << 1);    build(mid + 1, right, rt << 1 | 1);        tree[rt].max = MAX(tree[rt<<1].max, tree[rt<<1|1].max);}void update(int pos, int val, int rt){    if(tree[rt].lson == tree[rt].rson){        tree[rt].max = val; return;    }        int mid = (tree[rt].lson + tree[rt].rson) >> 1;    if(pos <= mid) update(pos, val, rt << 1);    else update(pos, val, rt << 1 | 1);        tree[rt].max = MAX(tree[rt<<1].max, tree[rt<<1|1].max);}int query(int left, int right, int rt){    if(tree[rt].lson == left && right == tree[rt].rson){        return tree[rt].max;    }        int mid = (tree[rt].lson + tree[rt].rson) >> 1;    if(right <= mid) return query(left, right, rt << 1);    else if(left > mid)         return query(left, right, rt << 1 | 1);    return MAX(query(left, mid, rt << 1), query(mid+1, right, rt<<1|1));}int main(){    int N, M, i, m, n;    char com[2];    while(scanf("%d%d", &N, &M) == 2){        for(i = 1; i <= N; ++i)            scanf("%d", stu + i);        build(1, N, 1);                while(M--){            scanf("%s%d%d", com, &m, &n);                        if(com[0] == 'U') update(m, n, 1);            else printf("%d\n", query(m, n, 1));        }    }    return 0;}

2015.1.28更新

#include <stdio.h>#include <string.h>#define maxn 200002#define lson l, mid, rt << 1#define rson mid + 1, r, rt << 1 | 1int T[maxn << 2]; int N, M;int max(int a, int b) { return a > b ? a : b; }void pushUp(int rt) {T[rt] = max(T[rt<<1], T[rt<<1|1]);}void build(int l, int r, int rt) {if (l == r) {scanf("%d", &T[rt]);return;}int mid = l + r >> 1;build(lson);build(rson);pushUp(rt);}void update(int pos, int val, int l, int r, int rt) {if (l == r) {T[rt] = val; return;}int mid = l + r >> 1;if (pos <= mid) update(pos, val, lson);else update(pos, val, rson);pushUp(rt);}int query(int L, int R, int l, int r, int rt) {if (L == l && R == r) {return T[rt];}int mid = l + r >> 1;if (R <= mid) return query(L, R, lson);else if (L > mid) return query(L, R, rson);return max(query(L, mid, lson), query(mid + 1, R, rson));}int main() {freopen("stdin.txt", "r", stdin);int i, j, a, b;char com[2];while (~scanf("%d%d", &N, &M)) {build(1, N, 1);while (M--) {scanf("%s%d%d", com, &a, &b);if (*com == 'U') update(a, b, 1, N, 1);else printf("%d\n", query(a, b, 1, N, 1));}}return 0;}




0 0
原创粉丝点击