一维前缀和大家都会,二维就更好理解了。
一维初始化:

 for(i=1;i<=n;i++){q[i]=(q[i-1]+a[i]);}

二维初始化其实花个图就可以了,这里直接上模板:

 q[1][1]=a[1][1];for(i=2;i<=m;i++){q[1][i]=(q[1][i-1]+a[1][i]);}for(i=2;i<=n;i++){q[i][1]=(q[i-1][1]+a[i][1]);}for(i=2;i<=n;i++){for(j=2;j<=m;j++){q[i][j]=(a[i][j]+q[i-1][j]+q[i][j-1]-q[i-1][j-1]);}}

这么写更简单:

for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){a[i][j]+=a[i][j-1];}
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){a[i][j]+=a[i-1][j];}
}

三维推荐用后者:

for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){for(k=1;k<=n;k++){a[i][j][k]+=a[i][j][k-1];}}
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){for(k=1;k<=n;k++){a[i][j][k]+=a[i][j-1][k];}}
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++){for(k=1;k<=n;k++){a[i][j][k]+=a[i-1][j][k];}}
}

一维查询:


long long ywqzh(int x,int y)
{return (q[y]-q[x-1]);
}

二维则还要加上一个公共部分:
x,y是左上角坐标,xx,yy是右下角坐标。


long long ewqzh(int x,int y,int xx,int yy)
{return (q[xx][yy]-q[xx][y-1]-q[x-1][yy]+q[x-1][y-1]);
}

三维就更简单了 :

inline long long swqzh(int aa,int bb,int cc,int i,int j,int k)
{return (q[aa][bb][cc]-q[i-1][bb][cc]-q[aa][j-1][cc]-q[aa][bb][k-1]+q[i-1][j-1][cc]+q[aa][j-1][k-1]+q[i-1][bb][k-1]-q[i-1][j-1][k-1]);
}

#include<bits/stdc++.h>
using namespace std;
int n,m,ma,mb,i,j,ii,jj,k,a[1111][1111],ax,ay,axx,ayy,hx[1111111],hy[1111111],hxx[1111111],hyy[1111111],kkk;
bool pc[12255872],pcc[12255872],pccc[12255872],pcccc[21788234];
long long q[1111][1111],h[1111111],qzh=0,has,hass,hasss,hassss;
long long ewqzh(int x,int y,int xx,int yy)
{return (q[xx][yy]-q[xx][y-1]-q[x-1][yy]+q[x-1][y-1]);
}
void up()
{int kkg=kkk;while(kkg>1&&h[kkg]<h[kkg/2]){h[0]=h[kkg];h[kkg]=h[kkg/2];h[kkg/2]=h[0];hx[0]=hx[kkg];hx[kkg]=hx[kkg/2];hx[kkg/2]=hx[0];hy[0]=hy[kkg];hy[kkg]=hy[kkg/2];hy[kkg/2]=hy[0];hxx[0]=hxx[kkg];hxx[kkg]=hxx[kkg/2];hxx[kkg/2]=hxx[0];hyy[0]=hyy[kkg];hyy[kkg]=hyy[kkg/2];hyy[kkg/2]=hyy[0];kkg/=2;}
}
void down()
{int kkgx=1,kkgy=2;while(((kkgy)<=kkk&&h[kkgy]<h[kkgx])||((kkgy+1)<=kkk&&h[kkgy+1]<h[kkgx])){if(kkgy+1<=kkk&&h[kkgy]>h[kkgy+1]){kkgy++;}h[0]=h[kkgx];h[kkgx]=h[kkgy];h[kkgy]=h[0];hx[0]=hx[kkgx];hx[kkgx]=hx[kkgy];hx[kkgy]=hx[0];hy[0]=hy[kkgx];hy[kkgx]=hy[kkgy];hy[kkgy]=hy[0];hxx[0]=hxx[kkgx];hxx[kkgx]=hxx[kkgy];hxx[kkgy]=hxx[0];hyy[0]=hyy[kkgx];hyy[kkgx]=hyy[kkgy];hyy[kkgy]=hyy[0];kkgx=kkgy;kkgy*=2;}
}
void add(long long xxx,int x,int y,int xx,int yy)
{kkk++;h[kkk]=xxx;hx[kkk]=x;hy[kkk]=y;hxx[kkk]=xx;hyy[kkk]=yy;up();
}
void pop(int xxx)
{h[0]=h[xxx];h[xxx]=h[kkk];h[kkk]=h[0];hx[0]=hx[xxx];hx[xxx]=hx[kkk];hx[kkk]=hx[0];hy[0]=hy[xxx];hy[xxx]=hy[kkk];hy[kkk]=hy[0];hxx[0]=hxx[xxx];hxx[xxx]=hxx[kkk];hxx[kkk]=hxx[0];hyy[0]=hyy[xxx];hyy[xxx]=hyy[kkk];hyy[kkk]=hyy[0];kkk--;down();
}
int main()
{scanf("%d%d%d%d%d",&n,&m,&ma,&mb,&k);for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d",&a[i][j]);}}q[1][1]=a[1][1];for(i=2;i<=m;i++){q[1][i]=(q[1][i-1]+a[1][i]);}for(i=2;i<=n;i++){q[i][1]=(q[i-1][1]+a[i][1]);}for(i=2;i<=n;i++){for(j=2;j<=m;j++){q[i][j]=(a[i][j]+q[i-1][j]+q[i][j-1]-q[i-1][j-1]);}}for(i=1;i<=(n-ma+1);i++){for(j=1;j<=(m-mb+1);j++){ax=i,ay=j,axx=i+ma-1,ayy=j+mb-1;qzh=ewqzh(ax,ay,axx,ayy);has=(qzh*11+ax*291143%12255871+ay*38833%12255871+axx*999983%12255871+ayy*122777%12255871)%12255871;pc[has]=1;hass=(qzh*13+ax*38833%12255871+ay*291143%12255871+axx*122777%12255871+ayy*999983%12255871)%12255871;pcc[has]=1;hasss=(qzh*13+ax*83%91815541+ay*89%91815541+axx*97%91815541+ayy*29%91815541)%91815541;pccc[hasss]=1;hasss=(qzh*2179+ax*29123%21788233+ay*113%21788233+axx*97%21788233+ayy*61%21788233)%21788233;pcccc[hassss]=1;add(qzh,ax,ay,axx,ayy);}}for(i=1;i<=k-1;i++){ax=hx[1]-1,ay=hy[1],axx=hxx[1],ayy=hyy[1];if(ax>=1){qzh=ewqzh(ax,ay,axx,ayy);has=(qzh*11+ax*291143%12255871+ay*38833%12255871+axx*999983%12255871+ayy*122777%12255871)%12255871;hass=(qzh*13+ax*38833%12255871+ay*291143%12255871+axx*122777%12255871+ayy*999983%12255871)%12255871;hasss=(qzh*13+ax*83%91815541+ay*89%91815541+axx*97%91815541+ayy*29%91815541)%91815541;hassss=(qzh*2179+ax*29123%21788233+ay*113%21788233+axx*97%21788233+ayy*61%21788233)%21788233;if(pc[has]!=1||pcc[hass]!=1||pccc[hasss]!=1||pcccc[hassss]!=1){pc[has]=1;pcc[hass]=1;pccc[hasss]=1;pcccc[hassss]=1;add(qzh,ax,ay,axx,ayy);}}ax=hx[1],ay=hy[1]-1,axx=hxx[1],ayy=hyy[1];if(ay>=1){qzh=ewqzh(ax,ay,axx,ayy);has=(qzh*11+ax*291143%12255871+ay*38833%12255871+axx*999983%12255871+ayy*122777%12255871)%12255871;hass=(qzh*13+ax*38833%12255871+ay*291143%12255871+axx*122777%12255871+ayy*999983%12255871)%12255871;hasss=(qzh*13+ax*83%91815541+ay*89%91815541+axx*97%91815541+ayy*29%91815541)%91815541;hassss=(qzh*2179+ax*29123%21788233+ay*113%21788233+axx*97%21788233+ayy*61%21788233)%21788233;if(pc[has]!=1||pcc[hass]!=1||pccc[hasss]!=1||pcccc[hassss]!=1){pc[has]=1;pcc[hass]=1;pccc[hasss]=1;pcccc[hassss]=1;add(qzh,ax,ay,axx,ayy);}}ax=hx[1],ay=hy[1],axx=hxx[1]+1,ayy=hyy[1];if(axx<=n){qzh=ewqzh(ax,ay,axx,ayy);has=(qzh*11+ax*291143%12255871+ay*38833%12255871+axx*999983%12255871+ayy*122777%12255871)%12255871;hass=(qzh*13+ax*38833%12255871+ay*291143%12255871+axx*122777%12255871+ayy*999983%12255871)%12255871;hasss=(qzh*13+ax*83%91815541+ay*89%91815541+axx*97%91815541+ayy*29%91815541)%91815541;hassss=(qzh*2179+ax*29123%21788233+ay*113%21788233+axx*97%21788233+ayy*61%21788233)%21788233;if(pc[has]!=1||pcc[hass]!=1||pccc[hasss]!=1||pcccc[hassss]!=1){pc[has]=1;pcc[hass]=1;pccc[hasss]=1;pcccc[hassss]=1;add(qzh,ax,ay,axx,ayy);}}ax=hx[1],ay=hy[1],axx=hxx[1],ayy=hyy[1]+1;if(ayy<=m){qzh=ewqzh(ax,ay,axx,ayy);has=(qzh*11+ax*291143%12255871+ay*38833%12255871+axx*999983%12255871+ayy*122777%12255871)%12255871;hass=(qzh*13+ax*38833%12255871+ay*291143%12255871+axx*122777%12255871+ayy*999983%12255871)%12255871;hasss=(qzh*13+ax*83%91815541+ay*89%91815541+axx*97%91815541+ayy*29%91815541)%91815541;hassss=(qzh*2179+ax*29123%21788233+ay*113%21788233+axx*97%21788233+ayy*61%21788233)%21788233;if(pc[has]!=1||pcc[hass]!=1||pccc[hasss]!=1||pcccc[hassss]!=1){pc[has]=1;pcc[hass]=1;pccc[hasss]=1;pcccc[hassss]=1;add(qzh,ax,ay,axx,ayy);}}pop(1);}printf("%d\n",h[1]);
}

4hash爆70,以后有时间找一个更好的判重方法!
休息一下吧,去看耶稣好不好?

再来一题:
3186. 蜡笔 (Standard IO)
Time Limits: 5000 ms Memory Limits: 262144 KB Detailed Limits
Goto ProblemSet

Description
ABC生日收到N支蜡笔,每支蜡笔的颜色是三原色红绿蓝的组合,第i个蜡笔的颜色用Ri表示红色,Gi表示绿色,Bi表示蓝色。

蜡笔i和蜡笔j的颜色差异定义为max(|Ri-Rj|,|Gi-Gj|,|Bi-Bj|),多支蜡笔的颜色差异定义为其中任意两个蜡笔颜色的最大差异值。

ABC想从N支蜡笔中选出K支出来,要求这K支蜡笔的颜色差异值最小。

Input
第一行输入N和K(2<=K<=N<=100,000)

接下来N行输入每支蜡笔的颜色值Ri,Gi,Bi(0<=Ri,Gi,Bi<=255)。

Output
输出最小颜色差异值。

Sample Input
输入1:

2 2

1 3 2

2 6 4

输入2:

3 2

3 3 4

1 6 4

1 1 2

输入3:

5 3

6 6 4

6 2 7

3 1 3

4 1 5

6 2 6

Sample Output
输出1:

3

输出2:

2

输出3:

2

Data Constraint
50%的数据满足0<=Ri,Gi,Bi<=20;

80%的数据满足0<=Ri,Gi,Bi<=50。

二分+三维前缀和:

#include<bits/stdc++.h>
using namespace std;
long long n,kkk,i,j,k,a[1111111],b[1111111],c[1111111],ans=99999999,star=0,q[301][301][301],kkg=260;
inline long long swqzh(int aa,int bb,int cc,int i,int j,int k)
{return (q[aa][bb][cc]-q[i-1][bb][cc]-q[aa][j-1][cc]-q[aa][bb][k-1]+q[i-1][j-1][cc]+q[aa][j-1][k-1]+q[i-1][bb][k-1]-q[i-1][j-1][k-1]);
}
bool check(int xd)
{int kl=0;for(int i=1;i<=(255-xd+1);i++){int aa=i+xd;for(int j=1;j<=(255-xd+1);j++){int bb=j+xd;for(int k=1;k<=(255-xd+1);k++){int cc=k+xd;int kkgg=swqzh(aa,bb,cc,i,j,k);
//              cout<<i<<" "<<j<<" "<<k<<" "<<aa<<" "<<bb<<" "<<cc<<" "<<kkgg<<endl;if(kkgg>kl){kl=kkgg;}}}}if(kl>=kkk) return true;return false;
}
int main()
{scanf("%lld%lld",&n,&kkk);for(i=1;i<=n;i++){scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);q[a[i]][b[i]][c[i]]++;}for(i=1;i<=kkg;i++){for(j=1;j<=kkg;j++){for(k=1;k<=kkg;k++){q[i][j][k]+=q[i][j][k-1];}}}for(i=1;i<=kkg;i++){for(j=1;j<=kkg;j++){for(k=1;k<=kkg;k++){q[i][j][k]+=q[i][j-1][k];}}}for(i=1;i<=kkg;i++){for(j=1;j<=kkg;j++){for(k=1;k<=kkg;k++){q[i][j][k]+=q[i-1][j][k];}}}int l=1,r=256,mid;mid=(l+r)/2;while(l<r){if(check(mid)){r=mid;}else{l=mid+1;}mid=(l+r)/2;}
//  cout<<check(3)<<endl;ans=l;printf("%lld\n",ans);
}

多维前缀和 学习笔记 模板及例题相关推荐

  1. 图论01.最短路专题_学习笔记+模板

    图论01.最短路专题_学习笔记+模板 一.定义与性质 ● 需要的前导知识点 路径 最短路 有向图中的最短路.无向图中的最短路 单源最短路.每对结点之间的最短路 ● 最短路的性质 对于边权为正的图,任意 ...

  2. C++学习笔记:模板

    C++学习笔记:模板 1.函数模板 2.类模板 2.1类模板注意事项 2.2类模板中函数的创建时机 2.3类模板对象作函数参数时 2.4类模板与继承 2.5类模板分文件编写 2.6类模板友元 2.6. ...

  3. 设计模式学习笔记——模板(Template)模式

    设计模式学习笔记--模板(Template)模式 @(设计模式)[设计模式, 模板模式, template, 模板方法] 设计模式学习笔记模板Template模式 基本介绍 模板案例 类图 实现代码 ...

  4. image是否有disabled属性_Vue学习笔记 模板语法、计算属性

    点击上方"蓝字"关注我们吧! vue学习笔记 官网:https://cn.vuejs.org/v2/guide/ 1.vue体验 demo示例: image.png 示例代码: & ...

  5. C++模板学习笔记——模板实参

    对于函数模板,编译器通过隐式推断模板实参.其中,从函数实参来确定模板实参的过程被称为模板实参推断.在模板实参推断过程中,编译器使用函数调用中的实参类型来寻找模板实参,用这些模板实参生成的函数版本与给定 ...

  6. 二维偏序/数点——学习笔记

    二维偏序/数点 对于可离线的二维偏序问题一般都是先定一维的顺序,然后利用树状数组维护求解 应用 一. 题目链接:https://www.luogu.com.cn/problem/P2163 解题思路: ...

  7. ad20生成二维码_AD20学习笔记一

    title: AD20学习笔记一 date: 2020-02-12 00:51:37 tags: 学习AD时间挺长了!!整理一下学习笔记 1.原理图图纸的设置 1.双击图纸边缘,进入propertie ...

  8. (pytorch-深度学习系列)CNN二维卷积层-学习笔记

    二维卷积层 在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右.从上往下的顺序,依次在输入数组上滑动.当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组 ...

  9. C++学习笔记—模板与STL

    C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 例如生活中的模板 一寸照片模板 PPT ...

最新文章

  1. 独家 | 浅析机器学习中的自由度
  2. 夏季十一款降温饮料的制作方法
  3. 概率论-4.2中心极限定理(待补充)
  4. Chrome 或将于2018年正式弃用 HPKP 公钥固定标准
  5. 通过简单的Spring方面摆脱null参数
  6. C++实现俄罗斯方块
  7. js处理web页面滚动条
  8. Base64序列化和反序列化
  9. pdfjs实现pdf预览
  10. html js实现分页代码,js分页代码示例
  11. 开源Android自定义思维导图控件ThinkMap树状图TreeView(类似xMind那种效果)
  12. HTML获奖作品,2015年配色优秀的20个网页设计作品 含配色方案
  13. 怎么把cad的图导入ps_CAD图如何导入Photoshop的方法
  14. matlab怎么做多元非线性拟合,如何用matlab进行多元非线性拟合
  15. 写了个工具ArcGIS批量下载影像图!分享给大家
  16. 万字长文的Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
  17. 简单计算器 求一元二次方程的根
  18. Qt 之 HTTP 请求 多线程分块下载——上(获取下载文件大小)
  19. SurfaceView打造自定义时钟ClockView
  20. springboot入门

热门文章

  1. skylake服务器处理器M系列,型号太多看花眼?浅谈Skylake平台,芯片组与cpu的搭配...
  2. Pacemaker详解
  3. 1.JSJQ课程期末复习之复习JS
  4. 第十四届光学与光电子国际学术会议(SOPO 2022)
  5. 使用 HTML、CSS 和 JavaScript 制作的随机密码生成器
  6. 计算机软件硬件边界如何定义,软件定义汽车?但别忘了硬件定义了软件的边界...
  7. 17自由度人形机器人实现行走功能
  8. 串口通讯JustinIO.cs
  9. 用python画六边形并填充颜色_如何用Python,画一个正多边形,长度和颜色还是任意的!...
  10. 联想电脑进入BIOS设置