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。
在每个测试的第一行,有两个正整数 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
5659HintHuge input,the C function scanf() will work better than cin
这题验证了宏定义要比自定义函数慢。但不知道为啥,然后问了下老师,答复是“函数调用参数是计算好的,只计算一次;宏定义没有计算,运行时每次都要计算。”
Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor109557212014-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
- HDOJ1754 I Hate It 【线段树】
- hdoj1754-I Hate It && 1166-敌兵布阵
- I Hate It (线段树)
- 线段树:I Hate It
- i hate it 线段树
- I Hate It 【线段树】
- I Hate It---线段树
- I hate it --线段树
- I Hate It (线段树)
- 线段树i hate it
- I Hate It(线段树)
- I hate it HDU【线段树】
- 线段树--【HDU I Hate It】
- HDU 1754 I Hate It 线段树
- [hdu] 1754 I hate it -- 线段树
- hdu 1754 -- I Hate It (线段树)
- HDU 1754 I Hate It 线段树
- POJ 1745 I HATE IT(线段树)
- linux内核2.6.3x-I2C support
- mininet simulate OVS with ssl session
- Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
- 优秀的习惯
- CC++初学者编程教程(16) 搭建Xcode cocos2dx开发环境
- HDOJ1754 I Hate It 【线段树】
- 通配符与正则表达式
- Html中给select的option选项中添加上下标
- orcad转PADS Layout
- Resources$NotFoundException drawable-xhdpi from drawable resource
- win7下mini2440 USB下载驱动安装
- TortoiseSVN使用教程
- linux内核2.6.3x--Firmware Drivers、File systems
- 2012金华邀请赛解题报告