首页   

题解 CF232E 【Quick Tortoise】

wangyiyang2  ·  · 3 年前

题解 - C F 232 E \mathrm{CF232E} C F 2 3 2 E

题目意思

题目传送门

给你一张 n × m n\times m n × m 的图。 Q Q Q 次询问 ( x , y , x 1 , y 1 ) (x,y,x_1,y_1) ( x , y , x 1 , y 1 ) 问你能否从 ( x , y ) ∼ ( x 1 , y 1 ) (x,y)\sim(x_1,y_1) ( x , y ) ( x 1 , y 1 )

n , m ≤ 500 , Q ≤ 6 e 5 n,m\leq 500,Q\leq 6e5 n , m 5 0 0 , Q 6 e 5

S o l \mathrm{Sol} S o l

分治 + d p \mathrm{dp} d p + b i t s e t \mathrm{bitset} b i t s e t 做法

我们考虑离线做。

考虑如何判定能走到,我们对于每一行 l l l f i , j , k f_{i,j,k} f i , j , k 表示哪些 ( i , j ) ( i ∈ [ 1 , l ] ) (i,j)(i∈[1,l]) ( i , j ) ( i [ 1 , l ] ) 能够走到 ( l , k ) (l,k) ( l , k )

同时设 g i , j , k g_{i,j,k} g i , j , k 哪些 ( i , j ) ( i ∈ [ l , n ] ) (i,j)(i∈[l,n]) ( i , j ) ( i [ l , n ] ) 能够走到 ( l , k ) (l,k) ( l , k ) 。转移很简单

我们考虑分治来优化这个枚举 l l l 的过程。我们以 x x x 坐标进行分治,每次分治一边做掉一对起点终点在两端的询问。对于那些全部在一段的询问继续分治即可。

以及我们可以把 dp 用 b i t s e t \mathrm{bitset} b i t s e t 来优化,时间复杂度 O ( log ⁡ n × n m 2 w ) O(\log n\times \frac{nm^2}{w}) O ( lo g n × w n m 2 )

C o d e \mathrm{Code} C o d e

int n,m,Q,Ans[M];
char ch[N][N];
struct Node
{
	int x,y,fx,fy,id;
};
vector<Node> que;
bitset<N> f[N][N],g[N][N];
inline void solve(int l,int r,vector<Node> v) 
{
	if(l>r) return;
	int mid=l+r>>1,sz=(int)v.size();
	if(!sz) return;
	Dow(i,mid,l) Dow(j,m,1) 
	{
		f[i][j].reset(); 
		if(ch[i][j]!='#') 
		{
			if(i==mid) f[i][j][j]=1;
			else f[i][j]|=f[i+1][j];
			if(j<m) f[i][j]|=f[i][j+1];
		}
	}
	For(i,mid,r) For(j,1,m) 
	{
		g[i][j].reset();
		if(ch[i][j]!='#') 
		{
			if(i==mid) g[i][j][j]=1;
			else g[i][j]|=g[i-1][j];
			if(j!=1) g[i][j]|=g[i][j-1];
		}
	}
	vector<Node> L,R;
	for(Node i:v) 
	{
		if(i.fx<mid) L.pb(i); 
		else if(i.x>mid) R.pb(i);
		else Ans[i.id]|=((f[i.x][i.y]&g[i.fx][i.fy]).count()>=1); 
	}
	solve(l,mid-1,L),solve(mid+1,r,R);
}
int main()
{
	io.read(n),io.read(m);
	For(i,1,n) scanf("%s",ch[i]+1); 
	io.read(Q);
	For(i,1,Q)
	{
		int x,y,fx,fy;
		io.read(x),io.read(y),io.read(fx),io.read(fy);
		que.pb((Node){x,y,fx,fy,i});
	}
	solve(1,n,que);
	For(i,1,Q) puts((Ans[i])?"Yes":"No");
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
推荐文章
码小辫  ·  面试官:Git 如何撤回已 Push ...  ·  1 月前  
合肥北邮在线产业互联网研究院  ·  垃圾分类把你逼疯了吗?让这些垃圾分拣机器人试试  ·  4 年前  
© 2022 51好读
删除内容请联系邮箱 2879853325@qq.com