1. 程式人生 > >2017-5-20-Train: 喵哈哈村的魔法考試 Round #17 (Div.2)

2017-5-20-Train: 喵哈哈村的魔法考試 Round #17 (Div.2)

play eof ans cmd ems 輸出 最長路 坐標 魔法

A.喵哈哈村的秘境探險(數學)

描述

喵哈哈村的一堆人在前往北京的路上,發現了一個洞穴。由於好奇心大作,於是準備前往洞穴進行探險。

但是有一些人並不願意前往洞穴,於是他們決定玩以下遊戲,來看是否能夠去秘境探險:

這兒有n個數,如果所有數的乘積是k的倍數,那麽就去探險,否則就不去。

現在問你是否會去。

輸入

本題包含若幹組測試數據。第一行兩個整數n,k,表示數的個數,和k。第二行n個整數,a[i]。滿足1<=n<=1000,1<=k,a[i]<=1e6

輸出

如果要去的話,輸出Yes,否則輸出N

樣例輸入1

復制

3 5
1 2 4
3 8
1 2 4

樣例輸出1

No
Yes

Solve:

直接按照模的性質來就好了

Code:

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL n , k , x;
 5 LL ans;
 6 int main()
 7 {
 8     while(~scanf("%lld%lld" , &n , &k))
 9     {
10         ans = 1;
11         for(int i = 1 ; i <= n ; ++i)
12 { 13 scanf("%lld" , &x); 14 ans = ans * x % k; 15 } 16 if(!ans) 17 puts("Yes"); 18 else 19 puts("No"); 20 } 21 22 return 0; 23 }
View Code

B.喵哈哈村的秘境探險(前綴異或)

描述

喵哈哈村的一堆人在前往北京的路上,發現了一個洞穴。由於好奇心大作,於是準備前往洞穴進行探險。

秘境探險的第一關,是答對秘境門口的招牌上的問題。

招牌上的問題這樣寫道:

我想每次查詢區間的異或值,請你幫幫我。

輸入

本題包含若幹組測試數據。第一行一個n,表示有n個數。第二行n個整數,表示每個數a[i]第三行一個q,表示查詢的個數。接下來q行,每行l,r,表示要查詢的區間。滿足1<=n,q<=1e5 0<=a[i]<=1e6 1<=l<=r<=n

輸出

對於每組詢問,輸出答案。

樣例輸入1

復制

3
1 2 3
3
1 1
2 2 
1 3

樣例輸出1

1
2
0

Solve:

處理前綴異或,查詢像前綴和那樣查詢就行了

Code:

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 static const int MAXN = 1e5 + 10;
 4 typedef long long LL;
 5 LL pre[MAXN];
 6 int n , q;
 7 
 8 int main()
 9 {
10     while(~scanf("%d" , &n))
11     {
12         for(int i = 1 ; i <= n ; ++i)
13         {
14             scanf("%lld" , &pre[i]);
15             pre[i] ^= pre[i - 1];
16         }
17 
18         scanf("%d" , &q);
19         while(q--)
20         {
21             int x , y;
22             scanf("%d%d" , &x , &y);
23             printf("%lld\n" , pre[y] ^ pre[x - 1]);
24         }
25     }
26 }
View Code

C.喵哈哈村的秘境探險(DP)

描述

喵哈哈村的一堆人在前往北京的路上,發現了一個洞穴。由於好奇心大作,於是準備前往洞穴進行探險。

洞穴裏面沒想到別有一番風景,但是這個風景好像有一些神秘。

我們可以把風景看作一個n*n的地圖,每個點有它的初始高度。有一個小球,它只能從高處往低處滑【嚴格大於】。但是由於地勢經常變動,高度經常變化;同時,喵哈哈村發現,有些位置會不能滑動。

現在,給出每個n*n個點的初始高度,並給出m個命令:

C a b c表示坐標為a,b的點的高度改為c;

S a b c d表示左上角為a,b右下角為c,d的矩形地區不能繼續經過;

B a b c d表示左上角為a b,右下角為c d的矩形地區可以經過;

Q表示詢問現在該風景小球可以走的最長路徑為多少。對於每個Q要作一次回答。

輸入

第一行n,第二行開始n*n的地圖,意義如上;接下來一個m,然後是m個命令,如上1<=n<=700;1<=m<=1000000;其中Q、S、B操作分別<=100;題中所有數據不超過2*10^9的正整數

輸出

對於每個Q,輸出答案。

樣例輸入1

復制

5
1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
5
C 1 1 3
Q
S 1 3 5 5
S 3 1 5 5
Q

樣例輸出1

24
3

Solve:

經典滑雪問題,直接暴力修改,數據不大

Code:

技術分享
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 #define CLR(x , v)    memset(x , v , sizeof(x))
  5 
  6 static const int MAXN = 800;
  7 static const int dirx[4] = {1 , 0 , -1 , 0};
  8 static const int diry[4] = {0 , 1 , 0 , -1}; 
  9 
 10 bool vis[MAXN][MAXN];
 11 int data[MAXN][MAXN];
 12 int dp[MAXN][MAXN];
 13 int n , m;
 14 
 15 int Dfs(int x , int y)
 16 {
 17     if(vis[x][y])
 18         return 0;
 19 
 20     if(dp[x][y])
 21         return dp[x][y];
 22 
 23     dp[x][y] = 1;
 24 
 25     for(int i = 0 ; i < 4 ; ++i)
 26     {
 27         int nx = x + dirx[i] , ny = y + diry[i];
 28 
 29         if(nx > n || ny > n || nx < 1 || ny < 1)
 30             continue;
 31 
 32         if(data[nx][ny] >= data[x][y])
 33             continue;
 34 
 35         dp[x][y] = max(dp[x][y] , Dfs(nx , ny) + 1);
 36     }
 37 
 38     return dp[x][y];
 39 }
 40 
 41 int main()
 42 {
 43     scanf("%d" , &n);
 44     for(int i = 1 ; i <= n ; ++i)
 45     {
 46         for(int j = 1 ; j <= n ; ++j)
 47         {
 48             scanf("%d" , &data[i][j]);
 49         }
 50     }
 51 
 52     scanf("%d" , &m);
 53     while(m--)
 54     {
 55         char cmd[3] = {\0};
 56         int a , b , c , d;
 57         scanf(" %s" , cmd);
 58         if(cmd[0] == Q)
 59         {
 60             int ans = 0;
 61             memset(dp , 0 , sizeof(dp));
 62             for(int i = 1 ; i <= n ; ++i)
 63             {
 64                 for(int j = 1 ; j <= n ; ++j)
 65                 {
 66                     ans = max(ans , Dfs(i , j));
 67                 }
 68             }
 69 
 70             printf("%d\n" , ans);
 71         }
 72         else if(cmd[0] == S)
 73         {
 74             scanf("%d%d%d%d" , &a , &b , &c , &d);
 75             for(int i = a ; i <= c ; ++i)
 76             {
 77                 for(int j = b ; j <= d ; ++j)
 78                 {
 79                     vis[i][j] = 1;
 80                 }
 81             }
 82         }
 83         else if(cmd[0] == B)
 84         {
 85             scanf("%d%d%d%d" , &a , &b , &c , &d);
 86             for(int i = a ; i <= c ; ++i)
 87             {
 88                 for(int j = b ; j <= d ; ++j)
 89                 {
 90                     vis[i][j] = 0;
 91                 }
 92             }
 93         }
 94         else
 95         {
 96             scanf("%d%d%d" , &a , &b , &c);
 97             data[a][b] = c;
 98         }
 99     }
100 }
View Code

2017-5-20-Train: 喵哈哈村的魔法考試 Round #17 (Div.2)