线段树专题

来源:互联网 发布:淘宝网店装修多少钱 编辑:程序博客网 时间:2024/05/17 21:39
hdu1166  http://acm.hdu.edu.cn/showproblem.php?pid=1166
#include<cstdio>#define lson l, m, rt << 1#define rson m+1, r, rt <<1 | 1const int maxn = 55555;int sum[maxn << 2];void pushup(int rt){    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){    if (l == r){        scanf("%d", &sum[rt]);        return;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt);}void update(int p, int add, int l, int r, int rt){    if (l == r){        sum[rt] += add;        return;    }    int m = (l + r) >> 1;    if (p <= m) update(p, add, lson);    else update(p, add, rson);    pushup(rt);}int query(int L, int R, int l, int r, int rt){    if (L <= l && r <= R) {        return sum[rt];    }    int m = (l + r) >> 1;    int ret = 0;    if (L <= m) ret += query(L, R, lson);    if (R > m) ret += query(L, R, rson);    return ret;}int main(){    int test, n;    scanf("%d", &test);    for (int t = 1; t <= test; t++){        printf("Case %d:\n", t);        scanf("%d",&n);        build(1, n, 1);        char op[10];        while(scanf("%s",op)){            if (op[0] == 'E') break;            int a,b;            scanf("%d%d",&a, &b);            if (op[0] == 'Q')                printf("%d\n", query(a, b, 1, n, 1));            else if (op[0] == 'S')                update(a, -b, 1, n, 1);            else update(a, b, 1, n, 1);        }    }    return 0;}

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

#include<cstdio>#include<algorithm>#include<cstring>#define lson l, m, rt << 1#define rson m+1, r, rt <<1 | 1const int maxm = 222222;int sum[maxm << 2];void pushup(int rt){    sum[rt] = std::max(sum[rt << 1], sum[rt << 1 | 1]);}void build(int l, int r, int rt){    if (l == r) {        scanf("%d",&sum[rt]);        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt);}void updata(int p, int prc, int l, int r, int rt){    if (l == r){        sum[rt] = prc;        return;    }    int m = (l + r) >> 1;    if (p <= m) updata(p, prc, lson);    if (p > m) updata(p, prc, rson);    pushup(rt);}int query(int L, int R, int l, int r, int rt){    if (L <= l && r <= R){        return sum[rt];    }    int m = (l + r) >> 1;    int maxn = 0;    if (L <= m) maxn = std::max(maxn, query(L, R, lson));    if (R > m) maxn = std::max(maxn, query(L, R, rson));    return maxn;}int main(){    int n, m;    while(~scanf("%d%d", &n, &m)){        memset(sum, 0, sizeof(sum));        build(1, n, 1);        while(m--){            char c[2];            int a, b;            scanf("%s%d%d", c, &a, &b);            if (c[0] == 'Q')                printf("%d\n",query(a, b, 1, n, 1));            else updata(a, b, 1, n, 1);        }    }}

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

因为本身建树会达到4*10^9,明显不行,考虑到海报数量,即使不覆盖的贴,也就200000个,即最多2000000个叶子。

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define lson l, m, rt << 1#define rson m+1, r, rt <<1 | 1const int maxm = 200005;int sum[maxm << 2];int h,n,w,p,post;void pushup(int rt){    sum[rt] = std::max(sum[rt << 1], sum[rt << 1|1]);}void build(int l, int r, int rt){    if (l == r){        sum[rt] = w;        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt);}void updata(int p, int l, int r, int rt){    if (l == r){        if (sum[rt] >= p) {            sum[rt] -= p;            post = l;        }else post = -1;        return ;    }    if (sum[rt] < p) {        post = -1;        return ;    }    int m = (l + r) >> 1;    if (sum[rt << 1] >= p) updata(p, lson);    else updata(p, rson);    pushup(rt);}int main(){    while(std::cin >> h >> w >> n){        memset(sum, 0, sizeof(sum));        int nn = std::min(h, n);        build(1, nn, 1);        while(n--){            std::cin >> p;            updata(p, 1, nn, 1);            printf("%d\n", post);        }    }}

poj2886 http://poj.org/problem?id=2886

编完头脑发晕啊,各种细节要注意。。。

#include<iostream>#include<cstdio>#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1using namespace std;const int maxn = 2222222;int sum[maxn << 2];int pos;struct aaa{    char name[15];    int val;}a[maxn];const int antiprime[]={1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,20160,25200,27720,45360,50400,55440,83160,110880,166320,221760,277200, 332640,498960,554400,665280}; /// 反素数表, 反素数指1-n中含有素因子数最多的数const int factorNum[]={1,2,3,4,6,8,9,10,12,16,18,20,24,30,32,36,40,48,60,64,72,80,84, 90,96,100,108,120,128,144,160,168,180,192,200,216,224};/// 反素数对应的约数个数void pushup(int rt){    sum[rt] = sum[rt<< 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){    if (l == r){        sum[rt] = 1;        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt);}void updata(int k, int l, int r, int rt){    if (l == r){        sum[rt] = 0;        pos = l;        return ;    }    int m = (l + r) >> 1;    if (k <= sum[rt << 1]) updata(k, lson);    else updata(k-sum[rt << 1], rson);    pushup(rt);}int main(){    int n, k;    while(cin >> n >> k){        for (int i = 0; i < n; i++){            scanf("%s%d",&a[i+1].name, &a[i+1].val);        }        build(1, n, 1);        int cnt = 0;        while (cnt < 35 && antiprime[cnt] <= n) cnt++;        cnt--;        updata(k,1,n,1);        for (int i = 1; i < antiprime[cnt]; i++){            int mod = sum[1];            if (a[pos].val > 0) {                k = (k + a[pos].val - 1) % mod;                if ( k == 0 ) k = mod;            }else{                k = (k + a[pos].val) % mod;                if (k <= 0) k += mod;            }            updata(k, 1, n, 1);        }        printf("%s %d\n",a[pos].name, factorNum[cnt]);    }}


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

#include<iostream>#include<cstdio>#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1using namespace std;const int maxn = 2222222;int sum[maxn << 2];int flag[maxn << 2];void down(int rt, int l, int r){    if (flag[rt]){        flag[rt << 1] = flag[rt << 1 |1] = flag[rt];        int m = (l + r) >> 1;        sum[rt << 1] = (m - l + 1) *flag[rt];        sum[rt << 1|1] = (r - m)*flag[rt];        flag[rt] = 0;    }}void pushup(int rt){    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){    flag[rt] = 0;    if (l == r){        sum[rt] = 1;        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt);}void updata(int x, int y, int z, int l, int r, int rt){    if (x <= l && r <= y){        sum[rt] = (r - l + 1) * z;        flag[rt] = z;        return ;    }    down(rt, l, r);    int m = (l + r) >> 1;    if (y <= m) updata(x, y, z ,lson);    else if (x > m) updata(x, y, z, rson);    else {        updata(x, y, z, lson);        updata(x, y, z, rson);    }    pushup(rt);}void query(int l, int r){}int main(){    int test, n, x, y, z, op;    cin >> test;    for (int t = 0; t < test; t++){        cin >> n;        build(1, n, 1);        cin >> op;        while(op--){            cin >> x >> y >> z;            updata(x, y, z, 1, n, 1);        }        cout << "Case " << t+1 << ": The total value of the hook is " <<  sum[1] << "."<< endl;    }}

poj3468 http://poj.org/submit?problem_id=3468

#include<iostream>#include<cstdio>#include<cstring>#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1#define ll long longusing namespace std;const int maxn = 2222222;ll sum[maxn << 2];ll flag[maxn << 2];void down(int rt, int l, int r){    if (flag[rt]){        int m = (l + r) >> 1;        flag[rt << 1] += flag[rt];        flag[rt << 1|1] += flag[rt];        sum[rt << 1] += (m -l + 1)*flag[rt];        sum[rt << 1|1] += (r-m)*flag[rt];        flag[rt] = 0;    }}void pushup(int rt){    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];}void build(int l, int r, int rt){    flag[rt] = 0;    if (l == r) {        cin >> sum[rt];        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt);    //cout << l << " " << r << " " << sum[rt] << endl;}void updata(int a, int b, ll c, int l, int r, int rt){        if (a <= l && r <= b){            flag[rt] += c;            sum[rt] += (r - l + 1) * c;            return ;        }        down(rt, l, r);        int m = (l + r) >> 1;        if (b <= m) updata(a, b, c, lson);        else if (a > m) updata(a, b, c, rson);        else{            updata(a, m, c, lson);            updata(m+1, b, c, rson);        }        pushup(rt);}ll query(int a, int b, int l, int r, int rt){       // cout << l << " " << r << " " << sum[rt] << endl;        if (a<= l && r <= b){            return sum[rt];        }        down(rt, l, r);        int m = (l + r) >> 1;        ll ans = 0;        if (b <= m) return query(a, b, lson);        else if (a > m) return query(a, b, rson);        else{            ans += query(a, m, lson);            ans += query(m+1, b, rson);            return ans;        }}int main(){        int n, q, a, b;        ll c;        cin >> n >> q;        build(1, n, 1);        while(q--){            char ch;            cin >> ch;            if (ch == 'Q'){                cin >> a >> b;                cout << query(a, b, 1, n, 1) << endl;            }else{                cin >> a >> b >> c;                updata(a, b, c, 1, n, 1);            }        }}

poj2528

#include<iostream>#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <cmath>#include <algorithm>#define lson l, m, rt << 1#define rson m+1, r, rt << 1|1using namespace std;const int maxn = 20002;int sum[maxn << 2];int dd[maxn << 2];int d[maxn << 2];bool v[maxn << 2];struct aaa{     int l;     int r;}a[maxn << 2];int ans, e;void pushup(int rt){     sum[rt] = sum[rt<< 1] && sum[rt << 1|1]; }void build(int l, int r, int rt){     if (l == r){           sum[l] = 0;           return ;     }     int m = (l + r) >> 1;     build(lson);     build(rson);     pushup(rt);}void updata(int tl, int tr, int l, int r, int rt, int pos){     if (sum[rt]) return ;     if ( tl <= l && r <= tr){          sum[rt] = 1;          if (!v[pos]){             ans++;             v[pos] = true;          }          return ;     }          int m = (l + r) >> 1;     if (tl <= m) updata(tl, tr, lson, pos);     if (m < tr) updata(tl, tr, rson, pos);     pushup(rt);}int get(int x){    int l = 1; int r = e;     while(l <= r){        int m = ( l + r ) >> 1;        if (d[m] == x) return m;        if (d[m] > x) r = m-1;        else l = m + 1;    }}int main(){    int ase, n;    cin >> ase;    while(ase--)    {        memset(v,0,sizeof(v));        ans = 0;        cin >> n;        int ep = 0;        for (int i = 0; i < n; i++)        {            cin >> a[i].l >> a[i].r;            dd[++ep] = a[i].l;            dd[++ep] = a[i].r;        }        sort(dd+1, dd+ ep + 1);        e = 1;        d[1] = dd[1];                for (int i = 2; i <= ep; i++)        {            if (dd[i] != d[e]) d[++e] = dd[i];        }                for (int i = e; i >1; i--)        {            if (d[i] > d[i-1]+1) d[++e] = d[i-1] + 1;        }                sort(d+1, d+e+1);                build(1, n, e);        //cout << "*****************";        for (int i = 0; i < n; i++){            int l = get(a[i].l);            int r = get(a[i].r);            updata(d[l], d[r], 1, e, 1, i);        }        cout << ans << endl;        }}                                          

hdoj3308

#include<iostream>#include <iostream>#include <cstdio>#include <cstring>#include <map>#include <cmath>#include <algorithm>#define lson l, m, rt << 1#define rson m+1, r, rt << 1|1using namespace std;const int maxn = 100005;int a[maxn];struct aaa{    int l;    int r;    int m;}tree[maxn << 2];void pushup(int rt, int l, int r){    int ll = rt << 1;    int rr = rt << 1|1;    tree[rt].l = tree[ll].l;    tree[rt].r = tree[rr].r;    tree[rt].m = max(tree[ll].m, tree[rr].m);    int m = (l +r) >> 1;    if (a[m] < a[m+1]){        if (tree[ll].l == m - l + 1) tree[rt].l += tree[rr].l;        if (tree[rr].r == r-m) tree[rt].r += tree[ll].r;        int t = tree[ll].r + tree[rr].l;        if (t > tree[rt].m) tree[rt].m = t;    }}void build(int l, int r, int rt){    if (l == r){        tree[rt].l = tree[rt].m = tree[rt].r = 1;        cin >> a[l];        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt, l, r);}void updata(int x, int y, int l, int r, int rt){    if (l == r){        a[l] = y;        return ;    }    int m = (l + r) >> 1;    if (x <= m) updata(x,y,lson);    else updata(x,y,rson);    pushup(rt,l,r);}int query(int ll, int rr, int l, int r, int rt){    if (ll <= l && r <= rr){        return tree[rt].m;    }    int m = (l+r) >> 1;    int t1 = 0;    int t2 = 0;    ///*    if (ll <= m) t1 = query(ll, rr, lson);    if (rr > m) t2 = query(ll, rr, rson);    int t = max(t1, t2);    if (a[m] < a[m+1]){        t1 = min(tree[rt << 1].r, m-ll+1);        t2 = min(tree[rt << 1|1].l, rr-m);        t1+= t2;        t = max(t1,t);    }    return t;        /*    if (rr <= m) return query(ll,rr,lson);    else if (ll > m) return query(ll,rr,rson);    else{        t1 = query(ll,m,lson);        t2 = query(m+1,rr,rson);        int t = max(t1,t2);        if (a[m] < a[m+1]){            t1 = min(tree[rt<<1].r, m-ll+1);            t2 = min(tree[rt<<1|1].l, rr - m);            t1+=t2;        }        return max(t,t1);    }    */}int main(){    int t, n, m;    cin >> t;    while(t--){        cin >> n >> m;        build(1, n, 1);        while(m--){            char ch[5];            int l, r;            scanf("%s%d%d",ch,&l,&r);            if (ch[0] == 'Q'){                cout << query(++l,++r,1,n,1) << endl;            }else{                updata(++l,r,1,n,1);            }        }    }}



0 0
原创粉丝点击