uoj #118. 【UR #8】赴京赶考 水题
生活随笔
收集整理的這篇文章主要介紹了
uoj #118. 【UR #8】赴京赶考 水题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#118. 【UR #8】赴京趕考
Time Limit: 20 Sec
Memory Limit: 256 MB
題目連接
http://uoj.ac/problem/118
Description
高中,高中,短暫的三年。NOI是高中結(jié)業(yè)考試,而高考在每年暑假舉行。高二暑假,這是你最后一次參加高考的機(jī)會。你已經(jīng)為了高考停課很久了,OI的知識很久沒管了。你并沒有能力用一年時(shí)間補(bǔ)起別人三年的OI課程。這是你的最后一戰(zhàn),如果你失敗了,可能就不能工地搬磚只能去清華了。
這天你背上行囊赴京趕考。此時(shí)全國交通主要靠瞬間傳送裝置。全國交通網(wǎng)絡(luò)可以抽象為一張 n 行 m 列的網(wǎng)格圖。行依次編號為 1,…,n,列依次編號為 1,…,m。
有 n+m 個為 0 或 1 的整數(shù) a1,…,an,b1,…,bm。對于 1≤i≤n,1≤j≤m,如果 ai=bj 那么網(wǎng)格圖上第 i 行第 j 列上標(biāo)著 0 否則標(biāo)著 1。
你的家在第 xs 行第 ys 列,高考考場在第 xe 行第 ye 列。現(xiàn)在你想從家出發(fā)到高考考場去。每次你可以:
??? 向上移動一行。(如果你在第一行那么移動后會到最后一行去)
??? 向下移動一行。(如果你在最后一行那么移動后會到第一行去)
??? 向左移動一列。(如果你在第一列那么移動后會到最后一列去)
??? 向右移動一列。(如果你在最后一列那么移動后會到第一列去)
對于每次移動,如果移動前的格子上標(biāo)的數(shù)跟移動后的格子上標(biāo)的數(shù)不同,那么就要耗費(fèi) 1 分鐘時(shí)間等待瞬移裝置調(diào)整配置,否則不耗時(shí)間。
現(xiàn)在你想知道你從家出發(fā)到高考考場最少需要花多長時(shí)間。
Input
第一行兩個正整數(shù) n,m,表示網(wǎng)格圖為 n 行 m 列。第二行 n 個整數(shù),分別表示 a1,…,an。保證 a1,…,an∈{0,1}。
第三行 m 個整數(shù),分別表示 b1,…,bm。保證 b1,…,bm∈{0,1}。
接下來一個正整數(shù) q。
接下來 q 行,每行四個整數(shù) xs,ys,xe,ye。表示詢問如果你的家在第 xs 行第 ys 列,高考考場在第 xe 行第 ye 列時(shí)的最少花費(fèi)時(shí)間。
Output
共 q 行,每行一個整數(shù)表示最少花費(fèi)多少分鐘。
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 的話,我們發(fā)現(xiàn)我們可以突破維度的界限,把每一維拆開分別考慮,最后的答案就是每一維的答案的和。
這為啥是對的呢?
對于 ai≠ai+1,無論 bj 取啥值,你從 (i,j) 穿越到 (i+1,j) 的時(shí)候,都必然會花費(fèi)等待時(shí)間;否則如果 ai=ai+1 的話,就必然不會花費(fèi)等待時(shí)間。所以一條路線的總等待時(shí)間可以拆分成各個維度的等待時(shí)間的和。
然后這個問題就變成一維問題啦,直接用算法一的搞法就可以了。
復(fù)雜度 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)));} }?
轉(zhuǎn)載于:https://www.cnblogs.com/qscqesze/p/4580597.html
總結(jié)
以上是生活随笔為你收集整理的uoj #118. 【UR #8】赴京赶考 水题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: typecho除了首页其他大部分网页40
- 下一篇: windows操作笔记