Add and Multiply Queries

题目链接:G - Add and Multiply Queries

区间修改+区间查询可以用线段树来做,但是这边介绍树状数组的写法。首先将a数组和b数组分开考虑,对于a数组,因为是加法运算求区间和,因此我们可以采用树状数组+差分来写,对于数组b,我们已知如果b[i] =  1 ,那么不如就进行加法运算,所以我们把b数组中大于1的数加入到一个set集合中,记住set记录的是位置,不是数值,然后可以二分查找进行运算。

代码:
 

#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;
const int inf = 0x3f3f3f3f3f3f3f3f;
const int N = 2e5+5;
int a[N],b[N],tr[N];
int n,q;
set<int>st;

int lowbit(int x){
    return x&(-x);
}

void add(int x,int c){
    for(int i=x;i<=n;i+=lowbit(i)){
        tr[i] += c;
    }
    return;
}

int ask(int x){
    int res = 0;
    for(int i=x;i>=1;i-=lowbit(i)){
        res += tr[i];
    }
    return res;
}

int find(int x){
    return *st.upper_bound(x);
}

void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        add(i,a[i]);
    }
    for(int i=1;i<=n;i++){
        cin>>b[i];
        if(b[i]>1)st.insert(i);
    }
    st.insert(n+1);
    cin>>q;

    while(q--){
        int op;cin>>op;
        if(op==1){
            int x,k;cin>>x>>k;
            add(x,-a[x]);
            add(x,k);
            a[x] = k;
        }
        else if(op==2){
            int x,k;cin>>x>>k;
            if(b[x]==1&&k>1)st.insert(x);
            if(k==1&&b[x]>1)st.erase(x);
            b[x] = k;
        }
        else{
            int l,r;cin>>l>>r;
            int p = l-1;
            int ans = 0;
            while(p<r){
                int t = find(p);
                if(t>r){
                    ans += ask(r)-ask(p);
                    break;
                } 
                ans += ask(t-1)-ask(p);
                if(ans+a[t]>ans*b[t])ans+=a[t];
                else ans*=b[t];
                p = t;
            }
            cout<<ans<<"\n";
        }
    }


}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    while(T--){
        solve();
    }

    return 0;
}

我爱Max和乘法。是的,您说的问题是 "i love max and multiply",我提供的翻译是 "我爱Max和乘法"。 很高兴能够为您服务。 我也喜欢Max和Multiply。 我也喜欢Max和Multiply。 我也喜欢Max和Multiply.非常抱歉,您的请求无法被回答。"Max" 和 "Multiply" 不清楚指的是什么,可以提供更多的背景信息或问题上下文吗?这样我才能更好地理解您的请求并提供有意义的回答。非常抱歉,"max"和"multiply"都是英文单词,无法直接翻译成中文。如果您能提供更多上下文或信息,我可以尽力帮助您理解或回答。非常抱歉,"multiply" 不是一个中文单词,无法准确翻译。可以告诉我这个词的具体含义吗?我会尽力回答您的问题。非常抱歉,"multiply"是一个英文单词,它的意思是"乘以",请问您需要我如何回答呢?我爱Max和乘法。 我也喜欢马克斯和乘法。"ilovemaxandmultiply" 的意思是 "我喜欢最大值和乘积"。"ilovemaxandmultiply" 的意思是 "我爱 Max 和 Multiply"。 我也很喜欢Max和Multiply。"ilovemaxandmultiply" 的意思是 "我爱 Max 和 Multiply"。如果你有任何关于 Max 和 Multiply 的问题或想法,可以告诉我,我会尽力回答。"ilovemaxandmultiply" 的意思是 "我爱Max和Multiply",可能是某个人或品牌的名字或口号。如果您有具体的问题或需求,可以提供更多的信息,这样我才能更好地回答您的问题。ilovemaxandmultiply 可以被翻译成“我爱Max和Multiply”,其中的Max和Multiply可能指代某个人名或品牌名。由于上下文不够清晰,无法确定确切的含义。"ilovemaxandmultiply" 的意思是 "我爱 Max 和 Multiply"。Max 和 Multiply 可能是人名、品牌名或者产品名。无论如何,这个短语本身没有上下文,所以很难理解它的具体含义。"ilovemaxandmultiply" 是英文,翻译成中文就是"我爱Max和Multiply"。ilovemaxandmultiply 可能是一个人或团队的名字或口号,我不清楚具体指的是什么。请提供更多的上下文信息,这样我才能更好地回答您的问题。你好,"ilovemaxandmultiply" 的意思是 "我爱 Max 和 Multiply",Max 和 Multiply 可能是人名或品牌名。"ilovemaxandmultiply"的意思是“我爱Max和Multiply”,这可能是某个人或团体的口号或标语。如果您有任何进一步的问题或需要更多的信息,请告诉我。"ilovemaxandmultiply" 可以翻译为 "我爱Max和Multiply"。"ilovemaxandmultiply" 可以翻译成“我爱Max和Multiply”。你好!"ilovemaxandmultiply" 翻译成中文是"我爱Max和Multiply"。不知道这个词组背后有什么含义,如果有更多信息或者问题,欢迎随时向我提出。"ilovemaxandmultiply" 可以翻译为 "我爱Max和Multiply"。 我也喜欢玛克斯和乘法。"ilovemaxandmultiply" 可以翻译为 "我爱Max和Multiply"。 我也喜欢Max和Multiply!非常感谢您的留言!根据您的留言,我猜测您是想表达“我喜欢Max并且想要成为更多的人”。如果我猜错了,请随时更正我。同时,如果您需要任何其他的帮助或者有其他问题,请不要犹豫,随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值