Codeforces Round #632 (Div. 2)


比賽鏈接:https://codeforces.com/contest/1333

比賽的時候,寫D的時候用了cin,cout的優化結果還是被卡了,看來cin,cout得少用。

 

A - Little Artem

給你n * m的矩陣,只有B和W,相鄰有其他不一樣的點成為好點,讓好點B的數量多於W。那么直接讓左上角的一塊為B其余為W即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <bits/stdc++.h>
 4 using namespace std;
 5  
 6 const int N = 1e5 + 10;
 7  
 8 int n, m;
 9 int T;
10  
11 int main()
12 {
13     cin >> T;
14     while(T --)
15     {
16         scanf("%d%d", &n, &m);
17         for (int i = 1; i <= n; i ++)
18         {
19         
20         for (int j = 1; j <= m; j ++)
21         {
22             if(i == 1 && j == 1)
23             {
24                 cout << "W";
25             }
26             else
27             cout << "B";
28         }
29         cout << endl;
30     }
31     }
32 }
View Code

 

B - Kind Anton

給定一個n,長度為n的a數組和b數組,a[i]∈{1, -1, 0},m為任意整數,a[i]只能+a[j](j < i),那么根據題意,從后向前模擬即可。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <bits/stdc++.h>
 4 using namespace std;
 5  
 6 const int N = 1e5 + 10;
 7  
 8 int n, m;
 9 int T;
10 int a[N];
11 int b[N];
12 map<int, int>s;
13  
14 int main()
15 {
16     cin >> T;
17     while(T --)
18     {
19         s.clear();
20         scanf("%d", &n);
21         for (int i = 1; i <= n; i ++)
22             scanf("%d", &a[i]), s[a[i]]++;
23         for (int i = 1; i <= n; i ++)
24             scanf("%d", &b[i]);
25         bool flag = true, flag2 = false;
26         bool t1 = false;
27         bool t2 = false;
28         for (int i = n; i >= 1; i --)
29         {
30             s[a[i]] --;
31             if(a[i] == b[i]) continue;
32             if(a[i] < b[i])
33             {
34                 if(!s[1])
35                 {
36                     flag = false;
37                     break;
38                 }
39             }
40             if(a[i] > b[i])
41             {
42                 if(!s[-1])
43                 {
44                     flag = false;
45                     break;
46                 }
47             }
48         }
49         if(flag)
50         {
51             puts("YES");
52         }
53         else
54         {
55             puts("NO");
56         }
57     }
58     
59 }
View Code

 

 

C - Eugene and an array

給定長度為n的序列,定義序列a為“好的”,當且僅當,a的子段中不存在sum值為0。那么根據題意,若sum[a[i]]在i前面存在,那么這樣的序列只能最后一次取到sum[a[i]]的下標k以后,數量為i - k。

 

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 2e5+10;
 5 ll a[N];
 6 map<ll, ll>mp;
 7 int main()
 8 {
 9     ll n;
10     scanf("%lld", &n);
11     for(int i = 1; i <= n; i++)
12     scanf("%lld", &a[i]);
13     ll sum = 0, res = 0, last = 0;
14     mp[0] = 1;
15     for(int i = 1; i <= n; i++)
16     {
17         sum += a[i];
18         if(mp[sum]) last = max(last, mp[sum]);
19         res += i - last;
20         mp[sum] = i+1;
21  
22     }
23     printf("%lld\n", res);
24 }
View Code

 

D - Challenges in school №41

有一個n個箭頭箭頭序列,只能是L(左箭頭)或者R(右箭頭),每次操作可以選一對相鄰的相對的箭頭變成相背的箭頭。每秒操作至少1次,求能夠恰好k秒把整個箭頭序列變成沒有任何相對的箭頭。

那么最后的序列肯定是LLLL...LLRRR....R這樣,那么可以暴力算出每一輪能移多少並且至少移幾輪。因為n只有3000,最壞情況下o(n²),滿足條件。

當出現RL的時候就把R的下標保存。當RLL的時候要移倆輪,所以每次有RL存在,i++。

那么假設算出x輪,一共需要移y次。那么存在有解的情況的一定是x <= k && k <= y的。然后去貪心分配輪的次數,實現具體看代碼。

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 3e3+10;
 5 char s[N];
 6 int n, k;
 7 vector<int>a[N];
 8  
 9 int main()
10 {
11     scanf("%d%d", &n, &k);
12     scanf("%s", s + 1);
13     int cnt  = 0;
14     while(1)
15     {
16         cnt ++;
17         bool flag = true;
18         for (int i = 1; i < n; i ++)
19         {
20             if(s[i] == 'R' && s[i + 1] == 'L')
21             {
22                 flag = false;
23                 a[cnt].push_back(i);
24                 swap(s[i], s[i + 1]);
25                 i ++;
26             }
27         }
28         if(flag)
29         {
30             break;
31         }
32     }
33     cnt --;
34     if(cnt == 0)
35     {
36         puts("-1");
37         return 0;
38     }
39     ll res = 0;
40     for (int i = 1; i <= cnt; i ++)
41     {
42         res += a[i].size();
43     }
44     if(res < k || cnt > k)
45     {
46         puts("-1");
47         return 0;
48     }
49     ll tmp = k - cnt;
50     for (int i = 1; i <= n; i ++)
51     {
52         int t = a[i].size();
53         if(tmp >= t - 1)
54         {
55             for (int j = 0; j < t; j ++)
56             {
57                 printf("1 %d\n", a[i][j]);
58             }
59             tmp -= t - 1;
60         }
61         else
62         {
63             if(tmp)
64             {
65                 for (int j = 0; j < tmp; j  ++)
66                 {
67                         printf("1 %d\n", a[i][j]);
68  
69                 }
70                 printf("%d ", t - tmp);
71                 for (int j = tmp; j < t; j ++)
72                 {
73                     printf("%d ", a[i][j]);
74                 }
75                 puts("");
76                 tmp = 0;
77             }
78             else
79             {
80             
81                 
82                 printf("%d ", t);
83                 for (int j = 0; j <t; j ++)
84                 {
85                 printf("%d ", a[i][j]);
86                 }
87                 puts("");
88             
89             }
90         }
91     }
92 }
View Code

 

E - Road to 1600

定義車和皇后都從1出發每次到可以到達的最小的位置,如果無法通行,則花費1到未到達的最小位置。給定一個n找到皇后的花費比車多的n * n的矩陣。

首先1和2肯定不行,然后寫個暴力程序,發現n = 3的時候就有滿足的情況。再考慮n變大以后,因為車和皇后的x軸y軸的方向是一樣的,所以可以讓其路徑相同,直到最后一個3 * 3矩陣,讓皇后的花費多余車。

  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 int n;
  6 int ma[510][510];
  7 
  8 int main()
  9 {
 10     scanf("%d", &n);
 11     if(n <= 2)
 12     {
 13         puts("-1");
 14         return 0;
 15     }
 16     int tmp = 0;
 17     if(n == 3)
 18     {
 19         ma[n - 1][n - 1] = ++ tmp;
 20         ma[n - 1][n] = ++ tmp;
 21         ma[n][n] = ++ tmp;
 22         ma[n][n - 2] = ++ tmp;
 23         ma[n - 1][n - 2] = ++ tmp;
 24         ma[n - 2][n] = ++ tmp;
 25         ma[n - 2][n - 1] = ++ tmp;
 26         ma[n - 2][n - 2] = ++ tmp;
 27         ma[n][n - 1] = ++ tmp;
 28     }
 29     else
 30     {
 31         if(n % 2)
 32         {
 33             for (int i = 1; i <= n - 3; i ++)
 34             {
 35                 if(i % 2)
 36                 {
 37                     for (int j = 1; j <= n; j ++)
 38                     {
 39                         ma[i][j] = ++ tmp;    
 40                     }            
 41                 }
 42                 else
 43                 {
 44                     for (int j = n; j >= 1; j --)
 45                         ma[i][j] = ++ tmp;
 46                 }
 47             }
 48             for (int i = 1; i <= n - 4; i ++)
 49             {
 50                 if(i % 2)
 51                 {
 52                     for (int j = n - 2; j <= n; j ++)
 53                     {
 54                         ma[j][i] = ++ tmp;
 55                     }
 56                 }
 57                 else
 58                 {
 59                     for (int j = n; j >= n - 2; j --)
 60                     {
 61                         ma[j][i] = ++ tmp;
 62                     }
 63                 }
 64             }
 65             ma[n][n - 3] = ++ tmp;
 66             ma[n - 2][n - 3] = ++ tmp;
 67             ma[n - 1][n - 3] = ++ tmp;
 68         }
 69         else
 70         {
 71         
 72             for (int i = 1; i <= n - 3; i ++)
 73             {
 74                 if((i % 2) != 1)
 75                 {
 76                     for (int j = 1; j <= n; j ++)
 77                     {
 78                         ma[i][j] = ++ tmp;    
 79                     }            
 80                 }
 81                 else
 82                 {
 83                     for (int j = n; j >= 1; j --)
 84                         ma[i][j] = ++ tmp;
 85                 }
 86             }
 87             for (int i = 1; i <= n - 4; i ++)
 88             {
 89                 if(i % 2 != 1)
 90                 {
 91                     for (int j = n - 2; j <= n; j ++)
 92                     {
 93                         ma[j][i] = ++ tmp;
 94                     }
 95                 }
 96                 else
 97                 {
 98                     for (int j = n; j >= n - 2; j --)
 99                     {
100                         ma[j][i] = ++ tmp;
101                     }
102                 }
103             }
104                 ma[n - 2][n - 3] = ++ tmp;
105             ma[n][n - 3] = ++ tmp;
106             ma[n - 1][n - 3] = ++ tmp;
107         }
108             ma[n - 1][n - 1] = ++ tmp;
109             ma[n - 1][n] = ++ tmp;
110             ma[n][n] = ++ tmp;
111             ma[n][n - 2] = ++ tmp;
112             ma[n - 1][n - 2] = ++ tmp;
113             ma[n - 2][n] = ++ tmp;
114             ma[n - 2][n - 1] = ++ tmp;
115             ma[n - 2][n - 2] = ++ tmp;
116             ma[n][n - 1] = ++ tmp;
117     }
118     for (int i = 1; i <= n; i ++)
119     { 
120         for (int j = 1; j <= n; j ++)
121         {
122             printf("%d ", ma[i][j]);
123             }
124             puts("");
125     } 
126 }
View Code

 

F - Kate and imperfection

 給[1,n]的連續自然數。對[2,n]的每個k,都枚舉所有大小恰好為k的子集,然后定義一個值為f,其遍歷集合中所有的二元組,求出二元組的gcd,然后取這些gcd里面的最大值,求f的最小值。

第一眼看到這個東西的時候一點思路都沒有,后來看了大佬們的思路,發現是真的很神奇,對於每一個數(無論質數合數)x,都有一個最小質因子*一個數,那么我們就貪心,給n個數排序,肯定是讓最小質因子慢慢增大(1,1, 1, 2, 2,...3,),才會讓f的最大值最小。

那么根據歐拉篩每個合子都是被其最小質因子篩的。就可以在o(n) + o(nlogn)的情況下得到答案。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<vector>
 8 #include<set>
 9  
10 using namespace std;
11  
12 int read() 
13 {
14     char c;
15     while (c = getchar(), c != '-' && (c < '0' || c > '9'));
16     bool flag = (c == '-');
17     if (flag)
18         c = getchar();
19     int x = 0;
20     while (c >= '0' && c <= '9') {
21         x = x * 10 + c - '0';
22         c = getchar();
23     }
24     return flag ? -x : x;
25 }
26  
27 const int MAXN = 500000;
28  
29 bool flag[MAXN + 1];
30 int prime[MAXN], x[MAXN + 1];
31 
32 
33 int main() {
34     int n = read();
35     int total = 0;
36     x[1] = 1;
37     for (int i = 2; i <= n; i++) 
38     {
39         if (!flag[i]) 
40         { 
41             prime[total++] = i;
42             x[i] = 1;
43         }
44         for (int j = 0; j < total && i * prime[j] <= n; j++) {
45             int k = i * prime[j];
46             flag[k] = true;
47             x[k] = i;
48             if (!(i % prime[j]))
49                 break;
50         }
51     }
52     sort(x + 1, x + (n + 1));
53     for (int i = 2; i <= n; i++)
54         printf("%d%c", x[i], (i == n) ? '\n' : ' ');
55     return 0;
56 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM