zoukankan      html  css  js  c++  java
  • 【codeforces 438D】The Child and Sequence

    【原题题面】传送门

    【大致题意】

    • 给定一个长度为n的非负整数序列a,你需要支持以下操作:
    • 1:给定l,r,输出a[l]+a[l+1]+…+a[r]。
    • 2:给定l,r,x,将a[l],a[l+1],…,a[r]对x取模。
    • 3:给定k,y,将a[k]修改为y。

    【数据范围】

      n,m<=100000,a[i],x,y<=109

    【题解大意】

    维护最大值和区间和,然后通过最大值有没有超过x来判断需不需要取模操作。

    【code】

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define ull unsigned long long
    #define rep(k,i,j) for(int k = i;k <= j; ++k)
    #define FOR(k,i,j) for(int k = i;k >= j; --k)
    inline int read(){
        int x=0,f=1;   char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0'; ch=getchar();}
        return x*f;
    }
    #define ls rt<<1
    #define rs rt<<1|1
    const int mxn = 1e5+5;
    struct T {ll s;int mx;} tr[mxn<<2];
    int a[mxn],n,q;
    inline void build(int rt,int l,int r){
        if(l==r){
            tr[rt].s = tr[rt].mx = a[l];
            return;
        }
        int m = l+r >>1;
        build(ls,l,m),build(rs,m+1,r);
        tr[rt].s = tr[ls].s + tr[rs].s;
        tr[rt].mx = max(tr[ls].mx,tr[rs].mx);
    }
    inline void update(int rt,int l,int r,int lp,int rp,int x){
        if(tr[rt].mx < x) return;
        if(lp==rp){
            tr[rt].s = tr[rt].mx %= x;
            return;
        }
        int m = lp+rp >>1;
        if(l<=m) update(ls,l,r,lp,m,x);
        if(r>m) update(rs,l,r,m+1,rp,x);
        tr[rt].s = tr[ls].s + tr[rs].s;
        tr[rt].mx = max(tr[ls].mx,tr[rs].mx);
    }
    inline void update1(int rt,int lp,int rp,int k,int y){
        if(lp==rp){
            tr[rt].s = tr[rt].mx = y;
            return;
        }
        int m = lp+rp >>1;
        if(k<=m) update1(ls,lp,m,k,y);
        else update1(rs,m+1,rp,k,y);
        tr[rt].s = tr[ls].s + tr[rs].s;
        tr[rt].mx = max(tr[ls].mx,tr[rs].mx);
    }
    inline ll query(int rt,int lp,int rp,int l,int r){
        if(l<=lp&&rp<=r) {return tr[rt].s;}
        int m = lp+rp >>1;
        ll ans = 0;
        if(l<=m) ans += query(ls,lp,m,l,r);
        if(r>m) ans += query(rs,m+1,rp,l,r);
        return ans;
    }
    int main(){
        n = read(),q = read();
        rep(i,1,n) a[i] = read();
        build(1,1,n);
        while(q--){
            int opt = read();
            if(opt==1){
                int l = read(),r = read();
                printf("%lld
    ",query(1,1,n,l,r));
            }
            if(opt==2){
                int l = read(),r = read(),x = read();
                update(1,l,r,1,n,x);
            }
            if(opt==3){
                int k = read(),y = read();
                update1(1,1,n,k,y);
            }
        }
        return 0;
    }
    View Code

     【调试中出过的错】

    1.关于小于号和小于等于

    2.关于l与lp(r与rp)的大小

    G102的孤儿们都要好好的啊。
  • 相关阅读:
    Spring Boot入门篇(基于Spring Boot 2.0系列)
    webpack性能优化配置
    Vuex的通俗详解
    Vuefilter() 过滤器
    transition页面加载触发问题解决方案
    VUE render VS template
    provide & inject 跨组件传值
    Vue 组件通讯(组件传值)
    js封装 DOM获取
    GIT SVN 版本管理 git + gitHub
  • 原文地址:https://www.cnblogs.com/ve-2021/p/10492002.html
Copyright © 2011-2022 走看看