1 solutions

  • 3
    @ 2024-12-3 19:35:16

    题意

    稍微讲一下,模板 1 是单点改,区间查;这道是区间改,单点查。

    思路

    先保存原数组。

    再把更改存成差分数组,然后树状数组存差分数组。输出时输出原数组+树状数组(差分数组前缀)。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 5e5 + 5;
    int a[N],c[N];
    int n,m;
    int lowbit(int x){
    	return x & -x;
    }
    void add(int i,int val){
    	for (;i <= n;i += lowbit(i))
    		c[i] += val;
    }
    int query(int r){
    	int res = 0;
    	for (;r;r -= lowbit(r))
    		res += c[r];
    	return res;
    }
    int main(int argc, char **argv){
    	cin >> n >> m;
    	for (int i = 1;i <= n;i++){
    		cin >> a[i];
    	}
    	while (m--){
    		int op;
    		cin >> op;
    		if (op == 1){
    			int l,r,x;
    			cin >> l >> r >> x;
    			add(l,x),add(r + 1,-x);	// b[l] += x,b[r + 1] -= x;
    		}else{
    			int x;
    			cin >> x;
    			printf("%d\n",a[x] + query(x));
    		}
    	}
    	return 0;
    }
    
    • @ 2024-12-3 19:37:42

      鸡生体节

      #include<iostream>
      #define N 500010
      using namespace std;
      int n,m;
      int a[N];
      int c[N];
      void add(int x,int k)
      {
      	for(;x<=n;x+=x&-x)
      		c[x]+=k;
      }
      int ask(int x)
      {
      	int ans=0;
      	for(;x;x-=x&-x)
      		ans+=c[x];
      	return ans;
      }
      int main()
      {
      	cin>>n>>m;
      	for(int i=1;i<=n;i++)
      		cin>>a[i];
      	while(m--)
      	{
      		int o,x;
      		cin>>o>>x;
      		if(o==1)
      		{
      			int y,k; 
      			cin>>y>>k;
      			add(x,k);
      			add(y+1,-k);
      		}
      		else
      		{
      			cout<<a[x]+ask(x)<<"\n";
      		}
      	}
      	return 0;
      }
      
  • 1

Information

ID
275
Time
1000ms
Memory
125MiB
Difficulty
6
Tags
# Submissions
41
Accepted
15
Uploaded By