zoukankan      html  css  js  c++  java
  • cf250D. The Child and Sequence(线段树 均摊复杂度)

    题意

    题目链接

    单点修改,区间mod,区间和

    Sol

    如果x > mod ,那么 x % mod < x / 2

    证明:

    即得易见平凡,

    仿照上例显然,

    留作习题答案略,

    读者自证不难。

    反之亦然同理,

    推论自然成立,

    略去过程Q.E.D.,

    由上可知证毕。

    然后维护个最大值就做完了。。

    复杂度不知道是一个log还是两个log,大概是两个吧(线段树一个+最多改log次。)

    #include<bits/stdc++.h> 
    #define Pair pair<int, int>
    #define MP(x, y) make_pair(x, y)
    #define fi first
    #define se second
    //#define int long long 
    #define LL long long 
    #define Fin(x) {freopen(#x".in","r",stdin);}
    #define Fout(x) {freopen(#x".out","w",stdout);}
    using namespace std;
    const int MAXN = 1e6 + 10, mod = 1e9 + 7, INF = 1e9 + 10;
    const double eps = 1e-9;
    template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
    template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
    template <typename A, typename B> inline LL add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
    template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
    template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
    template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
    template <typename A> inline void debug(A a){cout << a << '
    ';}
    template <typename A> inline LL sqr(A x){return 1ll * x * x;}
    inline int read() {
        char c = getchar(); int x = 0, f = 1;
        while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    int N, M, a[MAXN];
    #define ls k << 1
    #define rs k << 1 | 1
    LL sum[MAXN];
    int mx[MAXN];
    void update(int k) {
    	sum[k] = sum[ls] + sum[rs];
    	mx[k] = max(mx[ls], mx[rs]);
    }
    void Build(int k, int ll, int rr) {
    	if(ll == rr) {sum[k] = mx[k] = read(); return ;}
    	int mid =  ll + rr >> 1;
    	Build(ls, ll, mid); Build(rs, mid + 1, rr);
    	update(k);
    }
    LL Query(int k, int l, int r, int ql, int qr) {
    	if(ql <= l && r <= qr) return sum[k];
    	int mid = l + r >> 1;
    	if(ql > mid) return Query(rs, mid + 1, r, ql, qr);
    	else if(qr <= mid) return Query(ls, l, mid, ql, qr);
    	else return Query(ls, l, mid, ql, qr) + Query(rs, mid + 1, r, ql, qr);
    }
    void Modify(int k, int l, int r, int p, int v) {
    	if(l == r) {sum[k] = mx[k] = v; return ;}
    	int mid = l + r >> 1;
    	if(p <= mid) Modify(ls, l, mid, p, v);
    	else Modify(rs, mid + 1, r, p, v);
    	update(k); 
    }
    void Mod(int k, int l, int r, int ql, int qr, int x) {
    	if(mx[k] < x) return ;
    	if(l == r) {sum[k] = mx[k] % x; mx[k] %= x; return ;}
    	int mid = l + r >> 1;
    	if(ql <= mid) Mod(ls, l, mid, ql, qr, x);
    	if(qr  > mid) Mod(rs, mid + 1, r, ql, qr, x);
    	update(k);
    }
    signed main() {
        N = read(); M = read();
        Build(1, 1, N);
        while(M--) {
        	int opt = read();
        	if(opt == 1) {
        		int l = read(), r = read();
    			cout << Query(1, 1, N, l, r) << '
    '; 
    		} else if(opt == 2) {
    			int l = read(), r = read(), x = read();
    			Mod(1, 1, N, l, r, x); 
    		} else {
    			int k = read(), x = read();
    			Modify(1, 1, N, k, x);
    		}
    	}
        return 0;
    }
    /*
    
    */
    
  • 相关阅读:
    leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard
    leetcode 129. Sum Root to Leaf Numbers
    leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
    leetcode 402. Remove K Digits 、321. Create Maximum Number
    leetcode 139. Word Break 、140. Word Break II
    leetcode 329. Longest Increasing Path in a Matrix
    leetcode 334. Increasing Triplet Subsequence
    leetcode 403. Frog Jump
    android中webView加载H5,JS不能调用问题的解决
    通过nginx中转获取不到IP的问题解决
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/10347536.html
Copyright © 2011-2022 走看看