uoj #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課程。這是你的最后一戰,如果你失敗了,可能就不能工地搬磚只能去清華了。
這天你背上行囊赴京趕考。此時全國交通主要靠瞬間傳送裝置。全國交通網絡可以抽象為一張 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)));} }?
轉載于:https://www.cnblogs.com/qscqesze/p/4580597.html
總結
以上是生活随笔為你收集整理的uoj #118. 【UR #8】赴京赶考 水题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: typecho除了首页其他大部分网页40
- 下一篇: windows操作笔记