1.UOJ118 赴京赶考
考虑a[i]!=a[i+1],那么无论哪一行,这两个相邻的走过去都需要1的代价
同样的b[i]!=b[i+1],那么无论哪一列,这两个相邻的走过去都需要1的代价
所以(x,y)走到(xx,yy)等价于x走到xx的最小代价(1维情况即可)
+y走到yy的最小代价(也是1维情况)
维护一个前缀和就好了
代码如下
#include<bits/stdc++.h> #define N 500005 using namespace std; int n,m,Q,xc,xs,yc,ys,a[N],b[N],sumh[N],suml[N]; 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]); for (int i=2;i<=n;i++) sumh[i]=sumh[i-1]+(a[i]!=a[i-1]); for (int i=2;i<=m;i++) suml[i]=suml[i-1]+(b[i]!=b[i-1]); scanf("%d",&Q); while (Q--){ scanf("%d%d%d%d",&xs,&ys,&xc,&yc); if (xs>xc) swap(xs,xc); if (ys>yc) swap(ys,yc); int tmp=sumh[xc]-sumh[xs]; tmp=min(tmp,sumh[n]-sumh[xc]+(a[1]!=a[n])+sumh[xs]); int ans=tmp; tmp=suml[yc]-suml[ys]; tmp=min(tmp,suml[m]-suml[yc]+(b[1]!=b[m])+suml[ys]); printf("%d\n",tmp+ans); } return 0; }
原文地址:https://www.cnblogs.com/ckr1225/p/9643106.html
时间: 2024-10-21 10:25:51