Atcoder Beginer Contest 238By xiaruize
Problem
Data Tutorial A - Exponential or Quadratic Method当n ≥ 4 n \geq 4 n ≥ 4 或n = 1 n=1 n = 1 时,输出Y e s Yes Y e s
否则输出N o No N o
Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 #include <algorithm> #include <bitset> #include <cctype> #include <climits> #include <cmath> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <memory> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std;#define int long long #define ull unsigned long long #define ALL(a) (a).begin(), (a).end() #define pb push_back #define mk make_pair #define pii pair<int, int> #define pis pair<int, string> #define sec second #define ll long long #define fir first #define sz(a) int((a).size()) #define rep(i, x, y) for (int i = x; i <= y; i++) #define repp(i, x, y) for (int i = x; i >= y; i--) #define Yes cout << "Yes" << endl #define YES cout << "YES" << endl #define No cout << "No" << endl; #define NO cout << "NO" << endl; #define multitest(t) \ while (t--) \ solve(); #define r(n) cin >> n; #define double long double const int INF = 0x3f3f3f3f ;const int Mod = 1000000007 ;const int N = 1e5 + 10 ;signed main () { ios::sync_with_stdio (false ); cin.tie (0 ); cout.tie (0 ); int n; cin >> n; if (n > 4 || n == 1 ) Yes; else No; return 0 ; }
B - Pizza Method暴力 注意处理第1个和最后一个角
Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 #include <algorithm> #include <bitset> #include <cctype> #include <climits> #include <cmath> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <memory> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std;#define int long long #define ull unsigned long long #define ALL(a) (a).begin(), (a).end() #define pb push_back #define mk make_pair #define pii pair<int, int> #define pis pair<int, string> #define sec second #define ll long long #define fir first #define sz(a) int((a).size()) #define rep(i, x, y) for (int i = x; i <= y; i++) #define repp(i, x, y) for (int i = x; i >= y; i--) #define Yes cout << "Yes" << endl #define YES cout << "YES" << endl #define No cout << "No" << endl; #define NO cout << "NO" << endl; #define multitest(t) \ while (t--) \ solve(); #define r(n) cin >> n; #define double long double const int INF = 0x3f3f3f3f ;const int Mod = 1000000007 ;const int N = 1e5 + 10 ;int n;int a[400 ];vector<int > ans; int now;signed main () { ios::sync_with_stdio (false ); cin.tie (0 ); cout.tie (0 ); cin >> n; for (int i = 1 ; i <= n; i++) { cin >> a[i]; now = (now + a[i]) % 360 ; ans.pb (now); } if (n == 1 ) { cout << max (a[1 ], 360 - a[1 ]) << endl; return 0 ; } ans.pb (0 ); sort (ALL (ans)); int res = 0 ; for (int i = 0 ; i < ans.size () - 1 ; i++) { res = max (res, ans[i + 1 ] - ans[i]); } res = max (res, ans[0 ] - ans[ans.size () - 1 ] + 360 ); cout << res << endl; return 0 ; }
C - digitnum Method简单数学题
Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 #include <algorithm> #include <bitset> #include <cctype> #include <climits> #include <cmath> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <memory> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std;#define int __int128 #define ull unsigned long long #define ALL(a) (a).begin(), (a).end() #define pb push_back #define mk make_pair #define pii pair<int, int> #define pis pair<int, string> #define sec second #define ll long long #define fir first #define sz(a) int((a).size()) #define rep(i, x, y) for (int i = x; i <= y; i++) #define repp(i, x, y) for (int i = x; i >= y; i--) #define Yes cout << "Yes" << endl #define YES cout << "YES" << endl #define No cout << "No" << endl; #define NO cout << "NO" << endl; #define multitest(t) \ while (t--) \ solve(); #define r(n) cin >> n; #define double long double const int INF = 0x3f3f3f3f ;const int Mod = 998244353 ;const int N = 1e5 + 10 ;int n;inline __int128 read () { __int128 x = 0 , f = 1 ; char ch = getchar (); while (ch < '0' || ch > '9' ) { if (ch == '-' ) f = -1 ; ch = getchar (); } while (ch >= '0' && ch <= '9' ) { x = x * 10 + ch - '0' ; ch = getchar (); } return x * f; } inline void print (__int128 x) { if (x < 0 ) { putchar ('-' ); x = -x; } if (x > 9 ) print (x / 10 ); putchar (x % 10 + '0' ); } int p (int x, int y) { int res = 1 ; for (int i = 1 ; i <= y; i++) { res *= x % Mod; res = (res + Mod) % Mod; } return res; } signed main () { ios::sync_with_stdio (false ); cin.tie (0 ); cout.tie (0 ); n = read (); if (n <= 9 ) { print ((n + 1 ) * n / 2 ); return 0 ; } int m = n; int cnt = 0 ; while (m) { m /= 10 ; cnt++; } int ans = 45 ; for (int i = 2 ; i < cnt; i++) { int x = p (10 , i - 1 ); x *= 9 ; x %= Mod; ans += (x + 1 ) * x / 2 ; ans %= Mod; } int x = n - p (10 , cnt - 1 ) + 1 ; x %= Mod; ans += x * (x + 1 ) / 2 ; ans %= Mod; print (ans); return 0 ; }
D - AND and SUM Method 情况1 s < 2 a s<2a s < 2 a ∵ x A N D y = a \because x\ AND\ y\ =\ a ∵ x A N D y = a
∴ x ≥ a 且 y ≥ a \therefore x\geq a 且y\geq a ∴ x ≥ a 且 y ≥ a
∴ x + y ≥ 2 a \therefore x+y\geq 2a ∴ x + y ≥ 2 a
∵ x + y = s \because x+y = s ∵ x + y = s
∴ s ≥ 2 a \therefore s\geq 2a ∴ s ≥ 2 a
∴ \therefore ∴ 当s s s 小于2 a 2a 2 a 时直接输出N o No N o
情况2如果a a a 的当前位为1 1 1 ,则x x x 和y y y 的当前位都为1 1 1
如果a a a 的当前位为0 0 0 ,则x x x 和y y y 的当前位最多一个为1 1 1
于是就可以按位从高到低考虑当前位是否为1 1 1
Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 #include <algorithm> #include <bitset> #include <cctype> #include <climits> #include <cmath> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <memory> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std;#define int long long #define ull unsigned long long #define ALL(a) (a).begin(), (a).end() #define pb push_back #define mk make_pair #define pii pair<int, int> #define pis pair<int, string> #define sec second #define ll long long #define fir first #define sz(a) int((a).size()) #define rep(i, x, y) for (int i = x; i <= y; i++) #define repp(i, x, y) for (int i = x; i >= y; i--) #define Yes cout << "Yes" << endl #define YES cout << "YES" << endl #define No cout << "No" << endl; #define NO cout << "NO" << endl; #define multitest(t) \ while (t--) \ solve(); #define r(n) cin >> n; #define double long double const int INF = 0x3f3f3f3f ;const int Mod = 1000000007 ;const int N = 1e5 + 10 ;int t;int a, s;int cnt = 0 ;void solve () { cin >> a >> s; if (s < a * 2 ) { No; return ; } s -= a * 2 ; int x = s; cnt = 0 ; while (x) { cnt++; x /= 2 ; } for (int i = cnt; i >= 0 ; i--) { if (a & (1ll << i)) continue ; if (s >= (1ll << i)) s -= (1ll << i); if (!s) { Yes; return ; } } if (s) cout << "No" << endl; else cout << "Yes" << endl; } signed main () { ios::sync_with_stdio (false ); cin.tie (0 ); cout.tie (0 ); cin >> t; while (t--) solve (); return 0 ; }
E - Range Sums Method设a a a 的差分数组为b b b ,显然b 0 = 0 b_0=0 b 0 = 0 ,∑ 1 ≤ i ≤ n i a i = b n \sum^{i}_{1\leq i \leq n}{a_i}=b_n ∑ 1 ≤ i ≤ n i a i = b n
考虑如何检查能否由b 0 b_0 b 0 转移至b n b_n b n
维护一个并查集,当输入l i , r i l_i,r_i l i , r i 时,u n i o n ( l i − 1 , r i ) union(l_i-1,r_i) u n i o n ( l i − 1 , r i )
如果最后节点0 0 0 和n n n 的祖先相同,则输出Y e s Yes Y e s ,否则输出N o No N o
Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 #include <algorithm> #include <bitset> #include <cctype> #include <climits> #include <cmath> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <memory> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std;#define int long long #define ull unsigned long long #define ALL(a) (a).begin(), (a).end() #define pb push_back #define mk make_pair #define pii pair<int, int> #define pis pair<int, string> #define sec second #define ll long long #define fir first #define sz(a) int((a).size()) #define rep(i, x, y) for (int i = x; i <= y; i++) #define repp(i, x, y) for (int i = x; i >= y; i--) #define Yes cout << "Yes" << endl #define YES cout << "YES" << endl #define No cout << "No" << endl #define NO cout << "NO" << endl #define multitest(t) \ while (t--) \ solve(); #define r(n) cin >> n; #define double long double const int INF = 0x3f3f3f3f ;const int Mod = 1000000007 ;const int N = 2e5 + 10 ;int n, q;int l[N], r[N];int fa[N];int get (int x) { if (fa[x] == x) return x; return fa[x] = get (fa[x]); } void merge (int x, int y) { fa[get (x)] = get (y); } signed main () { ios::sync_with_stdio (false ); cin.tie (0 ); cout.tie (0 ); cin >> n >> q; for (int i = 0 ; i <= n; i++) fa[i] = i; for (int i = 1 ; i <= q; i++) { cin >> l[i] >> r[i]; merge (l[i] - 1 , r[i]); } if (get (0 ) == get (n)) Yes; else No; return 0 ; }
F - Two Exams Method按第1 1 1 场比赛的排名排序,得到序列{3,2,4,1}
设d p i , j , k dp_{i,j,k} d p i , j , k 表示考虑到第i i i 个人,已经选了j j j 个人,已选人中第2场的排名最高为第几
d p 0 , 0 , n + 1 = 1 dp_{0,0,n+1}=1 d p 0 , 0 , n + 1 = 1
转移:
d p i , j + 1 , p = ∑ d p i − 1 , j , p ( Q i < p ) dp_{i,j+1,p}=\sum{dp_{i-1,j,p}(Q_i<p)} d p i , j + 1 , p = ∑ d p i − 1 , j , p ( Q i < p )
d p i , j , m i n ( p , Q i ) dp_{i,j,min(p,Q_i)} d p i , j , m i n ( p , Q i ) +=d p i − 1 , j , p dp_{i-1,j,p} d p i − 1 , j , p
Code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 #include <algorithm> #include <bitset> #include <cctype> #include <climits> #include <cmath> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <memory> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std;#define int long long #define ull unsigned long long #define ALL(a) (a).begin(), (a).end() #define pb push_back #define mk make_pair #define pii pair<int, int> #define pis pair<int, string> #define sec second #define ll long long #define fir first #define sz(a) int((a).size()) #define rep(i, x, y) for (int i = x; i <= y; i++) #define repp(i, x, y) for (int i = x; i >= y; i--) #define Yes cout << "Yes" << endl #define YES cout << "YES" << endl #define No cout << "No" << endl; #define NO cout << "NO" << endl; #define multitest(t) \ while (t--) \ solve(); #define r(n) cin >> n; #define double long double const int INF = 0x3f3f3f3f ;const int Mod = 998244353 ;const int N = 1e5 + 10 ;int n, k;pii a[305 ]; int dp[305 ][305 ][305 ];signed main () { ios::sync_with_stdio (false ); cin.tie (0 ); cout.tie (0 ); cin >> n >> k; for (int i = 1 ; i <= n; i++) cin >> a[i].fir; for (int i = 1 ; i <= n; i++) cin >> a[i].sec; sort (a + 1 , a + n + 1 ); dp[0 ][0 ][n + 1 ] = 1 ; for (int i = 1 ; i <= n; i++) { for (int j = 0 ; j <= min (k, i); j++) { for (int p = 1 ; p <= n + 1 ; p++) { if (a[i].sec < p) { dp[i][j + 1 ][p] += dp[i - 1 ][j][p]; dp[i][j + 1 ][p] %= Mod; } dp[i][j][min (p, a[i].sec)] += dp[i - 1 ][j][p]; dp[i][j][min (p, a[i].sec)] %= Mod; } } } int ans = 0 ; for (int i = 0 ; i <= n + 1 ; i++) { ans += dp[n][k][i]; ans %= Mod; } cout << ans << endl; return 0 ; }