线段树专题#3_蒟蒻训练历程记录_HDU1754_I hate It

来源:互联网 发布:mysql 修改约束条件 编辑:程序博客网 时间:2024/06/07 08:13

              裸线段树,唯一的坑点是更新的时候必须向上一起更新,如果写成两个更新函数那么就会超时。。还是代码写丑了。。

#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdlib>#include<cstdio>#include<cmath>#include<cstring>#include<vector>#include<map>#include<algorithm>#include<queue>#include<stack>//线段树单点更新查询 using namespace std;typedef long long ll;#define N 200010int g[4*N];int a[N];void init(int rt, int l, int r){    if(l == r){g[rt] = a[l];return;}int mid = (l+r)>>1;init(rt<<1, l, mid);init(rt<<1|1, mid+1, r);}int PushUp(int rt, int l, int r){if(l == r){return g[rt];}int mid = (l+r)>>1;int k1 = PushUp(rt<<1, l, mid);int k2 = PushUp(rt<<1|1, mid+1, r);return g[rt] = max(k1, k2);}int find(int rt, int l, int r, int L, int R){if(l >= L && r <= R){return g[rt];}int mid = (l+r)>>1;int k1 = 0, k2 = 0;if(mid >= L){k1 = find(rt<<1, l, mid, L, R);}if(mid < R){k2 = find(rt<<1|1, mid+1, r, L, R);}return max(k1, k2);}int Update(int rt, int l, int r, int x, int k){if(l == r && x == l){g[rt] = k;return k;}int mid = (l+r)>>1, ans;if(x <= mid){ans = max(k, g[rt]);Update(rt<<1, l, mid, x, k);}else{ans = max(k, g[rt]);Update(rt<<1|1, mid+1, r, x, k);}return g[rt] = ans;}int main(){int n, m;while(~scanf("%d%d", &n, &m)){memset(g, 0, sizeof(g)); for(int i = 1; i <= n; i++)   scanf("%d", & a[i]);init(1, 1, n);PushUp(1, 1, n);//getchar();while(m--)    {    int l, r;    char q;    cin >> q >> l >> r;    if(q == 'Q')    {    int ans = find(1, 1, n, l, r);    printf("%d\n", ans);    }    else if(q == 'U')    {    Update(1, 1, n, l, r);//Updata里面要有自动更新的功能否则会超时     //PushUp(1, 1, n);    }    } }return 0;}


0 0
原创粉丝点击