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

    https://www.luogu.org/problem/CF438D

    题意

    给定数列,区间查询和,区间取模,单点修改。

    n,m小于10^5

    分析

    和花神那题一样,i%k运算可以考虑, i < k时, i不变,所以我们可以维护区间最大值,在给区间[l,r]中的每个元素%k的时候,只要max < k, 就直接return, 由此提速

    (提醒: 千万不要用前一题(指花神)的思路解析后一题, 即使他们的做法很相像,但是也要认真写,认真想....我一开始居然维护的是这个区间中每个元素是不是全为0....这个受了花神那题的影响,不是正解, 这样会TLE

    (注意: 在计算的时候一定要把long long 啊, int强制转换啊,对应好

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define MAX 190000+99
    #define ll long long
    
    int n,m;
    ll a[MAX];
    struct node{
    	ll sum, mx;
    }tr[MAX<<2];
    
    void push_up(int o) {
    	tr[o].sum = tr[o<<1].sum + tr[o<<1|1].sum ;
    	tr[o].mx = max(tr[o<<1].mx , tr[o<<1|1].mx );
    }
    void build(int o, int l, int r) {
    	if(l == r) {
    		tr[o].sum = a[l];
    		tr[o].mx = a[l];
    		return ;
    	}
    	int mid = (l+r)>>1;
    	build(o<<1, l, mid);
    	build(o<<1|1, mid+1, r);
    	push_up(o);
    } 
    
    void update(int o, int l, int r, int x, int v) {
    	if(l == r) {
    		tr[o].sum = (ll)v;
    		tr[o].mx = (ll)v;
    		return ;
    	}
    	int mid = (l+r)>>1;
    	if(x <= mid) update(o<<1, l, mid, x, v);
    	else update(o<<1|1, mid+1, r, x, v);
    	push_up(o);
    }
    
    void optmo(int o, int l, int r, int ql, int qr, int k) {
    	if(tr[o].mx < k) return ;
    	if(l == r) {
    		tr[o].sum = tr[o].sum % k;
    		tr[o].mx = tr[o].mx % k;
    		return ;
    	}
    	int mid = (l+r)>>1;
    	if(ql <= mid) optmo(o<<1, l, mid, ql, qr, k);
    	if(mid < qr) optmo(o<<1|1, mid+1, r, ql, qr, k);
    	push_up(o);
    }
    
    ll query(int o, int l, int r, int ql, int qr) {
    	if(ql <= l && r <= qr) return (ll)tr[o].sum ;
    	int mid = (l+r)>>1;
    	ll ans = 0;
    	if(ql <= mid) ans += query(o<<1, l, mid, ql, qr);
    	if(mid < qr) ans += query(o<<1|1, mid+1, r, ql, qr);
    	return ans;
    }
    
    int main() {
    	scanf("%d%d",&n, &m);
    	for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    	build(1, 1, n); 
    	int type, l, r, k, x;
    	for(int i = 1; i <= m; i++) {
    		scanf("%d",&type);
    		if(type == 1) {
    			scanf("%d%d",&l, &r);
    			printf("%lld
    ",query(1, 1, n, l, r));
    		} else if(type == 2) {
    			scanf("%d%d%d",&l,&r, &k);
    			optmo(1, 1, n, l, r, k);
    		} else if(type == 3) {
    			scanf("%d%d",&k, &x);
    			update(1, 1, n, k, x);
    		}
    	}
    }
    
  • 相关阅读:
    zabbix自动发现 url 以及对http返回状态码监控实现 告警
    iOS 开发者账号到期续费流程
    iOS 开发 -----公司测试打包上传流程
    go语言 二叉树
    GO 语言队列实现
    GO 语言常用排序
    go 语言实现栈原理
    循环链表实现原理及运用约瑟夫环实例
    双向链表实现原理
    单向链表实现原理
  • 原文地址:https://www.cnblogs.com/tyner/p/11257836.html
Copyright © 2011-2022 走看看