codeforces #593 div2 ABCD 题解

A. Stones

Description

给出3堆物品,个数分别为a,b,c

有两种取数方式,a1b2,b1c2,问最多取多少物品

Solution

$O(n^2)暴力$

 1 #include <algorithm>
 2 #include <cctype>
 3 #include <cmath>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <iostream>
 8 #include <map>
 9 #include <queue>
10 #include <set>
11 #include <stack>
12 #if __cplusplus >= 201103L
13 #include <unordered_map>
14 #include <unordered_set>
15 #endif
16 #include <vector>
17 #define lson rt << 1, l, mid
18 #define rson rt << 1 | 1, mid + 1, r
19 #define LONG_LONG_MAX 9223372036854775807LL
20 #define ll LL
21 using namespace std;
22 typedef long long ll;
23 typedef long double ld;
24 typedef unsigned long long ull;
25 typedef pair<int, int> P;
26 int n, m, k;
27 const int maxn = 1e5 + 10;
28 template <class T>
29 inline T read()
30 {
31     int f = 1;
32     T ret = 0;
33     char ch = getchar();
34     while (!isdigit(ch))
35     {
36         if (ch == '-')
37             f = -1;
38         ch = getchar();
39     }
40     while (isdigit(ch))
41     {
42         ret = (ret << 1) + (ret << 3) + ch - '0';
43         ch = getchar();
44     }
45     ret *= f;
46     return ret;
47 }
48 template <class T>
49 inline void write(T n)
50 {
51     if (n < 0)
52     {
53         putchar('-');
54         n = -n;
55     }
56     if (n >= 10)
57     {
58         write(n / 10);
59     }
60     putchar(n % 10 + '0');
61 }
62 template <class T>
63 inline void writeln(const T &n)
64 {
65     write(n);
66     puts("");
67 }
68 int main(int argc, char const *argv[])
69 {
70 #ifndef ONLINE_JUDGE
71     freopen("in.txt", "r", stdin);
72     freopen("out.txt", "w", stdout);
73 #endif
74     int t = read<int>();
75     while (t--)
76     {
77         int a = read<int>(), b = read<int>(), c = read<int>();
78         int res = 0;
79         for (int t1 = 0; t1 <= 100; t1++)
80             for (int t2 = 0; t2 <= 100; t2++)
81                 if (t1 <= a && 2 * t1 + t2 <= b && 2 * t2 <= c)
82                     res = max(res, 3 * (t1 + t2));
83         writeln(res);
84     }
85     return 0;
86 }
View Code

 

B. Alice and the List of Presents

Description

给出n种无穷多的球,m个有差别的盒子,要求每种球至少取一个放在某个盒子里的方案数。

 

 

Solution

人肉打表找规律

 

 

$res={(2^m-1)}^n$

快速幂取模

 1 #include <algorithm>
 2 #include <cctype>
 3 #include <cmath>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <iostream>
 8 #include <map>
 9 #include <queue>
10 #include <set>
11 #include <stack>
12 #if __cplusplus >= 201103L
13 #include <unordered_map>
14 #include <unordered_set>
15 #endif
16 #include <vector>
17 #define lson rt << 1, l, mid
18 #define rson rt << 1 | 1, mid + 1, r
19 #define LONG_LONG_MAX 9223372036854775807LL
20 #define ll LL
21 using namespace std;
22 typedef long long ll;
23 typedef long double ld;
24 typedef unsigned long long ull;
25 typedef pair<int, int> P;
26 int n, m, k;
27 const int maxn = 1e5 + 10;
28 const int mod = 1e9 + 7;
29 template <class T>
30 inline T read()
31 {
32     int f = 1;
33     T ret = 0;
34     char ch = getchar();
35     while (!isdigit(ch))
36     {
37         if (ch == '-')
38             f = -1;
39         ch = getchar();
40     }
41     while (isdigit(ch))
42     {
43         ret = (ret << 1) + (ret << 3) + ch - '0';
44         ch = getchar();
45     }
46     ret *= f;
47     return ret;
48 }
49 template <class T>
50 inline void write(T n)
51 {
52     if (n < 0)
53     {
54         putchar('-');
55         n = -n;
56     }
57     if (n >= 10)
58     {
59         write(n / 10);
60     }
61     putchar(n % 10 + '0');
62 }
63 template <class T>
64 inline void writeln(const T &n)
65 {
66     write(n);
67     puts("");
68 }
69 ll qpow(ll a, int b)
70 {
71     ll res = 1;
72     while (b)
73     {
74         if (b & 1)
75             res = res * a % mod;
76         a = a * a % mod;
77         b >>= 1;
78     }
79     return res;
80 }
81 int main(int argc, char const *argv[])
82 {
83 #ifndef ONLINE_JUDGE
84     freopen("in.txt", "r", stdin);
85     freopen("out.txt", "w", stdout);
86 #endif
87     n = read<int>(), m = read<int>();
88     writeln(qpow(qpow(2, m) - 1, n));
89     return 0;
90 }
View Code

 

C. Labs

Description

 

 

Solution

将$n^2$个元素按大小分为n组,大小大小...组合

不知道咋证明

 

  1 #include <algorithm>
  2 #include <cctype>
  3 #include <cmath>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <iostream>
  8 #include <map>
  9 #include <queue>
 10 #include <set>
 11 #include <stack>
 12 #if __cplusplus >= 201103L
 13 #include <unordered_map>
 14 #include <unordered_set>
 15 #endif
 16 #include <vector>
 17 #define lson rt << 1, l, mid
 18 #define rson rt << 1 | 1, mid + 1, r
 19 #define LONG_LONG_MAX 9223372036854775807LL
 20 #define ll LL
 21 using namespace std;
 22 typedef long long ll;
 23 typedef long double ld;
 24 typedef unsigned long long ull;
 25 typedef pair<int, int> P;
 26 int n, m, k;
 27 const int maxn = 1e5 + 10;
 28 template <class T>
 29 inline T read()
 30 {
 31     int f = 1;
 32     T ret = 0;
 33     char ch = getchar();
 34     while (!isdigit(ch))
 35     {
 36         if (ch == '-')
 37             f = -1;
 38         ch = getchar();
 39     }
 40     while (isdigit(ch))
 41     {
 42         ret = (ret << 1) + (ret << 3) + ch - '0';
 43         ch = getchar();
 44     }
 45     ret *= f;
 46     return ret;
 47 }
 48 template <class T>
 49 inline void write(T n)
 50 {
 51     if (n < 0)
 52     {
 53         putchar('-');
 54         n = -n;
 55     }
 56     if (n >= 10)
 57     {
 58         write(n / 10);
 59     }
 60     putchar(n % 10 + '0');
 61 }
 62 template <class T>
 63 inline void writeln(const T &n)
 64 {
 65     write(n);
 66     puts("");
 67 }
 68 int a[maxn];
 69 set<int> s[305];
 70 int main(int argc, char const *argv[])
 71 {
 72 #ifndef ONLINE_JUDGE
 73     freopen("in.txt", "r", stdin);
 74     freopen("out.txt", "w", stdout);
 75 #endif
 76     n = read<int>();
 77     for (int i = 1; i <= n; i++)
 78         for (int j = 1; j <= n; j++)
 79             s[i].emplace((i - 1) * n + j);
 80     for (int i = 1; i <= n; i++)
 81     {
 82         for (int j = 1; j <= n; j++)
 83         {
 84             if (!(j & 1))
 85             {
 86                 write(*s[j].begin());
 87                 putchar(' ');
 88                 s[j].erase(s[j].begin());
 89             }
 90             else
 91             {
 92                 write(*s[j].rbegin());
 93                 putchar(' ');
 94                 s[j].erase(*s[j].rbegin());
 95             }
 96         }
 97         puts("");
 98     }
 99     return 0;
100 }
View Code

 

D. Alice and the Doll

Description

 

 

Solution

赛后补题,模拟题意。

每次直走到不能走为止,然后右转继续,蛇形走位。

记录四个边界,最上一行,最下一行,最左一列,最右一列。每次更新坐标需要在边界以内。

注意开始可以直接右转往下走。

 

  1 /*
  2     蛇形走位
  3 */
  4 #include <algorithm>
  5 #include <cctype>
  6 #include <cmath>
  7 #include <cstdio>
  8 #include <cstdlib>
  9 #include <cstring>
 10 #include <iostream>
 11 #include <map>
 12 #include <queue>
 13 #include <set>
 14 #include <stack>
 15 #if __cplusplus >= 201103L
 16 #include <unordered_map>
 17 #include <unordered_set>
 18 #endif
 19 #include <vector>
 20 #define lson rt << 1, l, mid
 21 #define rson rt << 1 | 1, mid + 1, r
 22 #define LONG_LONG_MAX 9223372036854775807LL
 23 #define ll LL
 24 using namespace std;
 25 typedef long long ll;
 26 typedef long double ld;
 27 typedef unsigned long long ull;
 28 typedef pair<int, int> P;
 29 int n, m, k;
 30 const int maxn = 1e5 + 10;
 31 template <class T>
 32 inline T read()
 33 {
 34     int f = 1;
 35     T ret = 0;
 36     char ch = getchar();
 37     while (!isdigit(ch))
 38     {
 39         if (ch == '-')
 40             f = -1;
 41         ch = getchar();
 42     }
 43     while (isdigit(ch))
 44     {
 45         ret = (ret << 1) + (ret << 3) + ch - '0';
 46         ch = getchar();
 47     }
 48     ret *= f;
 49     return ret;
 50 }
 51 template <class T>
 52 inline void write(T n)
 53 {
 54     if (n < 0)
 55     {
 56         putchar('-');
 57         n = -n;
 58     }
 59     if (n >= 10)
 60     {
 61         write(n / 10);
 62     }
 63     putchar(n % 10 + '0');
 64 }
 65 template <class T>
 66 inline void writeln(const T &n)
 67 {
 68     write(n);
 69     puts("");
 70 }
 71 set<int> xi[maxn], yi[maxn], xd[maxn], yd[maxn];
 72 int x, y;
 73 int l, r, u, d, dic;
 74 void init()
 75 {
 76     x = y = 1;
 77     dic = 0;
 78     l = u = 0;
 79     r = m + 1, d = n + 1;
 80 }
 81 ll solve()
 82 {
 83     ll cnt = 1;
 84     while (1)
 85     {
 86         if (dic == 0)
 87         {
 88             int cur = *xi[x].upper_bound(y);
 89             cur = min(cur, r);
 90             if (cur - y == 1)
 91                 return cnt;
 92             cnt += cur - y - 1;
 93             y = cur - 1;
 94             u = max(x, u); //右是由上转移而来,更新上边界
 95         }
 96         else if (dic == 1)
 97         {
 98             int cur = *yi[y].upper_bound(x);
 99             cur = min(cur, d);
100             if (cur - x == 1)
101                 return cnt;
102             cnt += cur - x - 1;
103             x = cur - 1;
104             r = min(r, y); //下是由右转移而来,更新右边界
105         }
106         else if (dic == 2)
107         {
108             int cur = -*xd[x].upper_bound(-y);
109             cur = max(cur, l);
110             if (y - cur == 1)
111                 return cnt;
112             cnt += y - cur - 1;
113             y = cur + 1;
114             d = min(d, x);
115         }
116         else if (dic == 3)
117         {
118             int cur = -*yd[y].upper_bound(-x);
119             cur = max(cur, u);
120             if (x - cur == 1)
121                 return cnt;
122             cnt += x - cur - 1;
123             x = cur + 1;
124             l = max(l, y);
125         }
126         dic++;
127         if (dic == 4)
128             dic = 0;
129     }
130     return cnt;
131 }
132 int main(int argc, char const *argv[])
133 {
134 #ifndef ONLINE_JUDGE
135     freopen("in.txt", "r", stdin);
136     // freopen("out.txt", "w", stdout);
137 #endif
138     n = read<int>(), m = read<int>();
139     k = read<int>();
140     for (int i = 1; i <= n; i++)
141         xi[i].emplace(0), xi[i].emplace(m + 1), xd[i].emplace(0), xd[i].emplace(-m - 1);
142     for (int i = 1; i <= m; i++)
143         yi[i].emplace(0), yi[i].emplace(n + 1), yi[i].emplace(0), yi[i].emplace(-n - 1);
144     for (int i = 0; i < k; i++)
145     {
146         int a = read<int>(), b = read<int>();
147         xi[a].emplace(b);
148         yi[b].emplace(a);
149         xd[a].emplace(-b);
150         yd[b].emplace(-a);
151     }
152     init();
153     ll cur = solve();
154     if (cur == 1LL * n * m - k)
155         puts("Yes");
156     else
157     {
158         init();
159         dic = 1;
160         cur = solve();
161         if (cur == 1LL * n * m - k)
162             puts("Yes");
163         else
164             puts("No");
165     }
166     return 0;
167 }
View Code

 

posted @ 2019-10-22 21:34  mool  阅读(147)  评论(0编辑  收藏  举报