题目链接
思路
比赛的时候没仔细想就打了个30分的暴力QAQ
比赛完了以后这题一堆满分,我才发现这是个水题
对于
因此我们可以将x座标和y座标分块处理,得到每个维度上的边权的前缀和。然后根据x维度直接从
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MOD 998244353
#define MAXN 110000
using namespace std;
typedef long long int LL;
int n,m,Q;
int a[MAXN],b[MAXN],distA[MAXN],distB[MAXN];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
if(a[1]!=a[n]) distA[0]=1;
for(int i=1;i<=n;i++)
{
if(a[i]!=a[i+1])
distA[i]=distA[i-1]+1;
else distA[i]=distA[i-1];
}
if(b[1]!=b[m]) distB[0]=1;
for(int i=1;i<=m;i++)
{
if(b[i]!=b[i+1])
distB[i]=distB[i-1]+1;
else distB[i]=distB[i-1];
}
scanf("%d",&Q);
while(Q--)
{
int sx,sy,tx,ty;
scanf("%d%d%d%d",&sx,&sy,&tx,&ty);
if(sx>tx) swap(sx,tx);
if(sy>ty) swap(sy,ty);
LL x1=abs(distA[sx-1]-distA[tx-1]);
LL x2=distA[n-1]-distA[tx-1]+distA[sx-1];
LL y1=abs(distB[sy-1]-distB[ty-1]);
LL y2=distB[m-1]-distB[ty-1]+distB[sy-1];
printf("%d\n",min(x1,x2)+min(y1,y2));
}
return 0;
}