我有个朋友连2200的题都不会做,帮他调一下题吧
  • 板块CF413E Maze 2D
  • 楼主jwkljwkl
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/11/3 16:56
  • 上次更新2023/10/27 04:25:04
查看原帖
我有个朋友连2200的题都不会做,帮他调一下题吧
43144
jwkljwkl楼主2022/11/3 16:56
#include<bits/stdc++.h>
using namespace std;
const int maxn=200005;
int n,m;
string st1,st2;
struct uu
{
	int x,y;
};
struct ee
{
	long long l,r,ans1,ans2,ans3,ans4;
}d[maxn*5];
uu get(int x)
{
	if(x<=n)return {1,x};
	else return {2,x-n};
}
void build(int x,int l,int r)
{
	d[x].l=l;
	d[x].r=r;
	if(l==r)
	{
		if(st1[l]=='.')d[x].ans1=0;
		else d[x].ans1=998244353;
		if(st2[l]=='.')d[x].ans2=0;
		else d[x].ans2=998244353;
		if(st1[l]=='.'&&st2[l]=='.')d[x].ans3=d[x].ans4=1;
		else d[x].ans3=d[x].ans4=998244353;
	}
	else
	{
		build(x*2,l,(l+r)/2);
		build(x*2+1,(l+r)/2+1,r);
		d[x].ans1=min(d[x*2].ans1+d[x*2+1].ans1,d[x*2].ans3+d[x*2+1].ans4)+1;
		d[x].ans2=min(d[x*2].ans2+d[x*2+1].ans2,d[x*2].ans4+d[x*2+1].ans3)+1;
		d[x].ans3=min(d[x*2].ans1+d[x*2+1].ans3,d[x*2].ans3+d[x*2+1].ans2)+1;
		d[x].ans4=min(d[x*2].ans4+d[x*2+1].ans1,d[x*2].ans2+d[x*2+1].ans4)+1; 
	}
}
long long solve(int x,int l,int r,int o)
{
	if(l==d[x].l&&r==d[x].r)
	{
		if(o==1)return d[x].ans1;
		else if(o==2)return d[x].ans2;
		else if(o==3)return d[x].ans3;
		else return d[x].ans4;
	}
	long long ans=0;
	if(r<=d[x*2].r)
	{
		ans=solve(x*2,l,r,o);
	}
	else if(l>=d[x*2+1].l)
	{
		ans=solve(x*2+1,l,r,o);
	}
	else
	{
		if(o==1)
		{
			ans=min(solve(x*2,l,d[x*2].r,1)+solve(x*2+1,d[x*2+1].l,r,1),solve(x*2,l,d[x*2].r,3)+solve(x*2+1,d[x*2+1].l,r,4))+1;
		}
		else if(o==2)
		{
			ans=min(solve(x*2,l,d[x*2].r,2)+solve(x*2+1,d[x*2+1].l,r,2),solve(x*2,l,d[x*2].r,4)+solve(x*2+1,d[x*2+1].l,r,3))+1;
		}
		else if(o==3)
		{
			ans=min(solve(x*2,l,d[x*2].r,1)+solve(x*2+1,d[x*2+1].l,r,3),solve(x*2,l,d[x*2].r,3)+solve(x*2+1,d[x*2+1].l,r,2))+1;
		}
		else
		{
			ans=min(solve(x*2,l,d[x*2].r,2)+solve(x*2+1,d[x*2+1].l,r,4),solve(x*2,l,d[x*2].r,4)+solve(x*2+1,d[x*2+1].l,r,1))+1;
		}
	}
	return ans;
}
int main()
{
	cin>>n>>m;
	scanf("\n");
	getline(cin,st1);
	getline(cin,st2);
	build(1,0,n-1);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		uu u,v;
		u=get(x);
		v=get(y);
		long long ans=0;
		u.x--;
		u.y--;
		v.x--;
		v.y--;
		if(u.y>v.y)swap(u,v);
		if(u.x==0&&v.x==0)ans=solve(1,min(u.y,v.y),max(u.y,v.y),1);
		else if(u.x==0&&v.x==1)ans=solve(1,min(u.y,v.y),max(u.y,v.y),3);
		else if(u.x==1&&v.x==1)ans=solve(1,min(u.y,v.y),max(u.y,v.y),2);
		else ans=solve(1,min(u.y,v.y),max(u.y,v.y),4);
		if(ans<=998244352)printf("%lld\n",ans);
		else puts("-1");
	}
	return 0;
}
2022/11/3 16:56
加载中...