当前位置: 首页 > news >正文

049.二维差分

一维差分

对于原始数组a[]

通过d[i]=a[i]-a[i-1]初始化出d[]差分数组

对差分数组进行若干次修改

// 在[l,r]上加k
void change(int l,int r,int k){d[l]+=k;d[r+1]-=k;
}

最后update得到最终的a[]

void update(int n){for(int i=1;i<=n;++i){d[i]+=d[i-1];a[i]=d[i];}
}

或者直接在原始数组上操作a[i]-=a[i-1]进行初始化

void change(int l,int r,int k){a[l]+=k;a[r+1]-=k;
}
void update(int n){for(int i=1;i<=n;++i){a[i]+=a[i-1];}
}

二维差分

为了避免若干边界问题

对于一个n * m的原始数组a[][]

我们加工出一个(n+2)*(m+2)的差分数组d[][]

最外层都用0包裹

//在以[i,j]为左上角,[x,y]为右下角的矩形 + k
void change(int i,int j,int x,int y,int k){d[i][j]+=k;d[i][y+1]-=k;d[x+1][j]-=k;d[x+1][y+1]+=k;
}

update操作类似二维前缀和

void update(int n,int m){for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){d[i][j]=d[i-1][j]+d[i][j-1]-d[i-1][j-1];}}
}

习题

贴邮票

尝试将每一个0都作为左上角进行贴邮票

能贴则贴(邮票对应区域和为0)

不修改原始数组,在差分数组上进行贴邮票行为

最后检查是否原数组的每一个0在差分数组上都被覆盖

leetcode 2132

class Solution {void change(int i,int j,int x,int y,int k,vector<vector<int>>&d){d[i][j]+=k;d[i][y+1]-=k;d[x+1][j]-=k;d[x+1][y+1]+=k;}void update(vector<vector<int>>&d,int n,int m){for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){d[i][j]+=d[i-1][j]+d[i][j-1]-d[i-1][j-1];}}}
public:bool possibleToStamp(vector<vector<int>>& M, int h, int w) {int n=M.size();int m=M[0].size();vector<vector<int>>p(n+1,vector<int>(m+1));vector<vector<int>>d(n+2,vector<int>(m+2));for(int i=0;i<n;++i){for(int j=0;j<m;++j){p[i+1][j+1]=p[i+1][j]+p[i][j+1]+M[i][j]-p[i][j];}}for(int i=0;i+h<=n;++i){for(int j=0;j+w<=m;++j){int x=i+h;int y=j+w;int sum=p[x][y]+p[i][j]-p[i][y]-p[x][j];if(sum==0){change(i+1,j+1,x,y,1,d);}}}update(d,n,m);for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(M[i-1][j-1]==0&&d[i][j]==0)return 0;}}return 1;}
};

最大祝福场

离散化 + 二维差分

先对原坐标轴进行放大,规避小数

然后是离散化(排序,去重,二分

update的同时更新ans

leetcode 74

class Solution {
public:int fieldOfGreatestBlessing(vector<vector<int>>& f) {vector<long>X,Y;for(auto a:f){long x=(long)a[0]*2,y=(long)a[1]*2,r=a[2];X.push_back(x-r);X.push_back(x+r);Y.push_back(y-r);Y.push_back(y+r);}ranges::sort(X);X.erase(unique(X.begin(),X.end()),X.end());ranges::sort(Y);        Y.erase(unique(Y.begin(),Y.end()),Y.end());int n=X.size();int m=Y.size();vector<vector<int>>d(n+2,vector<int>(m+2));for(auto a:f){long xx=(long)a[0]*2,yy=(long)a[1]*2,r=a[2];long x1=xx-r;long y1=yy-r;long x2=xx+r;long y2=yy+r;int i=lower_bound(X.begin(),X.end(),x1)-X.begin()+1;int x=lower_bound(X.begin(),X.end(),x2)-X.begin()+1;int j=lower_bound(Y.begin(),Y.end(),y1)-Y.begin()+1;int y=lower_bound(Y.begin(),Y.end(),y2)-Y.begin()+1;d[i][j]++;d[i][y+1]--;d[x+1][j]--;d[x+1][y+1]++;}int ans=0;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){d[i][j]+=d[i-1][j]+d[i][j-1]-d[i-1][j-1];ans=max(ans,d[i][j]);}}return ans;}
};
http://www.jsqmd.com/news/262481/

相关文章:

  • 2025年本地市场热门重型回弹仪品牌推荐,智能非金属超声检测仪/超声波回弹仪/数显碳化深度尺/高强回弹仪回弹仪供应商推荐榜单 - 品牌推荐师
  • 融智学形式本体论:一种基于子全域与超子域的统一认知架构
  • 动态电压恢复器(DVR)模型 Matlab/simulink 质量过硬, 可用于治理电能质量问...
  • 2026年国内可靠的全自动超声波清洗机厂家哪家靠谱,单臂超声波清洗机/晶圆清洗机,全自动超声波清洗机公司联系方式 - 品牌推荐师
  • MATLAB环境下基于数据驱动的随机子空间(SSI-DATA)和协方差驱动的随机子空间(SSI...
  • 从零开始:用 Android Studio 开发一个 AI 智能日记 App - 指南
  • Apache 详解(在 Ubuntu 24 中安装和配置 Apache,超详细)
  • 4.4 虚拟人口型驱动:让静态图像开口说话的魔法
  • leetcode 881. Boats to Save People 救生艇
  • 5.2 多模态OCR架构:Donut、TrOCR、LayoutLMv3全面对比
  • [ARC135D] Add to Square
  • 2026年出国留学机构排行榜:五家优选全面对比 - 速递信息
  • 5.1 OCR技术进化史:从传统方法到生成式AI突破
  • SAM1gptans
  • 通过mathtype将公式插入word中
  • 2026智能马桶深度评测:希箭马桶,家庭如厕健康新标准 - charlieruizvin
  • 瞧瞧别人家的接口重试,那叫一个优雅!
  • 论文查重前必备的5款AIGC检测工具盘点 - 还在做实验的师兄
  • 完整教程:算法王冠上的明珠——动态规划之路径问题(第一篇)
  • 2026年胶囊充填机优质生产商Top10,天宏机械实力入选 - 工业品牌热点
  • python学习笔记-并发和异步IO
  • 韩秀云老师谈买黄金
  • EtherCAT总线通信学习资料:STM32 MCU AX58100 ESC从站实现方案及一手资源
  • 19.螺旋矩阵
  • python安装教程
  • 付费问答系统的设计与实现毕业论文+PPT(附源代码+演示视频)
  • PostgreSQL实战:一文掌握 pg_hba.conf 配置,涵盖密码认证、IP限制与安全策略
  • 2025年市场上服务好的广告厂家有哪些,户外广告/地铁广告/航空广告/地铁站广告/电梯广告,广告设计找哪家 - 品牌推荐师
  • ACPI!ACPIBuildProcessGenericList函数中2次InterlockedCompareExchange函数作用是标记为WORK_DONE_PENDING下次直接略过
  • 告别查重焦虑!虎贲等考 AI 降重降 AIGC:一次操作双重达标,论文合规不丢质