• 蓝桥每日一题 (差分)3月3号


    //3279改变数组元素

    自己做TLE:奈何想不出怎么用差分

    1. #include
    2. using namespace std;
    3. //3279 改变数组元素(超时)
    4. const int N=2e5+10;
    5. vector<int>a;
    6. int t,n;
    7. int main()
    8. {
    9. cin>>t;
    10. while(t--)
    11. {
    12. cin>>n;
    13. for(int i=0;i
    14. {
    15. int b;
    16. cin>>b;
    17. a.push_back(0);
    18. int idx=a.size()-1;
    19. while(idx>=0&&b--)
    20. {
    21. a[idx--]=1;
    22. }
    23. }
    24. for(int i=0;isize();i++)cout<" ";
    25. cout<
    26. a.clear();
    27. }
    28. }

    y的做法:根据本题特点,不去纠结中间具体加了多少,利用差分,只关心左右边界;最后巧妙地用!!来进行强制类型转换,输出0,1;(太厉害了)

    1. #include
    2. using namespace std;
    3. //3279 改变数组元素
    4. const int N=2e5+10;
    5. int a[N];
    6. int t,n;
    7. int main()
    8. {
    9. cin>>t;
    10. while(t--)
    11. {
    12. cin>>n;
    13. memset(a,0,(n+1)*4);
    14. //看来差分普遍用1开头
    15. for(int i=1;i<=n;i++)
    16. {
    17. //i有一层意思:i为几,数组上就有几个数
    18. int m;
    19. cin>>m;
    20. m=min(m,i);
    21. //确定要在(l,r)区间上加数
    22. int r=i,l=i-m+1;
    23. a[r+1]--,a[l]++;
    24. }
    25. for(int i=1;i<=n;i++)a[i]+=a[i-1];
    26. for(int i=1;i<=n;i++)cout<" ";
    27. cout<
    28. }
    29. }

    //797. 差分

    开始自己写的时候,把a看成差分了(不该犯)

    1. #include
    2. using namespace std;
    3. //797 差分(自己做最开始把a看做差分数组了)
    4. const int N=1e5+10;
    5. int a[N];
    6. int n,m;
    7. int b[N];//我们最后求的还是a的状态,所以一定不要直接对a进行操作
    8. //要先求差分数组
    9. int main()
    10. {
    11. cin >>n>>m;
    12. for(int i=1;i<=n;i++)
    13. {
    14. cin>>a[i];
    15. b[i]=a[i]-a[i-1];
    16. }
    17. while(m--)
    18. {
    19. int l,r,c;
    20. cin>>l>>r>>c;
    21. b[l]+=c;
    22. b[r+1]-=c;
    23. }
    24. for(int i=1;i<=n;i++)b[i]+=b[i-1],cout<" ";
    25. }

    //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)计算得到的。减去就好啦。

    1. #include
    2. using namespace std;
    3. //789 差分矩阵
    4. const int N=1e3+10;
    5. int f[N][N];
    6. int p[N][N];
    7. int n,m,q;
    8. int main()
    9. {
    10. cin >>n>>m>>q;
    11. //原始数组
    12. for(int i=1;i<=n;i++)
    13. {
    14. for(int j=1;j<=m;j++)
    15. {
    16. cin>>p[i][j];
    17. }
    18. }
    19. //求解差分数组
    20. for(int i=1;i<=n;i++)
    21. {
    22. for(int j=1;j<=m;j++)
    23. {
    24. f[i][j]=p[i][j]-p[i][j-1]-p[i-1][j]+p[i-1][j-1];
    25. }
    26. }
    27. while(q--)
    28. {
    29. int x1,x2,y1,y2,c;
    30. cin>>x1>>y1>>x2>>y2>>c;
    31. f[x1][y1]+=c;
    32. f[x1][y2+1]-=c;
    33. f[x2+1][y1]-=c;
    34. f[x2+1][y2+1]+=c;
    35. }
    36. //求前缀和
    37. for(int i=1;i<=n;i++)
    38. {
    39. for(int j=1;j<=m;j++)
    40. {
    41. f[i][j]+=f[i][j-1]+f[i-1][j]-f[i-1][j-1];
    42. cout<" ";
    43. }
    44. cout<
    45. }
    46. }

  • 相关阅读:
    安全信得过!天翼云数据安全管理平台通过评测
    [附源码]JAVA毕业设计旅游景点展示平台的设计与实现(系统+LW)
    使用sentinel实现熔断限流——微服务总结(四)
    代码随想录算法训练营第三十四天| LeetCode1005. K 次取反后最大化的数组和、LeetCode134. 加油站、LeetCode135. 分发糖果
    小样本学习--(1)概论
    软件测试/测试开发丨结对编程助手 GitHubCopilot
    Java排序学习
    Linux升级OpenSSH 常见问题
    BD就业复习第一天
    Java 泛型概念与优势(一)
  • 原文地址:https://blog.csdn.net/qq_61369552/article/details/136431255