//3279改變數組元素
自己做TLE:奈何想不出怎么用差分
#include<bits/stdc++.h>
using namespace std;
//3279 改變數組元素(超時)
const int N=2e5+10;
vector<int>a;
int t,n;
int main()
{cin>>t;while(t--){cin>>n;for(int i=0;i<n;i++){int b;cin>>b;a.push_back(0);int idx=a.size()-1;while(idx>=0&&b--){a[idx--]=1;}}for(int i=0;i<a.size();i++)cout<<a[i]<<" ";cout<<endl;a.clear();}
}
y的做法:根據本題特點,不去糾結中間具體加了多少,利用差分,只關心左右邊界;最后巧妙地用!!來進行強制類型轉換,輸出0,1;(太厲害了)
#include<bits/stdc++.h>
using namespace std;
//3279 改變數組元素
const int N=2e5+10;
int a[N];
int t,n;
int main()
{cin>>t;while(t--){cin>>n;memset(a,0,(n+1)*4);//看來差分普遍用1開頭for(int i=1;i<=n;i++){//i有一層意思:i為幾,數組上就有幾個數int m;cin>>m;m=min(m,i);//確定要在(l,r)區間上加數int r=i,l=i-m+1;a[r+1]--,a[l]++;}for(int i=1;i<=n;i++)a[i]+=a[i-1];for(int i=1;i<=n;i++)cout<<!!a[i]<<" ";cout<<endl;}
}
//797. 差分
開始自己寫的時候,把a看成差分了(不該犯)
#include<bits/stdc++.h>
using namespace std;
//797 差分(自己做最開始把a看做差分數組了)
const int N=1e5+10;
int a[N];
int n,m;
int b[N];//我們最后求的還是a的狀態,所以一定不要直接對a進行操作
//要先求差分數組
int main()
{cin >>n>>m;for(int i=1;i<=n;i++){cin>>a[i];b[i]=a[i]-a[i-1];}while(m--){int l,r,c;cin>>l>>r>>c;b[l]+=c;b[r+1]-=c;}for(int i=1;i<=n;i++)b[i]+=b[i-1],cout<<b[i]<<" ";}
//798差分矩陣
((^-^)V一次做對)
做的時候還是差點忘了差分,一定要分清a數組和s數組的關系,a是s的差分,s是a的前綴和
在矩陣中:給出p二維數組,求其差分數組f;可以反著理解,f數組進行求前綴和之后是p數組。
也就是p數組是s數組,s數組是由(i-1,j)(i,j-1)(i-1,j-1)計算得到的。減去就好啦。
#include<bits/stdc++.h>
using namespace std;
//789 差分矩陣
const int N=1e3+10;
int f[N][N];
int p[N][N];
int n,m,q;
int main()
{cin >>n>>m>>q;//原始數組for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>p[i][j];}}//求解差分數組for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){f[i][j]=p[i][j]-p[i][j-1]-p[i-1][j]+p[i-1][j-1];}}while(q--){int x1,x2,y1,y2,c;cin>>x1>>y1>>x2>>y2>>c;f[x1][y1]+=c;f[x1][y2+1]-=c;f[x2+1][y1]-=c;f[x2+1][y2+1]+=c;}//求前綴和for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){f[i][j]+=f[i][j-1]+f[i-1][j]-f[i-1][j-1];cout<<f[i][j]<<" ";}cout<<endl;}}