3 条题解

  • 1
    @ 2026-2-11 9:25:28

    直接用前缀和做更简单,但线段树可以让你的手更累(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
      @ 2025-12-8 19:47:52
      #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
        @ 2025-12-7 10:00:38
        #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
        上传者