題目鏈接
思路
比賽的時候沒仔細想就打了個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;
}