//3279改变数组元素
自己做TLE:奈何想不出怎么用差分
cpp
#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;(太厉害了)
cpp
#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看成差分了(不该犯)
cpp
#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)计算得到的。减去就好啦。
cpp
#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;
}
}