zoukankan      html  css  js  c++  java
  • CF438D The Child and Sequence

    题目传送门


    这道题的思路有点像这篇博客

    用线段树维护区间和、区间最大值。若区间最大值小于模数,则直接返回,不对此区间进行操作

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <ctime>
    #include <cstdlib>
    #include <cmath>
    #define LL long long
    #define ls p << 1
    #define rs p << 1 | 1
    #define mid ((l+r) >> 1)
    using namespace std;
    LL read() {
    	LL k = 0, f = 1; char c = getchar();
    	while(c < '0' || c > '9') {
    		if(c == '-') f = -1;
    		c = getchar();
    	}
    	while(c >= '0' && c <= '9')
    		k = k * 10 + c - 48, c = getchar();
    	return k * f;
    }
    int n, q;
    LL a[100010];
    struct zzz {
    	int l, r;
    	LL maxx, sum;
    }tree[100010 << 2];
    inline void up(int p) {
    	tree[p].sum = tree[ls].sum + tree[rs].sum;
    	tree[p].maxx = max(tree[ls].maxx, tree[rs].maxx);
    }
    void build(int l, int r, int p) {
    	tree[p].l = l, tree[p].r = r;
    	if(l == r) {
    		tree[p].maxx = tree[p].sum = a[l];
    		return ;
    	}
    	build(l, mid, ls); build(mid+1, r, rs);
    	up(p);
    }
    void upmod(int nl, int nr, int p, LL k) {
    	if(tree[p].maxx < k) return ;
    	int l = tree[p].l, r = tree[p].r;
    	if(l == r) {
    		tree[p].maxx %= k, tree[p].sum %= k; return ;	
    	}
    	if(nl <= mid) upmod(nl, nr, ls, k);
    	if(nr > mid) upmod(nl, nr, rs, k);
    	up(p);
    }
    void update(int pos, int p, LL k) {
    	int l = tree[p].l, r = tree[p].r;
    	if(l == r) {
    		tree[p].maxx = tree[p].sum = k;
    		return ;
    	}
    	if(pos <= mid) update(pos, ls, k);
    	else update(pos, rs, k);
    	up(p);
    } 
    LL query(int nl, int nr, int p) {
    	int l = tree[p].l, r = tree[p].r;
    	LL ans = 0;
    	if(nl <= l && nr >= r) return tree[p].sum;
    	if(nl <= mid) ans += query(nl, nr, ls);
    	if(mid < nr) ans += query(nl, nr, rs);
    	return ans;
    }
    int main() {
    	n = read(), q = read();
    	for(int i = 1; i <= n; ++i) a[i] = read();
    	build(1, n, 1);
    	while(q--) {
    		int opt = read();
    		if(opt == 1) {
    			int l = read(), r = read(); 
    			printf("%lld
    ", query(l, r, 1));
    		}
    		else if(opt == 2) {
    			int l = read(), r = read(); LL k = read();
    			upmod(l, r, 1, k);
    		}
    		else {
    			int k = read(); LL x = read();
    			update(k, 1, x);
    		}
    	}
        return 0;
    }
    
  • 相关阅读:
    优先队列用法详解
    chenzl
    2020面向对象程序设计寒假作业1
    1.自我介绍

    洛谷U32670 小凯的数字(比赛)
    洛谷1417 烹调方案
    高等软工课程总结
    西电B楼导航
    毕业前夕随想
  • 原文地址:https://www.cnblogs.com/morslin/p/11855875.html
Copyright © 2011-2022 走看看