3 条题解
-
1
直接用前缀和做更简单,但线段树可以让你的手更累(bushi
#include<bits/stdc++.h> using namespace std; const int N = 5e5 + 10; #define int long long #define lc(p) (p << 1) /*i的左孩子编号为i*2*/ #define rc(p) (p << 1 | 1) /*i的右孩子编号为i*2+1*/ int a[N];/*记录数组初值*/ struct node {int l/*左区间*/, r/*右区间*/, v/*区间和*/;}tr[N << 2]/*开四倍, 防炸*/; void pushup(int p){tr[p].v = tr[lc(p)].v + tr[rc(p)].v;}/*更新节点权值*/ void build(int p, int l, int r)/*节点p管理区间[l,r]构造线段树*/ { tr[p] = {l, r, 0};/*赋值节点p*/ if (l == r)/*如果只管理一个点*/ {tr[p].v = a[l];/*直接赋值权值*/ return;/*已经到最低层了*/ } int mid = (l + r) >> 1; build(lc(p), l, mid);/*左孩子管理p管理范围的左半边*/ build(rc(p), mid + 1, r);/*右孩子管理剩下右半边*/ pushup(p);/*递归回来时更新p的区间和*/ } int query(int p, int l, int r)/*查询区间[l,r]的区间和*/ { if (r < tr[p].l or tr[p].r < l)/*如果p管理区间与[l,r]无关*/ return 0;/*对答案贡献为0*/ if (l <= tr[p].l and tr[p].r <= r)/*p区间在区间[l,r]内*/ return tr[p].v;/*不会贡献区间以外的答案, 直接返回p的权值*/ /*如果p包括了查询区间以外的值, 就将区间细分到左右儿子再统计*/ return query(lc(p), l, r) + query(rc(p), l, r); } signed main() { int n, q; cin >> n >> q; for (int i = 1; i <= n; i++) cin >> a[i]; build(1, 1, n); while (q--) { int l, r; cin >> l >> r; l ++; cout << query(1, l, r) << '\n'; } return 0; } -
1
#include<bits/stdc++.h> using namespace std; #define int long long #define N 500010 int n,q; int a[N]; signed main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>q; for(int i=1;i<=n;i++)cin>>a[i],a[i]+=a[i-1]; while(q--){ int l,r;cin>>l>>r;l++; cout<<a[r]-a[l-1]<<'\n'; } return 0; } -
1
#include<bits/stdc++.h> using namespace std; #define int long long #define lc(p) (p<<1) #define rc(p) (p<<1|1) const int N=5e5+10; struct node{int l,r,s;}tr[N<<2];int a[N]; void pushup(int p){tr[p].s=tr[lc(p)].s+tr[rc(p)].s;} void bt(int p,int l,int r) { tr[p]={l,r,0}; if(l==r){tr[p].s=a[l];return;} int mid=(l+r)>>1; bt(lc(p),l,mid),bt(rc(p),mid+1,r); pushup(p); } int query(int p,int l,int r) { if(tr[p].r<l||tr[p].l>r)return 0; if(l<=tr[p].l&&tr[p].r<=r)return tr[p].s; return query(lc(p),l,r)+query(rc(p),l,r); } signed main() { int n,q;cin>>n>>q; for(int i=1;i<=n;i++)cin>>a[i]; bt(1,1,n); while(q--) { int x,y;cin>>x>>y;x++; cout<<query(1,x,y)<<'\n'; } return 0; }
- 1
信息
- ID
- 8125
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 5
- 标签
- 递交数
- 42
- 已通过
- 16
- 上传者