1 solutions
-
2
题解仅供学习参考使用
抄袭、复制题解,以达到刷 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 longusing 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