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

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

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://uoj.ac/problem/118

Description

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

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

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

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

你的家在第 xs 行第 ys 列,高考考场在第 xe 行第 ye 列。现在你想从家出发到高考考场去。每次你可以:

向上移动一行。(如果你在第一行那么移动后会到最后一行去)
    向下移动一行。(如果你在最后一行那么移动后会到第一行去)
    向左移动一列。(如果你在第一列那么移动后会到最后一列去)
    向右移动一列。(如果你在最后一列那么移动后会到第一列去)

对于每次移动,如果移动前的格子上标的数跟移动后的格子上标的数不同,那么就要耗费 1 分钟时间等待瞬移装置调整配置,否则不耗时间。

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

Input

第一行两个正整数 n,m,表示网格图为 n 行 m 列。

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

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

接下来一个正整数 q。

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

Output

共 q 行,每行一个整数表示最少花费多少分钟。

Sample Input

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

Sample Output

0
1

HINT

n,m≤105    q≤105

题意

题解:

n,m≤105,q≤105 的话,我们发现我们可以突破维度的界限,把每一维拆开分别考虑,最后的答案就是每一维的答案的和。

这为啥是对的呢?

对于 ai≠ai+1,无论 bj 取啥值,你从 (i,j) 穿越到 (i+1,j) 的时候,都必然会花费等待时间;否则如果 ai=ai+1 的话,就必然不会花费等待时间。所以一条路线的总等待时间可以拆分成各个维度的等待时间的和。

然后这个问题就变成一维问题啦,直接用算法一的搞法就可以了。

复杂度 O(n+m+q),可以拿下100分。

代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define test freopen("test.txt","r",stdin)
#define maxn 2000001
#define mod 10007
#define eps 1e-6
const int inf=0x3f3f3f3f;
const ll infll = 0x3f3f3f3f3f3f3f3fLL;
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
//**************************************************************************************

int a[maxn];
int b[maxn];
int pre[maxn];
int pre1[maxn];
int n,m;
int solve1(int x,int y)
{
    if(y>=x)
        return pre[y]-pre[x];
    return pre[n]-pre[x]+pre[y]+(a[n]^a[1]);
}
int solve2(int x,int y)
{
    if(y>=x)
        return pre1[y]-pre1[x];
    return pre1[m]-pre1[x]+pre1[y]+(b[m]^b[1]);
}
int main()
{
    //test;
    n=read(),m=read();
    for(int i=1;i<=n;i++)
    {
        a[i]=read();
        if(i!=1)
            pre[i]=pre[i-1]+(a[i]^a[i-1]);
    }
    for(int i=1;i<=m;i++)
    {
        b[i]=read();
        if(i!=1)
            pre1[i]=pre1[i-1]+(b[i]^b[i-1]);
    }
    int q=read();
    for(int i=0;i<q;i++)
    {
        int x1=read(),y1=read(),x2=read(),y2=read();
        printf("%d\n",min(solve1(x1,x2),solve1(x2,x1))+min(solve2(y1,y2),solve2(y2,y1)));
    }
}
时间: 2024-10-22 17:25:15

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

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

链接:#118. [UR #8]赴京赶考 高中,高中,短暂的三年.NOI是高中结业考试,而高考在每年暑假举行. 高二暑假,这是你最后一次参加高考的机会.你已经为了高考停课很久了,OI的知识很久没管了.你并没有能力用一年时间补起别人三年的OI课程.这是你的最后一战,如果你失败了,可能就不能工地搬砖只能去清华了. 这天你背上行囊赴京赶考.此时全国交通主要靠瞬间传送装置.全国交通网络可以抽象为一张 nn 行 mm 列的网格图.行依次编号为 1,-,n1,-,n,列依次编号为 1,-,m1,-,m. 有

#82. 【UR #7】水题生成器

链接:http://uoj.ac/problem/82 今天是世界水日,著名的水题资源专家蝈蝈大臣向世界宣布了他的一项新发明 -- 水题生成器. 每道题目都有一个正整数的难度值.水题生成器虽然强大但是功能有限.水题生成器内部有一个参数 nn,你可以告诉水题生成器一个能整除 n!n! 的正整数 dd,水题生成器就会产生一道难度值恰为 dd 的水题.这里 n!n! 表示 nn 的阶乘. 现在蝈蝈大臣的助手欧姆想用水题生成器产生不超过 nn 道水题,且难度值之和恰为 mm.保证 1≤m≤n!1≤m≤n

【UR #7】水题走四方

题目描述 今天是世界水日,著名的水题资源专家蝈蝈大臣发起了水题走四方活动,向全世界发放成千上万的水题. 蝈蝈大臣是家里蹲大学的教授,当然不愿意出门发水题啦!所以他委托他的助手欧姆来发. 助手欧姆最近做 UR #6 被狗狗传染了懒癌,当然不愿意出门发水题啦!所以他请来了高手 -- 地卜师. 全世界一共 n 个城市,编号分别为 1,-,n.城市之间由双向道路相连,形成了一棵树.如果这棵树以 1 为根,则除 1 以外每个结点 v 的父亲结点的编号 pv 满足 pv<v. 由于地卜师掌握了克隆的核心科技

【BZOJ】初级水题列表——献给那些想要进军BZOJ的OIers(自用,怕荒废了最后的六月考试月,刷刷水题,水水更健康)

BZOJ初级水题列表——献给那些想要进军BZOJ的OIers 代码长度解释一切! 注:以下代码描述均为C++ RunID User Problem Result Memory Time Code_Length 695765 Eolv 1000 Accepted 804 kb 0 ms 118 B 739478 Eolv 2463 Accepted 804 kb 0 ms 134 B 696662 Eolv 1968 Accepted 1272 kb 48 ms 137 B 739546 Eolv

【Floyd(并非水题orz)】BZOJ4093-[Usaco2013 Dec]Vacation Planning

最近刷水太多标注一下防止它淹没在silver的水题中--我成为了本题,第一个T掉的人QAQ [题目大意] Bovinia设计了连接N (1 < = N < = 20,000)个农场的航班.对于任何航班,指定了其中的k个农场作为枢纽. (1 < = K <= 200 , K < = N). 目前,共有M种单向航班( 1 < = M < = 20,000 ),第i个航班从农场u_i至农场v_i花费d_i ( 1 < = d_i < =10,000 )美元.

poj水题-1001 一个简单的大数乘幂算法实现

说到底就是一个大数乘幂运算,小数点后零.明白大数乘幂算法直接搞. 这里就有几个问题: 1.幂位数小可以用二进制容器表示(取模更好,但我是为了练习STL) 2.n位大数用string表示,外加一个int型表示小数点位置 3.字符串×字符串用小学竖式乘法算法就行,注意补零.位数多时两个string两个string地加. 代码长,但理解容易,大数乘法,加法函数很多都能重用. 1 #include <iostream> 2 #include <vector> 3 #include <

水题 ZOJ 3875 Lunch Time

题目传送门 1 /* 2 水题:找排序找中间的价格,若有两个,选价格大的: 3 写的是有点搓:) 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cmath> 9 #include <cstring> 10 #include <string> 11 #include <map> 12 #include <

2015南阳CCPC L - Huatuo&#39;s Medicine 水题

L - Huatuo's Medicine Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Huatuo was a famous doctor. He use identical bottles to carry the medicine. There are different types of medicine. Huatuo put medicines into the bottles and chain these b

sdut 2841 Bit Problem (水题)

题目 贴这个题是因为看题解有更简单的方法, 我做的时候是直接算的, 也很简单. 贴一下题解吧: 如果一个整数不等于 0,那么该整数的二进制表示中至少有一位是 1. 这个题结果可以直接输出 x - (x&(x-1)); 因为x-1 之后二进制下,就是最右边的1变成了0, 最右边的1的 右边所有的0变成了1, 不影响最左边. 我的代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4