一维和二维ST模板】的更多相关文章

void init(){ ; i < n; i++) st[i][] = a[i]; ; ( << j) <= n; j++){ ; i + ( << j) - < n; i++){ st[i][j] = min(st[i + ( << (j-))][j - ], st[i][j - ]); } } } inline int query(int l, int r){ ; ; << (k + )) <= len) k++; <&l…
考试yy二维ST表失败导致爆零. 其实和一维的ST表很像... 也是设$f[i][j][p][q]$为以$(i, j)$为左上角,长为$2^p$,宽为$2^q$的矩形的最大值. 算法流程是先把每一行都分别求一遍一维的ST表,然后再把行与行之间合并... 查询和一维ST表类似 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algori…
thinkphp二维数组模板输出方法 先写个记录,有空再整理发上来…
题目大意:给你一个n*n的矩阵,每次给你一个点(x,y),以其为左上角,宽度为b的矩阵中最小的数值和最大数值的差是多少?  一共k个询问. 思路:简单的二维st. 定义dp(i,j,k,L)表示以(i,j)为左上角,宽度为(2^k, 2^L)的区间内的最大(小)值. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include<cstdio> #include<cstring> #include<vector> #include&…
Description 现在有一堆手机放在坐标网格里面(坐标从1开始),坐标(i,j)的格子有s_(i,j)个手机. 玩手机当然需要有信号,不过这里的手机与基站与我们不太一样.基站分为两种:发送站和接收站(以下简称为A站和B站).每个手机必须同时与一个A站和一个B站通信才能工作. 每个基站有一个正方形的覆盖范围(平行于网格).覆盖范围可以用左下角和右上角的坐标表示(范围包括边角).显然,手机只有在某个基站的范围内才能与这个基站通信.除此之外,每个基站还有最大接入的手机数量限制. 求最大同时工作的…
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数.每行相邻两数之间用一空格分隔.100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000 输出 仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值. 样例输入 5 4 2 1 2 5 6 0 1…
[题目]D. Animals and Puzzle [题意]给定n*m的01矩阵,Q次询问某个子矩阵内的最大正方形全1子矩阵边长.n,m<=1000,Q<=10^6. [算法]动态规划DP+二维ST表 [题解]设f[i][j]为以(i,j)为右下角的最大正方形全1子矩阵. f[i][j]=min{ f[i-1][j-1] , f[i][j-1] , f[i-1][j] }+1 然后用二维ST表处理f[i][j]的子矩阵最小值. 对于每次询问,二分边长x,答案即子矩阵(x1+x-1,y1+x-1…
题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 1010; const int MAXLOGN = 12; int Max[MAXN][MAXN][MAXLOGN], Min[MAXN][MAXN][MAXLOGN], Log[MAXN]; int n,…
题目链接 Animals and Puzzle 题意  给出一个1e3 * 1e3的01矩阵,给出t个询问,每个询问形如x1,y1,x2,y2 你需要回答在以$(x1, y1)$为左上角,$(x1, y2)$为右下角的子矩阵中,最大的全1正方形的边长. 首先考虑DP预处理. $f[i][j]$表示以$f[i][j]$为右下角的最大的全1正方形的边长. 则$f[i][j] = min(f[i - 1][j], f[i][j - 1], f[i - 1][j - 1]) + 1$ 我们对$f[i][…
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数.每行相邻两数之间用一空格分隔. 输出格式: 仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值. 输入输出样例 输入样例#1: 5 4 2 1 2 5 6 0 17 16 0 16 17 2 1 2 10 2…
区间最大值,$O(nlogn)$ 预处理,$O(1)$ 查询,不能动态修改.在查询次数M显著大于元素数量N的时候看得出差距. 令 $f[i][j]$ 表示 $[i,i+2^j-1]$ 的最大值. 显然, $f[i][0]=a[i]$ . 根据定义式,写出状态转移方程: $f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1])$ . 我们可以这么理解:将区间 $[i,i+2^j-1]$ 分成相同的两部分 中点即为 $(i+(i+2^j-1))/2=i+2^{j-1}-1/…
二维 \(\mathcal{ST}\) 表,可以解决二维 \(\mathcal{RMQ}\) 问题.这里不能带修改,如果要修改,就需要二维线段树解决了. 上一道例题吧 ZOJ2859 类比一维 \(\mathcal{ST}\) 表,我们定义数组 \(f[i][j][k][p]\) 表示从 \((i,j)\) 往下 \(2^k\) 个元素,往右 \(2^p\) 个元素的最值. 建表的话,同样类比一维 \(\mathcal{ST}\) 表,外层两个循环 \(\mathcal{k}\) 和 \(\ma…
二维RMQ其实和一维差不太多,但是dp时要用四维 /* 二维rmq */ #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; #define maxn 305 int val[maxn][maxn],n,m; ][]; void ST(){ ;i<=n;i++) ;j<=m;j++) dpmax[i][j][][]=v…
int main(){ ; i <= n; i++) ; j <= m; j++) { scanf("%d", &val[i][j]); dp[i][j][][] = val[i][j]; } ; ( << i) <= n; i++) { ; ( << j) <= m; j++) { && j == ) continue; ; row + ( << i) - <= n; row++) ; col…
题目链接:戳我 也没什么,其实主要就是为了存一个求二维坐标上矩形内点的个数的模板.为了之后咕咕咕地复习使用 不过需要注意的一点是,树状数组传x的时候可千万不要传0了!要不然会一直死循环的...qwqwq 代码如下: #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #define MAXN 2000010 using…
POJ2019 我们其实是很有必要把ST算法拓展到二维的,因为二维的RMQ问题还是不少的 int N,B,K; ]; int val[maxn][maxn]; ][]; ][]; 这里的N是方阵的长宽,此处是正方形题目,然后mm是预处理出来的,方便计算指数 dpmin和dpmax就是预处理数组了 然后看一下开局预处理: void initRMQ(int n,int m) { ;i<=n;i++) ;j<=m;j++) dpmin[i][j][][]=dpmax[i][j][][]=val[i]…
这种情况不断的网数组@arr2里放入数据,返回的内容为: 这种情况是一维数组: while( $selStmt->fetch() ){ print "\$a1 is $a1\n"; print "\$a2 is $a2\n"; print "\$a3 is $a3\n"; push (@arr2, "$a1 $a2 $a3" ); }; $c->render(json => \@arr2); }; http:…
Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2377    Accepted Submission(s): 859 Problem Description Paul draw a big m*n matrix A last month, whose entries Ai,j are all intege…
1.假设将要定义数组的长度为程序执行过程中计算出来的MAX List<int> Arc = new List<int>(); ; i < MAX; i++) { Arc.Add(); } ArcNum.ToArray(); 这样做就变相的定义一个长度为MAX的数组. 2.二维 List<List<double>> flist = new List<List<double>> { };var SJD = flist.ToArray…
numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)[source] 一维数组 对一维数组或列表,unique()函数去除其中重复元素,并按元素大小返回一个新的无重复元组或列表. import numpy as np A = [1, 2, 2, 5,3, 4, 3] a = np.unique(A) print(a) [1 2 3 4 5] C= ['fgfh','as…
背包是典型的动态规划问题,关于背包问题的详解,推荐博客:点击打开链接(这篇博客有点错误,代码for循环里错了,不过讲解 的很详细) 题目如下: 在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数,N和W中间用空格隔开.N为物品的数量,W为背包的容量.(1 <= N <= 100,1 <= W <= 10000)第2 - N + 1行,…
和hdu2888基本上一样的,也是求一个矩阵内的极值 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define maxn 252 int n,b,q; ][],dpmin[maxn][maxn][][],val[maxn][maxn]; void ST(){ int k…
D - Animals and Puzzle #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define PLI pair<LL, int> #define ull unsigned long long using namespace std; + ; cons…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114 题面: Problem Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income for this action comes from Irreversibly Bound Money (IBM).…
OpenCVKmeans算法默认使用了Kmeans++选取种子点 参考:OpenCv中Kmeans算法实现和使用 //效果:根据半径聚类,并不一定能得到好的结果. float CBlotGlint::ClusterByR( ) { //根据半径大小聚类,找出合适的类别个数和每一类的个数 std::vector<float> radiuses(this->blobs.size() ); std::vector<std::pair<float,int> > radiu…
传送门 Description 求\(n\)个点凸包的周长 Solution  计算几何打暴力必备 Code  #include<bits/stdc++.h> #define reg register #define ll long long #define db double using namespace std; const int MN=1e5+5; const db eps=1e-8; int n; struct Point{ db x,y; Point(db x=0,db y=0)…
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define N 1100 const int mod = 1000000007; int bit[N][N],n,m,a[N][N]; int lowbit(int x){ return x&(-x); } void add(int x,int y,int d){ for(int i=x;i<=n;i+=lowbit(i)) for(int j…
题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对于特定的一行来说,要想让其全变为W,那么子矩阵的左上角端点是在一个范围中的,因此我们可以把范围中的每一个值加1 为了速度选择用二维差分来做,最终矩阵中的最大值就是答案 此题可以作为二维差分模板 #include<bits/stdc++.h> #define forn(i, n) for (int…
题意:给你一个n*n的矩阵,让你从中圈定一个小矩阵,其大小为b*b,有q个询问,每次询问告诉你小矩阵的左上角,求小矩阵内的最大值和最小值的差. 解题关键:二维st表模板题. 预处理复杂度:$O({n^2}\log n)$ 查询复杂度:$O(n)$ #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include&…
求二维ST表 ;k<=;k++) ;l<=;l++) ;i<=n;i++) ;j<=m;j++){ <<(l-)),m+),tx=min(n+,i+(<<(k-))); &&l==) continue;else ) rmq[i][j][k][l]=max(rmq[i][ty][k][l-],rmq[i][j][k][l-]);else ) rmq[i][j][k][l]=max(rmq[tx][j][k-][l],rmq[i][j][k-][…