题目链接:HDU 1754 I Hate It
线段树 单点更新 基础题目
刚开始学,感觉挺难。
用cin会超时。
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; const int MAX_N = 200000 + 100; const int MAX_M = 4 * MAX_N; int n,m,res; int a[MAX_N]; struct Node { int left,right,_max; }; Node node[MAX_M]; void build(int l,int r,int i) { node[i].left = l; node[i].right = r; if(node[i].left == node[i].right) { node[i]._max = a[l]; return; } int mid = (l + r) >> 1; build(l,mid,i << 1); build(mid + 1,r,i << 1 | 1); node[i]._max = max(node[i << 1]._max,node[i << 1 | 1]._max); } void update(int A,int B,int i) { if(node[i].left == A && node[i].right == A) { node[i]._max = B; return; } int mid = (node[i].left + node[i].right) >> 1; if(A <= mid) update(A,B,i << 1); else update(A,B,i << 1 | 1); node[i]._max = max(node[i << 1]._max,node[i << 1 | 1]._max); } void query(int l,int r,int i) { if(node[i].left == l && node[i].right == r) { res = max(res,node[i]._max); return; } int mid = (node[i].left + node[i].right) >> 1; if(mid < l) query(l,r,i << 1 | 1); else if(mid >= r) query(l,r,i << 1); else { query(mid + 1,r,i << 1 | 1); query(l,mid,i << 1); } } int main() { //while(cin >> n >> m) while(scanf("%d%d",&n,&m) != EOF) { memset(a,0,sizeof(a)); for(int i = 1;i <= n;i++) //cin >> a[i]; scanf("%d",&a[i]); build(1,n,1); char c; int A,B; for(int i = 0;i < m;i++) { // cin >> c >> A >> B; scanf("%s%d%d",&c,&A,&B); if(c == 'Q') { res = 0; query(A,B,1); //cout << res << endl; printf("%d\n",res); } else if(c == 'U') update(A,B,1); } } return 0; }