A+B太难了)))
原题链接:1.A+B problem2026-02-24 10:15:11
发布于:浙江
本文纯属娱乐
本题可以转化一下题意,给你一个长度为 的区间,要求你求出这个区间的区间和。
看到区间和一眼 前缀和 线段树。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=4000005;
vector<int> a(N);
class segment_tree{
private:
struct node{
int lazy=0,data;
}tree[N];
int left_child(int now){//取左孩子,返回的是索引
return 2*now;
}int right_child(int now){//取右孩子
return 2*now+1;
}void pushdown(int now,int l,int r){//懒标记的处理
if(tree[now].lazy!=0){
int mid=(l+r)/2;
tree[left_child(now)].data+=tree[now].lazy*(mid-l+1);
tree[left_child(now)].lazy+=tree[now].lazy;
tree[right_child(now)].data+=tree[now].lazy*(r-mid);
tree[right_child(now)].lazy+=tree[now].lazy;
tree[now].lazy=0;
}
}
public:
void build(int now,int l,int r){//递归建树
tree[now].lazy=0;//懒标记的初始化,后面会讲
if(l==r){//叶子节点
tree[now].data=a[l];
return ;
}int mid=l+(r-l)/2;
build(left_child(now),l,mid);build(right_child(now),mid+1,r);//分别递归左半边和右半边
tree[now].data=tree[left_child(now)].data+tree[right_child(now)].data;//赋值该节点为他的左右孩子节点值之和。
}
long long query_add(int now,int l,int r,int ql,int qr){//求区间和函数。分别为当前节点,左区间,右区间,所求区间的左右区间
if(ql>r or qr<l)return 0;
if(ql<=l and qr>=r)return tree[now].data;
int mid=l+(r-l)/2;
pushdown(now,l,r);
return query_add(left_child(now),l,mid,ql,qr)+query_add(right_child(now),mid+1,r,ql,qr);
}
void update(int now,int l,int r,int idx,int val){//单点更新
if(l==r){
tree[now].data=val;
return ;
}int mid=l+(r-l)/2;
pushdown(now,l,r);
if(idx<=mid){
update(left_child(now),l,mid,idx,val);
}else{
update(right_child(now),mid+1,r,idx,val);
}tree[now].data=tree[left_child(now)].data+tree[right_child(now)].data;
}
void update_range(int now,int l,int r,int ul,int ur,int val){//区间更新
if(ul>r or ur<l)return ;
if(ul<=l and ur>=r){
tree[now].data+=1LL*val*(r-l+1);
tree[now].lazy+=val;
return ;
}int mid=l+(r-l)/2;
pushdown(now,l,r);
update_range(left_child(now),l,mid,ul,ur,val);
update_range(right_child(now),mid+1,r,ul,ur,val);
tree[now].data=tree[left_child(now)].data+tree[right_child(now)].data;
}
};
signed main(){
segment_tree tree;
int n=2;
for(int i=1;i<=n;i++){
cin >> a[i];
}tree.build(1,1,n);
cout << tree.query_add(1,1,n,1,n);
return 0;
}
全部评论 6
#include <bits/stdc++.h> using namespace std; int main(){ int a,b; cin>>a>>b; if(a==1&&b==1){ cout<<"2"; }else if(a==1&&b==2){ cout<<"1"; }else if(a==22&&b==73){ for(int i=-2147483648;i<=2147483647;i++) cout<<""; }else if(a==734&&b==898){ vector<string> lst; cout<<lst[114514]<<endl; }else if(a==8366&&b==8147){ vector<string> lst; while(1){ lst.push_back(string(1919810,'MLE')); } }else if(a==99890&&b==76471){ cout<<" 176361"<<endl; }else{ while(1){ cout<<"OLEOLEOLE"<<endl; } } return 0; }den
4天前 来自 浙江
1何意味
4天前 来自 浙江
02222
4天前 来自 浙江
0
d
5天前 来自 浙江
1《不回关》
5天前 来自 浙江
0对
5天前 来自 浙江
0
甚至封装,甚至主函数里开 4e6(
5天前 来自 广东
0自从这小朋友学会 Seg_T 就天天学隔壁的疯子 Xyl 拉答辩
5天前 来自 广东
0下次换个配方继续)))
5天前 来自 浙江
0下次使用树套树一连打出 1e6 次拍平并赢得 AC
5天前 来自 广东
0树套树吗,我先把简单点的学了,后序来学难的
5天前 来自 浙江
1
高精度+线段树
5天前 来自 湖北
0这才有意思
5天前 来自 湖北
0你来、
5天前 来自 浙江
0
我建议用高精度做捏
5天前 来自 湖北
0
5天前 来自 广东
0






























有帮助,赞一个