zoukankan      html  css  js  c++  java
  • Transformation HDU

    简单线段树操作

    咕咕咕

    Transformation HDU - 4578 vj

    talk is cheap, chow the code.

    #include <iostream>
    #include <cstring>
    using namespace std;
    typedef long long ll;
    const ll N = 2e5+99;
    const ll mod = 10007;
    
    
    
    struct segment_tree {
        #define pl (p << 1)
        #define pr (p << 1 | 1)
        struct tree {
           ll data, data2 ,data3; 
           ll add;
           ll c;
           ll mul;
        }tr[N << 2];
        inline void pushup(ll p) {
            (tr[p].data = tr[pl].data + tr[pr].data)%=mod;
            (tr[p].data2 = tr[pl].data2 + tr[pr].data2) %= mod;
            (tr[p].data3 = tr[pl].data3 + tr[pr].data3) %= mod;
        }
        inline void pushdown(ll s, ll t, ll p) {
            ll mid = (s + t) >> 1;
            if (tr[p].c != -1) {
                (tr[pl].data = tr[p].c * (mid -s + 1))%=mod;
                (tr[pl].data2 = tr[p].c*tr[p].c%mod * (mid - s + 1)) %= mod;
                (tr[pl].data3 = tr[p].c *tr[p].c%mod*tr[p].c % mod * (mid - s + 1)) %= mod;
                (tr[pr].data = tr[p].c * (t - mid)) %= mod;
                (tr[pr].data2 = tr[p].c * tr[p].c % mod * (t - mid)) %= mod;
                (tr[pr].data3 = tr[p].c *tr[p].c%mod*tr[p].c % mod * (t - mid)) %= mod;
                tr[pl].c  = tr[p].c;
                tr[pr].c  = tr[p].c;
                if (tr[p].c != -1) {
                    tr[pl].add = tr[pr].add = 0;
                    tr[pl].mul = tr[pr].mul = 1;
                }
            }
            (tr[pl].data *= tr[p].mul)%=mod;
            (tr[pl].data2 *= tr[p].mul*tr[p].mul%mod) %= mod;
            (tr[pl].data3 *= tr[p].mul*tr[p].mul%mod * tr[p].mul%mod) %= mod;
            (tr[pr].data *= tr[p].mul) %= mod;
            (tr[pr].data2 *= tr[p].mul * tr[p].mul % mod) %= mod;
            (tr[pr].data3 *= tr[p].mul * tr[p].mul % mod * tr[p].mul % mod) %= mod;
            (tr[pr].mul *= tr[p].mul)%=mod;
            (tr[pl].mul *= tr[p].mul)%=mod;
            
    
            (tr[pl].data3 += 3*tr[p].add * tr[pl].data2%mod+3*tr[p].add*tr[p].add%mod*tr[pl].data%mod + tr[p].add*tr[p].add%mod*tr[p].add%mod*(mid - s+1)%mod)%=mod;
            (tr[pl].data2 += 2 * tr[p].add*(tr[pl].data)%mod+tr[p].add*tr[p].add%mod*(mid - s+1))%=mod;
            (tr[pl].data += tr[p].add * (mid - s+1))%=mod;
    
    
            (tr[pr].data3 += 3*tr[p].add * tr[pr].data2%mod+3*tr[p].add*tr[p].add%mod*tr[pr].data%mod + tr[p].add*tr[p].add%mod*tr[p].add%mod*(t - mid)%mod)%=mod;
            (tr[pr].data2 += 2 * tr[p].add*(tr[pr].data)%mod+tr[p].add*tr[p].add%mod*(t - mid))%=mod;
            (tr[pr].data += tr[p].add * (t - mid))%=mod;
    
    
            (tr[pl].add *= tr[p].mul)%=mod;
            (tr[pr].add *= tr[p].mul)%=mod;
            (tr[pl].add += tr[p].add)%=mod;
            (tr[pr].add += tr[p].add)%=mod;
    
    
            tr[p].mul = 1;
            tr[p].add = 0;
            tr[p].c = -1;
        }
        inline void add(ll s, ll t, ll l, ll r, ll p, ll c) {
            if (s >= l &&t <= r) {
                (tr[p].add+=c)%=mod;
                (tr[p].data3 += 3*c*tr[p].data2%mod+3*tr[p].data*c%mod*c%mod+c*c%mod*c%mod* ( t - s + 1)%mod) %= mod;
                (tr[p].data2 += 2*c%mod * tr[p].data % mod + c * c % mod * (t - s + 1)%mod) %= mod;
                (tr[p].data += c * ( t - s + 1)) %= mod;
                return;
            }        
            pushdown(s, t, p);
            ll mid = (s + t) >> 1;
            if (l <= mid)add(s, mid, l, r, pl, c);
            if (r >= mid + 1)add(mid + 1, t, l, r, pr, c);
            pushup(p);
        }
        inline void mul(ll s, ll t, ll l, ll r, ll p, ll c) {
            if (s >= l && t <= r) {
                (tr[p].mul *= c)%=mod;
                (tr[p].add *= c)%=mod;
                (tr[p].data *= c)%=mod;
                (tr[p].data2 *= c*c%mod)%=mod;
                (tr[p].data3 *= c*c%mod*c%mod)%=mod;
                return;
            } 
            pushdown(s, t, p);
            ll mid = (s + t) >> 1;
            if (l <= mid)mul(s, mid, l, r, pl, c);
            if (r >= mid + 1)mul(mid + 1, t, l, r,pr, c );
            pushup(p);
        }
        inline void change(ll s, ll t, ll l, ll r, ll p, ll c) {
            if (s >= l && t <= r) {
                tr[p].c = c;
                tr[p].add = 0;
                tr[p].mul = 1;
                (tr[p].data = c*(t-s+1))%=mod;
                (tr[p].data2 = c*c%mod*(t-s+1))%=mod;
                (tr[p].data3 = c*c%mod*c%mod*(t-s+1)%mod)%=mod;
                return;
            }
            pushdown(s, t, p);
            ll mid = (s + t ) >> 1;
            if (l <= mid)change(s, mid, l ,r, pl, c);
            if (r > mid)change(mid + 1, t, l, r, pr, c);
            pushup(p);
        }
        inline ll query(ll s, ll t, ll l, ll r, ll p, ll c) {
            ll mid = (s + t >> 1);
            pushdown(s, t, p);
            if (s >= l && t <= r)  {
                if (c == 1)
                return tr[p].data;
                if(c == 2)return tr[p].data2;
                if (c == 3)return tr[p].data3;
            }
            ll ret = 0;
            if (l <= mid) (ret += query(s, mid, l, r, pl, c))%=mod;
            if (r > mid) (ret += query(mid + 1, t, l, r, pr, c))%=mod;
            return ret;
           
        }
        inline void build(ll s, ll t, ll p) {
            tr[p].add = tr[p].data = tr[p].data2 = tr[p].data3 = 0;
            tr[p].c = -1;
            tr[p].mul = 1;
            if (s == t) {
                tr[p].data = 0;
                return;
            }
            ll mid = s+ t>>1;
            build(s, mid, pl);
            build(mid + 1, t, pr);
            pushup(p);
            return;
        }
    }T;
    
    int main() {
        ll n, m;
        ios::sync_with_stdio(0);
        while (cin >> n >> m) {
            if (n == 0 && m == 0)break;
            memset(T.tr, 0, sizeof T.tr);
            T.build(1, n, 1);
            while (m--) {
                ll opt;cin >> opt;
                ll x, y, c;
                cin >> x >> y >> c;
                if (opt == 1) 
                    T.add(1, n, x, y, 1, c%mod);
                if (opt == 2) 
                    T.mul(1, n, x, y, 1, c%mod);
                if (opt == 3)
                    T.change(1, n, x, y, 1, c%mod);
                if (opt == 4)
                    cout << T.query(1, n, x, y, 1, c)  <<'
    ';
            }
        }
        return 0;
    }
    
  • 相关阅读:
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓
    Spring中ClassPathXmlApplicationContext类的简单使用
    测试计划/系统风险 (设计方面、开发方面、测试本身 等风险)
    浏览器兼容
    4.0 爬虫
    2.1 IDEA
    2.3 接口测试
    1.1测试分类
    1.3 ODPS
    2.1 Word 插入 smartart、图表
  • 原文地址:https://www.cnblogs.com/Xiao-yan/p/14157025.html
Copyright © 2011-2022 走看看