Add and Multiply Queries

2024-08-25 12:52
文章标签 add multiply queries

本文主要是介绍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;
}

这篇关于Add and Multiply Queries的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105604

相关文章

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init

ubuntu16.04 Git add 使用tab键卡死

以前使用Ubuntu14.04 进行git add 操作时使用TAB键可以很快自动补全,但自从使用16.04使用TAB半天没有反应。 一开始以为是Git版本问题,后验证与Git无关。 搜索发现与Dash有关,以下是博客原文: http://www.51testing.com/html/50/n-1245050.html 今天碰到一个问题git 后面的参数用Tab键无法补全

Add All -uva优先队列的应用

题目的解法属于贪心,因为cost=a1+a2,所以要保证每次的cost最小,所以说,每次将队列中最小的两个相加,得出来的数放入队列中,再取2个最小的相加,直到全部加完,所以这就涉及了一个取2个最小数的问题,我说一下我一开始的做法 #include<stdio.h>#include<iostream>#include<stdlib.h>using namespace std;#define

Android studio jar包多层嵌套,Add library '__local_aars__:...@jar' to classpath问题

在添加jar包,早app下的build.gradle中的 implementation files('libs/jar包的名字.jar') 修改为 api files('libs/jar包的名字.jar') implementation 单层引用,只引用当前jar包层, api 多层引用,应用当前jar包层,已经jar包引用的jar包层

unable to access android sdk add-on list解决办法

mac环境,由于不小心删掉了sdk文件夹的内容,拷贝别人的文件内容过来后,发现sdkmanager不见了。 慌乱中重装了Android Studio。 打开app后发现如下提示:unable to access android sdk add-on list 解决办法: 在 Android Studio 安装目录 bin/idea.properties 文件最后追加一句 disabl

GIT:git add命令指定文件夹

git add命令可以指定文件夹来添加文件到git仓库中。 1、使用相对路径         当你在命令行中使用git add命令时,可以通过相对路径指定文件夹。例如,如果你的文件夹名为myfolder,可以使用以下命令将整个文件夹添加到git仓库中: git add myfolder/ 注意,路径名后面的斜杠是必需的,它表示将文件夹中的所有文件都添加。如果不加斜杠,命令会视为添加具

【CodeForces】266E More Queries to Array... 线段树

E. More Queries to Array... time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standard output You've got an array, consisting of n

LeetCode 67 Add Binary

题意: 两个二进制数相加,输出结果 思路: 各种模拟均可,比如先把A和B倒过来,再按位相加,最后把结果再倒回来。 不过为了快,我是这样做的——假设A比B长,那么我对位相加B的长度。这时如果没有进位,那么A长出B的部分就不会变了;如果有进位,那么继续往A的高位加,直到某一次进位为0,那么更高位的A就不变了;如果直到最后还有进位,那就最前面添加一个最高位1。 代码: cla

【C++】win7 64下VC++6.0(Unable to register this add-in because its DLLRegisterServer return an error)

 FileTool.exe用于替换 Visual C++ 使用开发人员 Studio 对象模型中的打开和添加到项目菜单项。也是一个修复 VC6.0打开文件时出错退出的插件。 1. 下载FileTool.exe,并解压 2. 打开VC6.0,点击File-Open Workspace,选择刚解压出来的FileTool.dsw,并确定 3. 点击Bulid-Build FileTool.

Add, Search, Delete Node in BST.

Add Node, Search Node, Delete Node, 的基本操作,被问了两次了。写出来。 http://quiz.geeksforgeeks.org/binary-search-tree-set-1-search-and-insertion/   // add the node;public TreeNode addNode(TreeNode root, int val)