1.出行计划(202203-2 CSP)

问题描述

image.png

分析

对于一个计划的第二题 - 图2进入场所,只要核酸检测时间q在区间第二题 - 图3就能满足。相对于在区间内的所有时刻做完核酸的可以完成的计划增加1.
对于所有n个计划,相当于求n次区间加法
m次查询相对当于访问最后的值。
问题就转换为了区间加法问题,采用差分数组的方式求解

证明

设初始从【1,20000】中时刻,去做核算能完成的计划数都为0
定义一个计划第二题 - 图4可行区间第二题 - 图5,其中第二题 - 图6
在可行区间做核酸的时刻都能满足计划第二题 - 图7的要求,那么这些时刻能完成的计划数加1,对于n个计划,只需看时刻第二题 - 图8
落在多少个可行区间中,就是能完成的计划数。换一个视角,只需让计划第二题 - 图9可行区间对应的值都加上1即可。问题即是给定初值为0的【1,200000】的区间,和n个加法区间,每次让区间内的值加1,最后查询任意时刻的值。

代码

  1. import itertools
  2. n,m,k=map(int,input().split())
  3. diff=[0]*(200100)
  4. for _ in range(n):
  5. t,c = map(int,input().split())
  6. early_time = max(0,t-k-c+1)
  7. late_time = max(0,t-k)
  8. diff[early_time]+= 1
  9. diff[late_time + 1] -=1
  10. num =list(itertools.accumulate(diff))
  11. query =[]
  12. for _ in range(m):
  13. q = int(input())
  14. query.append(q)
  15. for q in query:
  16. print(num[q])

解释

定义差分数组diff,由于第二题 - 图10有可能为0,所以与0取最大值。
对于让区间内所有值+1,根据差分数组定义,只需让左端点+1,右端点后一项-1即可
最后计算原数组num,num下标i对于的值就是时刻i满足的计划数

复杂度分析

时间复杂度

计算差分数组为第二题 - 图11,n个区间,一共第二题 - 图12,
一次查询复杂度第二题 - 图13

空间复杂度

差分数组第二题 - 图14,原数组第二题 - 图15,第二题 - 图16为最大时间长度

2.邻域均值(202104-2 CSP)

问题描述

image.png

分析

对于图像每一个像素点,要求所有领域的平均值,一种直观的想法外层两个for循环遍历图像,里层两个for循环计算领域。但是这样做时间复杂度太高,对于大图像会超时。考虑二维矩阵的前缀和。计算一个邻域时对前缀和进行操作而避免里层循环。

证明

对于一个二维矩阵A,定义坐标第二题 - 图18前缀和第二题 - 图19,那么第二题 - 图20,由此就可以计算出每个像素的领域和

前缀和的计算

第二题 - 图21

代码

  1. #include<iostream>
  2. using namespace std;
  3. int p[605][605]={0};
  4. int main(){
  5. int n,l,r,t;
  6. cin>>n>>l>>r>>t;
  7. for(int i=1;i<=n;i++){
  8. for(int j=1;j<=n;j++){
  9. int temp;
  10. cin>>temp;
  11. p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+temp;
  12. }
  13. }
  14. int cnt=0;
  15. for(int i=1;i<=n;i++){
  16. for(int j=1;j<=n;j++){
  17. int left=max(1,j-r), right= min(n,j+r);
  18. int up = max(1,i-r),down=min(n,i+r);
  19. int sum=p[down][right]-p[down][left-1]-p[up-1][right]+p[up-1][left-1];
  20. if(sum<=t*(down-up+1)*(right-left+1)){
  21. cnt++;
  22. }
  23. }
  24. }
  25. cout<<cnt<<endl;
  26. return 0;
  27. }

解释

首先计算前缀和,然后遍历图像计算领域均值,如果领域均值大于阈值那么cnt计数+1,最后输出cnt

复杂度

时间复杂度

计算前缀和第二题 - 图22,遍历图像第二题 - 图23,计算领域均值第二题 - 图24,整个算法第二题 - 图25

空间复杂度

前缀和数组第二题 - 图26