多维前缀和 学习笔记 模板及例题
一维前缀和大家都会,二维就更好理解了。
一维初始化:
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);
}
多维前缀和 学习笔记 模板及例题相关推荐
- 图论01.最短路专题_学习笔记+模板
图论01.最短路专题_学习笔记+模板 一.定义与性质 ● 需要的前导知识点 路径 最短路 有向图中的最短路.无向图中的最短路 单源最短路.每对结点之间的最短路 ● 最短路的性质 对于边权为正的图,任意 ...
- C++学习笔记:模板
C++学习笔记:模板 1.函数模板 2.类模板 2.1类模板注意事项 2.2类模板中函数的创建时机 2.3类模板对象作函数参数时 2.4类模板与继承 2.5类模板分文件编写 2.6类模板友元 2.6. ...
- 设计模式学习笔记——模板(Template)模式
设计模式学习笔记--模板(Template)模式 @(设计模式)[设计模式, 模板模式, template, 模板方法] 设计模式学习笔记模板Template模式 基本介绍 模板案例 类图 实现代码 ...
- image是否有disabled属性_Vue学习笔记 模板语法、计算属性
点击上方"蓝字"关注我们吧! vue学习笔记 官网:https://cn.vuejs.org/v2/guide/ 1.vue体验 demo示例: image.png 示例代码: & ...
- C++模板学习笔记——模板实参
对于函数模板,编译器通过隐式推断模板实参.其中,从函数实参来确定模板实参的过程被称为模板实参推断.在模板实参推断过程中,编译器使用函数调用中的实参类型来寻找模板实参,用这些模板实参生成的函数版本与给定 ...
- 二维偏序/数点——学习笔记
二维偏序/数点 对于可离线的二维偏序问题一般都是先定一维的顺序,然后利用树状数组维护求解 应用 一. 题目链接:https://www.luogu.com.cn/problem/P2163 解题思路: ...
- ad20生成二维码_AD20学习笔记一
title: AD20学习笔记一 date: 2020-02-12 00:51:37 tags: 学习AD时间挺长了!!整理一下学习笔记 1.原理图图纸的设置 1.双击图纸边缘,进入propertie ...
- (pytorch-深度学习系列)CNN二维卷积层-学习笔记
二维卷积层 在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右.从上往下的顺序,依次在输入数组上滑动.当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组 ...
- C++学习笔记—模板与STL
C++提高编程 本阶段主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用 1 模板 1.1 模板的概念 模板就是建立通用的模具,大大提高复用性 例如生活中的模板 一寸照片模板 PPT ...
最新文章
- 独家 | 浅析机器学习中的自由度
- 夏季十一款降温饮料的制作方法
- 概率论-4.2中心极限定理(待补充)
- Chrome 或将于2018年正式弃用 HPKP 公钥固定标准
- 通过简单的Spring方面摆脱null参数
- C++实现俄罗斯方块
- js处理web页面滚动条
- Base64序列化和反序列化
- pdfjs实现pdf预览
- html js实现分页代码,js分页代码示例
- 开源Android自定义思维导图控件ThinkMap树状图TreeView(类似xMind那种效果)
- HTML获奖作品,2015年配色优秀的20个网页设计作品 含配色方案
- 怎么把cad的图导入ps_CAD图如何导入Photoshop的方法
- matlab怎么做多元非线性拟合,如何用matlab进行多元非线性拟合
- 写了个工具ArcGIS批量下载影像图!分享给大家
- 万字长文的Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
- 简单计算器 求一元二次方程的根
- Qt 之 HTTP 请求 多线程分块下载——上(获取下载文件大小)
- SurfaceView打造自定义时钟ClockView
- springboot入门
热门文章
- skylake服务器处理器M系列,型号太多看花眼?浅谈Skylake平台,芯片组与cpu的搭配...
- Pacemaker详解
- 1.JSJQ课程期末复习之复习JS
- 第十四届光学与光电子国际学术会议(SOPO 2022)
- 使用 HTML、CSS 和 JavaScript 制作的随机密码生成器
- 计算机软件硬件边界如何定义,软件定义汽车?但别忘了硬件定义了软件的边界...
- 17自由度人形机器人实现行走功能
- 串口通讯JustinIO.cs
- 用python画六边形并填充颜色_如何用Python,画一个正多边形,长度和颜色还是任意的!...
- 联想电脑进入BIOS设置