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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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)的主要内容,如果未能解决你的问题,请参考以下文章

喵哈哈村的魔法考试 Round #7 (Div.2) B

qscoj 128 喵哈哈村的魔法源泉(模仿快速幂,好题)

10喵哈哈村的魔法石

喵哈哈村的魔法考试 Round #3 (Div.2) ABCDE

喵哈哈村的魔法考试 Round #10 (Div.2) A

喵哈哈村的魔法考试 Round #14 (Div.2)