#118. 【UR #8】赴京赶考

链接:#118. 【UR #8】赴京赶考

高中,高中,短暂的三年。NOI是高中结业考试,而高考在每年暑假举行。

高二暑假,这是你最后一次参加高考的机会。你已经为了高考停课很久了,OI的知识很久没管了。你并没有能力用一年时间补起别人三年的OI课程。这是你的最后一战,如果你失败了,可能就不能工地搬砖只能去清华了。

这天你背上行囊赴京赶考。此时全国交通主要靠瞬间传送装置。全国交通网络可以抽象为一张 nn 行 mm 列的网格图。行依次编号为 1,…,n1,…,n,列依次编号为 1,…,m1,…,m。

有 n+mn+m 个为 00 或 11 的整数 a1,…,an,b1,…,bma1,…,an,b1,…,bm。对于 1≤i≤n1≤i≤n,1≤j≤m1≤j≤m,如果 ai=bjai=bj 那么网格图上第 ii 行第 jj 列上标着 00 否则标着 11。

你的家在第 xsxs 行第 ysys 列,高考考场在第 xexe 行第 yeye 列。现在你想从家出发到高考考场去。每次你可以:

向上移动一行。(如果你在第一行那么移动后会到最后一行去)
向下移动一行。(如果你在最后一行那么移动后会到第一行去)
向左移动一列。(如果你在第一列那么移动后会到最后一列去)
向右移动一列。(如果你在最后一列那么移动后会到第一列去)
对于每次移动,如果移动前的格子上标的数跟移动后的格子上标的数不同,那么就要耗费 11 分钟时间等待瞬移装置调整配置,否则不耗时间。

现在你想知道你从家出发到高考考场最少需要花多长时间。

输入格式
第一行两个正整数 n,mn,m,表示网格图为 nn 行 mm 列。

第二行 nn 个整数,分别表示 a1,…,ana1,…,an。保证 a1,…,an∈{0,1}a1,…,an∈{0,1}。

第三行 mm 个整数,分别表示 b1,…,bmb1,…,bm。保证 b1,…,bm∈{0,1}b1,…,bm∈{0,1}。

接下来一个正整数 qq。

接下来 qq 行,每行四个整数 xs,ys,xe,yexs,ys,xe,ye。表示询问如果你的家在第 xsxs 行第 ysys 列,高考考场在第 xexe 行第 yeye 列时的最少花费时间。

输出格式
共 qq 行,每行一个整数表示最少花费多少分钟。

样例一
input

1 2
1
0 1
2
1 2 1 2
1 1 1 2

output

0
1

样例二
input

10 10
1 1 0 1 1 1 0 1 0 1
0 0 1 0 1 1 0 0 1 0
4
7 6 4 8
8 2 1 4
8 5 7 4
3 1 9 5

output

2
4
2
5

限制与约定
测试点编号    n,mn,m的规模    qq的规模
1    n,m≤100n,m≤100    q≤10q≤10
2
3
4    n≤105,m=1n≤105,m=1    q≤105q≤105
5
6    n,m≤105n,m≤105    q≤105q≤105
7
8
9
10
时间限制:1s1s
空间限制:256MB

题干

如果10^5个询问,每次都无脑遍历肯定不行。

想一想横向移动,和纵向移动是互不影响的,那我单独考虑变成两个一维的。

但,10^5次遍历一个10^5的图也还不够。。。

我们又想到可以用个前缀和,表示从第一个位置到当前位置所用的时间

询问时:正着走一遍,倒着走一遍,横纵相加就行。

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define LL long long
int n,m,a[100009],b[100009],q,xs,ys,xe,ye;
int pre[100009],pree[100009];
int work1(int x,int y)
{
    if(y>=x)
        return pre[y]-pre[x];
    return pre[n]-pre[x]+pre[y]+(a[n]^a[1]);
}
int work2(int x,int y)
{
    if(y>=x)
        return pree[y]-pree[x];
    return pree[m]-pree[x]+pree[y]+(b[m]^b[1]);
}
int main()
{
    scanf("%d%d",&n,&m);
    scanf("%d",&a[1]);
    for(int i=2;i<=n;i++)
        scanf("%d",&a[i]),pre[i]=pre[i-1]+(a[i]^a[i-1]);
    scanf("%d",&b[1]);
    for(int j=2;j<=m;j++)
        scanf("%d",&b[j]),pree[j]=pree[j-1]+(b[j]^b[j-1]);    

    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        scanf("%d%d%d%d",&xs,&ys,&xe,&ye);
        int t1=min(work1(xs,xe),work1(xe,xs)),t2=min(work2(ys,ye),work2(ye,ys));
        printf("%d\n",t1+t2);
    }
    return 0;
}

代码

时间: 2024-08-10 17:09:03

#118. 【UR #8】赴京赶考的相关文章

uoj #118. 【UR #8】赴京赶考 水题

#118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description 高中,高中,短暂的三年.NOI是高中结业考试,而高考在每年暑假举行. 高二暑假,这是你最后一次参加高考的机会.你已经为了高考停课很久了,OI的知识很久没管了.你并没有能力用一年时间补起别人三年的OI课程.这是你的最后一战,如果你失败了,可能就不能工地搬砖只能去清华了. 这天你背上行囊赴京赶考.此时

UOJ Round #8 赴京赶考 解题报告

算法零 $n,m \le 100, q \le 10$ 的话,直接给网格中的每一个格点都建一个点,然后该怎么最短路就怎么最短路,该怎么并查集+BFS就怎么并查集+BFS. 复杂度 $O(qnm)$,可以拿下前30分. 算法一 $n\le 10^5, m = 1, q\le 10^5$ 的话,我们可以直接预处理出 $(1,1)-(1,i)$ 的距离以及 $(1,i)-(1,n)$ 的距离,然后就枚举走的方式 $i-j$ 或者 $j-n-1-i$ 就可以啦. 复杂度 $O(n + q)$,结合算法零

血眼龙王传-李仲篇2

那年我离开西域明教总坛的时候,曲云来找我,说想让我去蜀中看看,于是我们一行人没有直接去长安,而是先去了蜀中,那段时间我特别喜欢听故事,因为我突然觉得,人的一生如此短暂,能经历的东西太少了,我很庆幸那段岁月,因为在路上听了足够多的故事,所以当我被困在少林地牢的时候,我能花很长时间来回忆那些故事,而不是一味的沉浸在自己曾经经历过的一些人一些事里面. 但是这并不是说我自己的那些事情就一定不好,陆危楼曾经有一次教我练功的时候说,二蛋,你的武学修为在明教目前可以说只在我之下,除了我之外,能放倒你的就只有曲

仰望星星的孩子-2014年终总结

2014一个满是故事的年份,2015一个充满希望的年份,也就在这样一个交接的月份里写下对这一年的总结. 在过去的一年里,我们都是仰望星星的孩子,因为我们中的每一个都在为我们的成长积累点点滴滴.从最开始的C/S 到后来的B/S再到年底的高校云平台,我们都在为我们的成长而努力. --------------------------------------------------------技术篇-----------------------------------------------------

智力趣题几则

古时一位农民被人诬陷,农民据理力争,县官因已经接受别人的贿赂,不肯放人,又找不到理由,就出了个坏主意.叫人拿来十张纸条,对农民说:“这里有十张纸条,其中有九张写的‘死’, 一张写的‘生’,你摸一张,如果是‘生’,立即放你回去,如果是‘死’,就怪你命不好,怨不得别人.”聪明的农民早已猜到纸条上写的都是“死”,无论抓哪一张都一样.于是他想了个巧妙的办法,结果死里逃生了.你知道他想的什么办法吗? 把其中的一张纸条吃下去,再根据排除法,结果就有九张死那么它吃下去的就是“生” 称苹果         有十

屯题1

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,y

【UOJ】【UR #2】猪猪侠再战括号序列(splay/贪心)

http://uoj.ac/problem/31 纪念伟大的没有调出来的splay... 竟然那个find那里写错了!!!!!!!!!!!!! 以后要记住:一定要好好想过! (正解的话我就不写了,太简单了.. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #

118. Pascal&#39;s Triangle

Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 分析 第k层有k个元素,每层第一个及最后一个元素值为1,对于(k>2)层,第n(n>1 && n < k)个元素A[k][n] = A[k-1][n-1]+A[k-1][n];

C程序设计语言练习题1-18

练习1-18 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行. 代码如下: #include <stdio.h> // 包含标准库的信息. #define MAXLINE 10 // 每行最大字符数为1000个. int getline(char line[], int maxline); int main() // 定义名为main的函数,它不接受参数值. { int len; int i; char line[MAXLINE]; while ((len = getli