Gym - 102861B 、Gym - 102861F、Gym 102861G、Gym 102861L、Gym 102861N、Gym 101968C、Gym 101968D

训练赛链接:https://vjudge.net/contest/410049#problem/D

 

Gym - 102861B

题意:

在一个二维平面上,给你一个船,问你在这个二维平面上有没有船重叠。有的话输出N,否则输出Y

D、L、R、C确定一个船在二维平面上的位置,D为0表示船平行于X轴放置,为1平行y轴放置。L表示船得长度。(R,C)表示船头所在位置

 

 

 

题解:

模拟判断就行,数据不大

 

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int mp[110][110];
 5 
 6 int main()
 7 {
 8     int n, flag = 1;
 9     scanf("%d", &n);
10     for (int i = 1; i <= n; i++)
11     {
12         int d, l, r, c;
13         scanf("%d %d %d %d", &d, &l, &r, &c);
14         if (d == 0)
15         {
16             if (c + l - 1 > 10)
17                 flag = 0;
18             else
19             {
20                 for (int j = c; j <= c + l - 1; j++)
21                 {
22                     if (mp[r][j])
23                         flag = 0;
24                     else
25                         mp[r][j] = 1;
26                 }
27             }
28         }
29         else
30         {
31             if (r + l - 1 > 10)
32                 flag = 0;
33             for (int j = r; j <= r + l - 1; j++)
34             {
35                 if (mp[j][c])
36                     flag = 0;
37                 else
38                     mp[j][c] = 1;
39             }
40         }
41     }
42     if (flag)
43         puts("Y");
44     else
45         puts("N");
46 }
View Code

 

 

Gym - 102861F 

题意:

给你一个由S、R、Q字符组成的字符串,这个字符串用来描述两个人的比赛信息。比赛采取三局两胜制,每一局获胜条件如下:

1、一个人的得分大于等于10

2、一个人得分大于等于5,且要比对手多两分

3、一局由多轮游戏构成,每一轮游戏有一个发球人和一个接球人构成

刚开始由左边的人发球,之后每一轮由上一轮赢的人发球(谁赢了就得一分)

 

字符串中S表示发球人得一分,R表示接球人得分。Q表示宣布一下当前比赛情况

 

输出格式:

1、如果现在已经有人赢了两局就输出“GL - GR”,GL表示左边人赢了几局,GR表示右边人赢了几局。并在获胜者一方加上“(winner)”

2、如果没有人赢了两局,输出"GL (PL) - GR (PR)",GL、GR解释如上,PL表示左边人当前局得分,PR表示右边人当前局得分

 

样例解释:

SRSSQSSSSQRRSS

1、因为最开始左边人发球,且第一个字符为S,那么发球人得分,也就是左边的人得一分

2、之后左边继续发球,第二个字符为R,所以接球人得分,也就是右边的人得一分

3、之后右边发球,第三个字符为S,所以接球人得分,也就是右边的人得一分

4、之后右边发球,第四个字符为S,所以接球人得分,也就是右边的人得一分

5、出现Q,输出比赛信息

6、后面就不说了

 

题解:

模拟

 

代码:

  1 /*
  2  * @Author: hesorchen
  3  * @Date: 2020-11-21 17:26:53
  4  * @LastEditTime: 2020-11-26 16:23:35
  5  * @Description: 栽种绝处的花
  6  */
  7 #include <bits/stdc++.h>
  8 using namespace std;
  9 typedef long long ll;
 10 const int maxn = 5e6 + 5;
 11 const ll mod = 1e9 + 7;
 12 char s[maxn];
 13 int main()
 14 {
 15     scanf("%s",s+1);
 16     int len=strlen(s+1);
 17     int xian=0,num_0=0,num_1=0,win_0=0,win_1=0,flag=0;
 18     for(int i=1;i<=len;++i)
 19     {
 20         if(s[i]!='Q')
 21         {
 22             if(flag) continue;
 23             if(xian==0)
 24             {
 25                 if(s[i]=='S')
 26                 {
 27                     num_0++;
 28                 }
 29                 else 
 30                 {
 31                     xian=1-xian;
 32                     num_1++;
 33                 }
 34             }
 35             else 
 36             {
 37                 if(s[i]=='S')
 38                 {
 39                     num_1++;
 40                 }
 41                 else 
 42                 {
 43                     xian=1-xian;
 44                     num_0++;
 45                 }
 46             }
 47             if(num_0==10 || num_1==10)
 48             {
 49 
 50                 if(num_0==10)
 51                 {
 52                     win_0++;
 53                     //win_1=0;
 54                 }
 55                 else
 56                 {
 57                     win_1++;
 58                     //win_0=0;
 59                 }
 60                 num_0=num_1=0;
 61             }
 62             else if(abs(num_0-num_1)>=2 && max(num_0,num_1)>=5)
 63             {
 64                 if(num_0-num_1>0)
 65                 {
 66                     win_0++;
 67                     //win_1=0;
 68                 }
 69                 else 
 70                 {
 71                     win_1++;
 72                     //win_0=0;
 73                 }
 74                 num_0=num_1=0;
 75             }
 76             if(win_0>=2 || win_1>=2)
 77             {
 78                 flag=1;
 79             }
 80         }
 81         else 
 82         {
 83             if(flag)
 84             {
 85                 if(win_0==2)
 86                 {
 87                     printf("%d (winner) - %d\n",win_0,win_1);
 88                 }
 89                 else 
 90                 {
 91                     printf("%d - %d (winner)\n",win_0,win_1);
 92                 }
 93             }
 94             else 
 95             {
 96                 if(xian==0)
 97                 printf("%d (%d*) - %d (%d)\n",win_0,num_0,win_1,num_1);
 98                 else printf("%d (%d) - %d (%d*)\n",win_0,num_0,win_1,num_1);
 99             }
100         }
101     }
102     return 0;
103 }
104 /*
105 SSSSSQRSSSSQSSSSSQ
106 */
View Code

 

Gym - 102861G

题意:

找到前缀和最大的数,如果最大的数为负数就直接输出100,否则就加上100输出

 

代码:

 1 /*
 2  * @Author: hesorchen
 3  * @Date: 2020-11-21 17:26:53
 4  * @LastEditTime: 2020-11-26 13:07:25
 5  * @Description: 栽种绝处的花
 6  */
 7 #include <bits/stdc++.h>
 8 using namespace std;
 9 
10 int s[110];
11 int a[110];
12 int main()
13 {
14     int n;
15     scanf("%d", &n);
16     for (int i = 1; i <= n; i++)
17         scanf("%d", &a[i]);
18     int ans = 0;
19     for (int i = 1; i <= n; i++)
20     {
21         s[i] = s[i - 1] + a[i];
22         ans = max(s[i] + 100, ans);
23     }
24     printf("%d\n", max(100, ans));
25 }
View Code

 

Gym - 102861L 

题意:

给你一个n行m列由字母组成的方格,后面给你k个字符串si。

对于字符串si排列组合得到的所有新字符串(例如给你abc,你就可以得到abc、acb、bac、bca、cab、cba),看看这些所有新字符串可不可以在输入的n行m列的

方格中找到(找到是指横竖斜三种方向能找到这个字符串就可以),可以的话就标记。

如果某个方格被两个字符串si,sj(i!=j)的全排列标记到了,那么这个方格位置就是特殊的方格,最后输出特殊方格数量

样例:

4 5
XBOIC
DKIRA
ALBOA
BHGES
3
BOLA
CASA
BOI

 

 

 

 

题解:

模拟

 

代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 char mp[100][100];
 5 int col[100][100];
 6 string s[100];
 7 int main()
 8 {
 9     int n, m;
10     scanf("%d %d", &n, &m);
11     for (int i = 1; i <= n; i++)
12         scanf("%s", mp[i] + 1);
13     int k = 0;
14     scanf("%d", &k);
15     for (int i = 1; i <= k; i++)
16     {
17         cin >> s[i];
18         sort(s[i].begin(), s[i].end());
19     }
20     for (int i = 1; i <= n; i++)
21     {
22         for (int j = 1; j <= m; j++)
23         {
24             for (int l = 1; l <= k; l++)
25             {
26                 int len = s[l].size();
27                 string temp;
28                 temp = "";
29                 for (int o = 0; o < len; o++)
30                     temp += mp[i][j + o];
31                 sort(temp.begin(), temp.end());
32                 if (temp == s[l])
33                     for (int o = 0; o < len; o++)
34                     {
35                         if (col[i][j + o] == -1)
36                             continue;
37                         else if (col[i][j + o] == 0)
38                             col[i][j + o] = l;
39                         else if (col[i][j + o] != l)
40                             col[i][j + o] = -1;
41                     }
42 
43                 temp = "";
44                 for (int o = 0; o < len; o++)
45                     temp += mp[i + o][j];
46                 sort(temp.begin(), temp.end());
47                 if (temp == s[l])
48                     for (int o = 0; o < len; o++)
49                     {
50                         if (col[i + o][j] == -1)
51                             continue;
52                         else if (col[i + o][j] == 0)
53                             col[i + o][j] = l;
54                         else if (col[i + o][j] != l)
55                             col[i + o][j] = -1;
56                     }
57                 temp = "";
58                 for (int o = 0; o < len; o++)
59                     temp += mp[i + o][j + o];
60                 sort(temp.begin(), temp.end());
61                 if (temp == s[l])
62                     for (int o = 0; o < len; o++)
63                     {
64                         if (col[i + o][j + o] == -1)
65                             continue;
66                         else if (col[i + o][j + o] == 0)
67                             col[i + o][j + o] = l;
68                         else if (col[i + o][j + o] != l)
69                             col[i + o][j + o] = -1;
70                     }
71 
72                 temp = "";
73                 for (int o = 0; o < len; o++)
74                     temp += mp[i - o][j + o];
75                 sort(temp.begin(), temp.end());
76                 if (temp == s[l])
77                     for (int o = 0; o < len; o++)
78                     {
79                         if (i - o < 0)
80                             continue;
81                         if (col[i - o][j + o] == -1)
82                             continue;
83                         else if (col[i - o][j + o] == 0)
84                             col[i - o][j + o] = l;
85                         else if (col[i - o][j + o] != l)
86                             col[i - o][j + o] = -1;
87                     }
88             }
89         }
90     }
91     int ans = 0;
92     for (int i = 1; i <= n; i++)
93         for (int j = 1; j <= m; j++)
94         {
95             ans += (col[i][j] == -1 ? 1 : 0);
96         }
97     printf("%d\n", ans);
98     return 0;
99 }
View Code

 

Gym - 102861N

题意:

题目说了好多都没用,大致意思就是给你一个二分图,左边点是M集合,右边点是N集合,M集合的每一个点mi都由一个pi表示,保证pi是素数

N集合的每一个点ni可以用ci来表示,把这个ci分解质因数,例如ci=12,那么ci的质因数为2,3,那么ci就和pi==2和pi==3的M集合里面的点相连

且和pi==2的点相连权值为2,因为2*2*3=12

 

现在不给你pi,给出所有ci,让你对pi排序之后输出

 

题解:

说了这么多,其实就是找出来ci的所有质因子,去重之后输出就可以了。。。。。

 

大质数分解板子

代码:

  1 /*
  2  * @Author: hesorchen
  3  * @Date: 2020-11-21 17:26:53
  4  * @LastEditTime: 2020-11-26 18:08:55
  5  * @Description: 栽种绝处的花
  6  */
  7 #include <bits/stdc++.h>
  8 using namespace std;
  9 #define LL long long
 10 set<long long> s;
 11 // void f(long long x)
 12 // {
 13 //     for (int i = 2; i <= sqrt(x); i++)
 14 //     {
 15 //         if (x % i == 0)
 16 //         {
 17 //             while (x % i == 0)
 18 //             {
 19 //                 s.insert(i);
 20 //                 x /= i;
 21 //             }
 22 //         }
 23 //     }
 24 //     if (x > 1)
 25 //         s.insert(x);
 26 // }
 27 const int maxn = 50005;
 28 const int INF = 0x3f3f3f3f;
 29 const int Times = 10;
 30 const int N = 5500;
 31 LL ct, cnt;
 32 LL fac[N];
 33 
 34 LL gcd(LL a, LL b)
 35 {
 36     return b ? gcd(b, a % b) : a;
 37 }
 38 LL multi(LL a, LL b, LL m)
 39 {
 40     LL ans = 0;
 41     a %= m;
 42     while (b)
 43     {
 44         if (b & 1)
 45         {
 46             ans = (ans + a) % m;
 47             b--;
 48         }
 49         b >>= 1;
 50         a = (a + a) % m;
 51     }
 52     return ans;
 53 }
 54 
 55 LL pow(LL a, LL b, LL m)
 56 {
 57     LL ans = 1;
 58     a %= m;
 59     while (b)
 60     {
 61         if (b & 1)
 62         {
 63             ans = multi(ans, a, m);
 64             b--;
 65         }
 66         b >>= 1;
 67         a = multi(a, a, m);
 68     }
 69     return ans;
 70 }
 71 
 72 bool Miller_Rabin(LL n)
 73 {
 74     if (n == 2)
 75         return true;
 76     if (n < 2 || !(n & 1))
 77         return false;
 78     LL m = n - 1;
 79     int k = 0;
 80     while ((m & 1) == 0)
 81     {
 82         k++;
 83         m >>= 1;
 84     }
 85     for (int i = 0; i < Times; i++)
 86     {
 87         LL a = rand() % (n - 1) + 1;
 88         LL x = pow(a, m, n);
 89         LL y = 0;
 90         for (int j = 0; j < k; j++)
 91         {
 92             y = multi(x, x, n);
 93             if (y == 1 && x != 1 && x != n - 1)
 94                 return false;
 95             x = y;
 96         }
 97         if (y != 1)
 98             return false;
 99     }
100     return true;
101 }
102 
103 LL pollard_rho(LL n, LL c)
104 {
105     LL i = 1, k = 2;
106     LL x = rand() % (n - 1) + 1;
107     LL y = x;
108     while (true)
109     {
110         i++;
111         x = (multi(x, x, n) + c) % n;
112         LL d = gcd((y - x + n) % n, n);
113         if (1 < d && d < n)
114             return d;
115         if (y == x)
116             return n;
117         if (i == k)
118         {
119             y = x;
120             k <<= 1;
121         }
122     }
123 }
124 
125 void find(LL n, int c)
126 {
127     if (n == 1)
128         return;
129     if (Miller_Rabin(n))
130     {
131         fac[ct++] = n;
132         return;
133     }
134     LL p = n;
135     LL k = c;
136     while (p >= n)
137         p = pollard_rho(p, c--);
138     find(p, k);
139     find(n / p, k);
140 }
141 
142 int main()
143 {
144     int n, m, K;
145     long long x;
146     scanf("%d %d %d", &n, &m, &K);
147     for (int i = 1; i <= m; i++)
148     {
149         scanf("%lld", &x);
150         ct = 0;
151         find(x, 120);
152         sort(fac, fac + ct);
153         int k = 1;
154         for (int j = 1; j < ct; j++)
155         {
156             if (fac[j] == fac[j - 1])
157                 continue;
158             else
159             {
160                 fac[k++] = fac[j];
161             }
162         }
163         cnt = k;
164         for (int j = 0; j < cnt; j++)
165             s.insert(fac[j]);
166     }
167     while (K--)
168     {
169         int a, b, c;
170         scanf("%d %d %d", &a, &b, &c);
171     }
172     for (auto it = s.begin(); it != s.end(); it++)
173     {
174         cout << *it << ' ';
175     }
176     puts("");
177 }
View Code

 

 

Gym - 101968C

 

题意:

模拟下面一段程序

f(l,r):
if l is equal to r then return a[l]
s = 0
for i = l to r: s = s + a[i]
return s + f(l+1,r) + f(l,r-1)

给你n个数ai,让你求f(1,n)%1e9+7

 

题解:

很明显就是让你求对于一个位置x(1<=x<=n),这个位置最后计算了多少次,设这个次数为wi,最后输出Σn1ai*wi 

打表求出来每一个位置的贡献,找规律,规律和杨辉三角很相似,最后是一个排列组合

 

代码:

 1 /*
 2  * @Author: hesorchen
 3  * @Date: 2020-11-21 17:26:53
 4  * @LastEditTime: 2020-11-26 15:39:57
 5  * @Description: 栽种绝处的花
 6  */
 7 #include <bits/stdc++.h>
 8 using namespace std;
 9 typedef long long ll;
10 const int maxn = 1e6 + 5;
11 const ll mod = 1e9 + 7;
12 ll ksm(ll a, ll b)
13 {
14     ll res = 1;
15     while (b)
16     {
17         if (b & 1)
18         {
19             res = (res * a) % mod;
20         }
21         b >>= 1;
22         a = (a * a) % mod;
23     }
24     return res;
25 }
26 ll fac[maxn], inv[maxn];
27 void init()
28 {
29     fac[0] = inv[0] = 1;
30     for (int i = 1; i <= maxn - 1; i++)
31     {
32         fac[i] = (i * fac[i - 1]) % mod;
33         inv[i] = (inv[i - 1] * ksm(i, mod - 2)) % mod;
34     }
35 }
36 ll C(int n, int m)
37 {
38     return ((fac[n] * inv[m]) % mod) * inv[n - m] % mod;
39 }
40 int main()
41 {
42     init();
43     int t, n;
44     scanf("%d", &t);
45     while (t--)
46     {
47         ll sum = 0, x;
48         scanf("%d", &n);
49         for (int i = 1; i <= n; i++)
50         {
51             scanf("%lld", &x);
52             sum = (sum + ((C(n + 1, i) - 1) * x % mod)) % mod;
53         }
54         printf("%lld\n",sum);
55     }
56 
57     return 0;
58 }
View Code

 

Gym - 101968D 

题意:

给你两个序列a,b,如果对a序列中一个数加上[-k,k],然后对a序列排序,对b序列排序之后两个序列相等就可以了

 

题解:

unordered_map弄一下就可以了

 

之前输入还没结束我们就break,导致出现ILE错误,一脸懵

 

代码:

 1 /*
 2  * @Author: hesorchen
 3  * @Date: 2020-11-21 17:26:53
 4  * @LastEditTime: 2020-11-26 17:16:06
 5  * @Description: 栽种绝处的花
 6  */
 7 #include <bits/stdc++.h>
 8 using namespace std;
 9 
10 unordered_map<int, int> mp;
11 
12 // inline int get(int x)
13 // {
14 //     return x * 13331 + 1000000007;
15 // }
16 
17 void read(int &v)
18 {
19     int k = 1;
20     v = 0;
21     int c = getchar();
22     while (c < '0' || c > '9')
23     {
24         if (c == '-')
25             k = 0;
26         c = getchar();
27     }
28     while (c >= '0' && c <= '9')
29         v = (v << 3) + (v << 1) + (c - 48), c = getchar();
30     if (k == 0)
31         v = -v;
32 }
33 int get(int x)
34 {
35     return (x * 1333331 + 1000000007) % 1000000007;
36 }
37 int main()
38 {
39     int t;
40     read(t);
41     while (t--)
42     {
43         mp.clear();
44         int n, k;
45         long long sum = 0;
46         read(n), read(k);
47         for (int i = 1; i <= n; i++)
48         {
49             int temp;
50             read(temp);
51             sum += temp;
52             mp[get(temp)]++;
53         }
54         int num1 = -1, num2 = -1, flag = 1;
55         for (int i = 1; i <= n; i++)
56         {
57             int temp;
58             read(temp);
59             if (flag == -1)
60                 continue;
61             if (mp[get(temp)] > 0)
62             {
63                 sum -= temp;
64                 mp[get(temp)]--;
65             }
66             else if (flag)
67             {
68                 flag = 0;
69                 num2 = temp;
70             }
71             else if (!flag)
72             {
73                 flag = -1;
74                 // break;
75             }
76         }
77         if (flag == 1)
78         {
79             puts("YES");
80         }
81         else if (flag == -1)
82         {
83             puts("NO");
84         }
85         else
86         {
87             long long temp = sum - (long long)num2;
88             if (abs(temp) <= k)
89                 puts("YES");
90             else
91                 puts("NO");
92         }
93     }
94 }
View Code

 

posted @ 2020-11-27 10:43  kongbursi  阅读(423)  评论(0编辑  收藏  举报