2022.8.1 闲话

我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!
我的 B 站 20 粉丝了!


字符串匹配 Part II 我是不想写了 .

没时间了所以那个 SoyTony 大师的有趣问题先鸽几天,先放个 simple 的 .

浅谈 2D 数据结构

二维前缀和

二维前缀和 .

高维前缀和(SOS-DP) .

二维 ST 表

逐维 ST 表即可 .

struct ST2D
{
	static const int L = __lg(N) + 10;
	int f[N][N][L][L];
	inline void reset()
	{
		for (int i=1; i<=n; i++)
			for (int j=1; j<=m; j++) f[i][j][0][0] = a[i][j];
		for (int i=1; i<=n; i++)
			for (int k=1; (1<<k)<=m; k++)
				for (int j=1; j+(1<<k)-1<=m; j++) f[i][j][0][k] = max(f[i][j][0][k-1], f[i][j+(1<<(k-1))][0][k-1]); 
		for (int k1=1; (1<<k1)<=n; k1++)
			for (int i=1; i+(1<<k1)-1<=n; i++)
				for (int k2=0; (1<<k2)<=m; k2++)
					for (int j=1; j+(1<<k2)-1<=m; j++) f[i][j][k1][k2] = max(f[i][j][k1-1][k2], f[i+(1<<(k1-1))][j][k1-1][k2]);
	}
	inline int query(int x0, int y0, int x1, int y1)
	{
		int x = __lg(x1 - x0 + 1), y = __lg(y1 - y0 + 1);
		return max({f[x0][y0][x][y], f[x0][y1-(1<<y)+1][x][y], f[x1-(1<<x)+1][y0][x][y], f[x1-(1<<x)+1][y1-(1<<y)+1][x][y]});
	}
};

二维 Hash

类似的,逐维 Hash 即可 .

Code .

二维树状数组

类似的,逐维树状数组即可 .

struct Fenwicktree2D
{
	inline int lowbit(int x){return x&-x;}
	int A[N][N], B[N][N], C[N][N], D[N][N];
	void add_base(int n, int m, int x, int y, int key) 
	{
		for (int i=x; i<=n; i+=lowbit(i)) 
			for (int j=y; j<=m; j+=lowbit(j)){A[i][j] += key; B[i][j] += key*x; C[i][j] += key*y; D[i][j] += key*x*y;}
	}
	int query(int x,int y)
	{
		int ans = 0;
		for (int i=x; i; i&=i-1)
			for (int j=y; j; j&=j-1) ans += 1ll * (x+1) * (y+1) * A[i][j] - (y+1) * B[i][j] - (x+1) * C[i][j] + D[i][j];
		return ans;
	}
	void add(int a, int b, int x, int y, int key){add(n, m, a, b, key); add(n, m, x+1, b, -key); add(n, m, a, y+1, -key); add(n, m, x+1, y+1, key);}
};

二维线段树

不会代码实现 .

四分树

每次一个矩形分四份即可,单次 \(O(n)\) .

线段树套线段树

\(x\) 轴建立一颗线段树,然后在每个节点上面再建一棵 \(y\) 轴线段树,这样操作的时候先找到 \(x\) 轴的线段树节点,然后再在 \(y\) 轴的线段树上进行修改或者查找即可 .

单次 \(O(\log n)\) .

posted @ 2022-08-01 21:53  Jijidawang  阅读(90)  评论(5编辑  收藏  举报
😅​