首页 > 代码库 > 2017-5-20-Train: 喵哈哈村的魔法考试 Round #17 (Div.2)

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

A.喵哈哈村的秘境探险(数学)

描述

喵哈哈村的一堆人在前往北京的路上,发现了一个洞穴。由于好奇心大作,于是准备前往洞穴进行探险。

但是有一些人并不愿意前往洞穴,于是他们决定玩以下游戏,来看是否能够去秘境探险:

这儿有n个数,如果所有数的乘积是k的倍数,那么就去探险,否则就不去。

现在问你是否会去。

输入

本题包含若干组测试数据。第一行两个整数n,k,表示数的个数,和k。第二行n个整数,a[i]。满足1<=n<=1000,1<=k,a[i]<=1e6

输出

如果要去的话,输出Yes,否则输出N

样例输入1

 

复制

3 51 2 43 81 2 4

样例输出1

NoYes

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         else19             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

 

复制

31 2 331 12 2 1 3

样例输出1

120

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

 

复制

51 2 3 4 510 9 8 7 611 12 13 14 1520 19 18 17 1621 22 23 24 255C 1 1 3QS 1 3 5 5S 3 1 5 5Q

样例输出1

243

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)