hdu1556Color the ball(线段树)

本来感觉自己不会,然后看了一个特别骚的做法

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define ll long long
#define ld long double
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define lcm(a,b) ((a)*(b)/(__gcd((a),(b))))
#define Max 100010
#define mod 1000000007
using namespace std;
int n, tree[Max << 2];
vector<int>v;
void pushdown(int rt) {
    tree[rt << 1] += tree[rt];
    tree[rt << 1 | 1] += tree[rt];
}
void update(int L, int R, int l, int r, int rt) {
    if(L <= l && r <= R) {
        tree[rt]++;//先对根树操作,再在sum函数中一次性的下推到子树。。这看了一会才会,被我的模板限制住思想了,一直在想为什么没有pushup。。看来还是要跳出去。
        return;
    }
    int m = (l + r) >> 1;
    if(m >= L)
        update(L, R, l, m, rt << 1);
    if(m < R)
        update(L, R, m + 1, r, rt << 1 | 1);
}
void sum(int l, int r, int rt) {
    if(l == r) {
        v.push_back(tree[rt]);
        return;
    }
    pushdown(rt);
    int m = (r + l) >> 1;
    sum(l, m, rt << 1);
    sum(m + 1, r, rt << 1 | 1);
}
int main() {
    while(cin >> n && n) {
        me(tree), v.clear();
        for(int a, b, i = 0; i < n; i++) {
            cin >> a >> b;
            update(a, b, 1, n, 1);
        }
        sum(1, n, 1);
        for(int i = 0; i < v.size() - 1; i++) {
            cout << v[i] << " ";
        }
        cout << v[v.size() - 1] << endl;
    }
    return 0;
}

我的传统辣鸡做法 

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define ll long long
#define ld long double
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define lcm(a,b) ((a)*(b)/(__gcd((a),(b))))
#define Max 100010
#define mod 1000000007
using namespace std;
int n, tree[Max << 2], lz[Max << 2];
void pushup(int rt) {
    tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];
}
void pushdown(int rt, int ln, int rn) {
    if(lz[rt]) {
        lz[rt << 1] += lz[rt];
        lz[rt << 1 | 1] += lz[rt];
        tree[rt << 1] += lz[rt] * ln;
        tree[rt << 1 | 1] += lz[rt] * rn;
        lz[rt] = 0;
    }
}
void update(int L, int R, int l, int r, int rt) {
    if(L <= l && r <= R) {
        tree[rt] += (r - l + 1);
        lz[rt] += 1;
        return;
    }
    int m = (l + r) >> 1;
    pushdown(rt, m - l + 1, r - m);
    if(m >= L)
        update(L, R, l, m, rt << 1);
    if(m < R)
        update(L, R, m + 1, r, rt << 1 | 1);
    pushup(rt);
}

int query(int L, int R, int l, int r, int rt) {
    if(L <= l && r <= R) {
        return tree[rt];
    }
    int m = (r + l) >> 1;
    pushdown(rt, m - l + 1, r - m);
    int ans = 0;
    if(L <= m)
        ans += query(L, R, l, m, rt << 1);
    if(R > m)
        ans += query(L, R, m + 1, r, rt << 1 | 1);
    return ans;
}
int main() {
    while(cin >> n && n) {
        me(tree), me(lz);
        for(int a, b, i = 0; i < n; i++) {
            cin >> a >> b;
            update(a, b, 1, n, 1);
        }
        for(int i = 1; i < n; i++) {
            cout << query(i, i, 1, n, 1) << " ";
        }
        cout << query(n, n, 1, n, 1) << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Endeavor_G/article/details/88647223
今日推荐