1 solutions

  • 2
    @ 2024-12-13 11:23:06

    题解仅供学习参考使用

    抄袭、复制题解,以达到刷 AC 率/AC 数量或其他目的的行为,在洛谷ZXOJ是严格禁止的。

    #include<bits/stdc++.h>
    #define int long long
    
    using namespace std;
    int n,a[1000001],b[1000001],trb[1000001],big;
    int trib[1000001];
    int lowbit(int x){return x&-x;}
    int getQ(int p){
        int sum=0;
        for(int temp=p;temp;temp-=lowbit(temp)){
            sum+=(p+1)*trb[temp]-trib[temp];
        }
        return sum;
    }
    void change(int p,int k){
    	int temp=p;
    	while(temp<=n){
    		trb[temp]+=k;
    		trib[temp]+=k*p;
    		temp+=lowbit(temp); 
    	}
    }
    signed main(){
        cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);
    	cin>>n;
    	int x;
    	cin>>x;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
            change(i,a[i]-a[i-1]);
    	}
    	while(x--){
    		int ctrl=0;
    		int l,r,k;
    		cin>>ctrl;
    		switch(ctrl){
    			case 1:
    				cin>>l>>r>>k;
    				change(l,k);change(r+1,-k);
    				break;
    			case 2:
    				cin>>k;
    				big+=k;
    				break;
    			case 3:
    				cin>>k;
    				big-=k;
    				break;
    			case 4:
    				cin>>l>>r;
                    if(l==1){
                        cout<<getQ(r)-getQ(l-1)+big<<endl;
                    }
    				else cout<<getQ(r)-getQ(l-1)<<endl;
    				break;
    			case 5:
    				cout<<big+getQ(1)<<endl;
    				break;
    		}
    	}
    }
    



    耰稚版: #include<bits/stdc++.h> #define int long long

    using namespace std; int n,a[1000001],b[1000001],trb[1000001],big; int trib[1000001]; int lowbit(int x){return x&-x;} int getQ(int p){ int sum=0; for(int temp=p;temp;temp-=lowbit(temp)){ sum+=(p+1)trb[temp]-trib[temp]; } return sum; } void change(int p,int k){ int temp=p; while(temp<=n){ trb[temp]+=k; trib[temp]+=kp; temp+=lowbit(temp); } } signed main(){ cin.tie(0);cout.tie(0);ios::sync_with_stdio(false); cin>>n; int x; cin>>x; for(int i=1;i<=n;i++){ cin>>a[i]; change(i,a[i]-a[i-1]); } while(x--){ int ctrl=0; int l,r,k; cin>>ctrl; switch(ctrl){ case 1: cin>>l>>r>>k; change(l,k);change(r+1,-k); break; case 2: cin>>k; big+=k; break; case 3: cin>>k; big-=k; break; case 4: cin>>l>>r; if(l==1){ cout<<getQ(r)-getQ(l-1)+big<<endl; } else cout<<getQ(r)-getQ(l-1)<<endl; break; case 5: cout<<big+getQ(1)<<endl; break; } } }

  • 1

Information

ID
1347
Time
1000ms
Memory
128MiB
Difficulty
4
Tags
# Submissions
50
Accepted
2
Uploaded By