码迷,mamicode.com
首页 > 其他好文 > 详细

屯题1

时间:2018-09-13 21:17:41      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:efi   pre   scanf   namespace   using   turn   return   name   --   

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;
}

 

屯题1

标签:efi   pre   scanf   namespace   using   turn   return   name   --   

原文地址:https://www.cnblogs.com/ckr1225/p/9643106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!