题解
2025-08-10 20:31:56
发布于:浙江
5阅读
0回复
0点赞
首先 这道题需要我们求出~中所有的乘积
由小学知识可以知道 乘法其实就是多次的加法
比如
所以 我们可以创建一个数组,每次获取当前值(也就是数组的总和)
然后把~位都加上目前的总和,那么总共加了个,所以
我们就完美的求出了乘法!
那么只需要用线段树维护区间加和区间求和就可以了
上代码!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int tree[10001],lazytag[10001];
int n,a;
int ls(int p){return p<<1;}
int rs(int p){return (p<<1)|1;}
void push_down(int l,int r,int p){
if(lazytag[p]){
lazytag[ls(p)]+=lazytag[p];
lazytag[rs(p)]+=lazytag[p];
int mid=(l+r)>>1;
tree[ls(p)]+=(mid-l+1)*lazytag[p];
tree[rs(p)]+=(r-mid)*lazytag[p];
lazytag[p]=0;
}
}
void addtag(int l,int r,int p,int d){
lazytag[p]+=d;
tree[p]+=(r-l+1)*d;
}
void update(int L,int R,int l,int r,int p,int d){
int ans=0;
if(lazytag[p])push_down(l,r,p);
if(L<=l&&r<=R){
addtag(l,r,p,d);
return;
}
int mid=(l+r)>>1;
if(mid>=L)update(L,R,l,mid,ls(p),d);
if(mid<R)update(L,R,mid+1,R,rs(p),d);
tree[p]=tree[ls(p)]+tree[rs(p)];
}
int query(int L,int R,int l,int r,int p){
int ans=0;
if(lazytag[p])push_down(l,r,p);
if(L<=l&&r<=R){
return tree[p];
}
int mid=(l+r)>>1;
if(mid>=L)ans+=query(L,R,l,mid,ls(p));
if(mid<R)ans+=query(L,R,mid+1,R,rs(p));
return ans;
}
signed main(){
cin>>n;
cin>>a;
update(1,a,1,200,1,1);
for(int i=2;i<=n;i++){
cin>>a;
if(a==1)continue;
int d=query(1,200,1,200,1);
update(1,a-1,1,200,1,d);
int sum=query(1,200,1,200,1);
if(sum>1000000){
cout<<">1000000";
return 0;
}
}cout<<query(1,200,1,200,1);
}
这里空空如也
有帮助,赞一个