AtCoder Regular Contest 096

C - Half and Half

随便判判

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3  
 4 int main(){
 5     int A, B, C, X, Y, ans = 0;
 6     scanf("%d %d %d %d %d", &A, &B, &C, &X, &Y);
 7     if(C + C <= A + B) {
 8         int Z = min(X, Y);
 9         X -= Z, Y -= Z;
10         ans += 2 * C * Z;
11     }
12     if(C + C <= A) ans += 2 * C * X, X = 0;
13     if(C + C <= B) ans += 2 * C * Y, Y = 0;
14     ans += A * X + B * Y;
15     printf("%d\n", ans);
16     return 0;
17 }
Aguin

 

D - Static Sushi

讨论下下

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn = 1e5 + 10;
 5 LL x[maxn], v[maxn];
 6 multiset<LL> MS;
 7 multiset<LL> :: iterator it;
 8  
 9 int main(){
10     int N;
11     LL C;
12     scanf("%d %lld", &N, &C);
13     LL tmp = 0, tmp2 = 0, M = 0;
14     for(int i = 1; i <= N; ++i) scanf("%lld %lld", x + i, v + i);
15     for(int i = 1; i <= N; ++i){
16         tmp += v[i];
17         M = max(M, tmp - x[i]);
18         MS.insert(tmp - x[i]);
19     }
20     for(int i = N; i >= 1; --i){
21         it = MS.find(tmp - x[i]);
22         MS.erase(it);
23         if(MS.empty()) break;
24         tmp -= v[i];
25         tmp2 += v[i];
26         LL MM = *MS.rbegin();
27         M = max(M, MM + tmp2 - 2 * (C - x[i]));
28     }
29  
30     for(int i = 1; i <= N / 2; ++i) swap(x[i], x[N-i+1]), swap(v[i], v[N-i+1]);
31     for(int i = 1; i <= N; ++i) x[i] = C - x[i];
32  
33     MS.clear();
34     tmp = 0, tmp2 = 0;
35     for(int i = 1; i <= N; ++i){
36         tmp += v[i];
37         M = max(M, tmp - x[i]);
38         MS.insert(tmp - x[i]);
39     }
40     for(int i = N; i >= 1; --i){
41         it = MS.find(tmp - x[i]);
42         MS.erase(it);
43         if(MS.empty()) break;
44         tmp -= v[i];
45         tmp2 += v[i];
46         LL MM = *MS.rbegin();
47         M = max(M, MM + tmp2 - 2 * (C - x[i]));
48     }
49     printf("%lld\n", M);
50     return 0;
51 }
Aguin

 

E - Everything on It

看题解的

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL way[3003], way2[3003][3003];
 5 LL C[3003][3003], f[3003][3003];
 6  
 7 LL qpow(LL a, LL b, LL mod) {
 8     LL ret = 1LL;
 9     while (b) {
10         if (b & 1) ret = ret * a % mod;
11         a = a * a % mod;
12         b >>= 1;
13     }
14     return ret;
15 }
16  
17 LL pow_mod[3003], pow_mod_1[3003];
18 int main() {
19     LL N, mod;
20     scanf("%lld %lld", &N, &mod);
21     pow_mod[0] = pow_mod_1[0] = 1;
22     for(int i = 1; i < 3003; ++i) pow_mod[i] = pow_mod[i-1] * 2 % mod;
23     for(int i = 1; i < 3003; ++i) pow_mod_1[i] = pow_mod_1[i-1] * 2 % (mod - 1);
24  
25     for (int i = 0; i < 3003; ++i) C[i][0] = C[i][i] = 1;
26     for (int i = 2; i < 3003; ++i)
27         for (int j = 1; j < i; ++j)
28             C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
29  
30     f[0][0] = f[1][0] = f[1][1] = 1;
31     for (int i = 2; i <= N; ++i) {
32         f[i][0] = 1;
33         for (int j = 1; j <= N; ++j) {
34             f[i][j] = (f[i - 1][j] + f[i - 1][j] * j + f[i - 1][j - 1]) % mod;
35         }
36     }
37  
38     for (int i = 0; i <= N; ++i) {
39         for (int j = 0; j <= i; ++j) {
40             way2[i][j] = f[i][j] * qpow(pow_mod[N - i], j, mod) % mod * qpow(2, pow_mod_1[N - i], mod) % mod;
41             way[i] = (way[i] + way2[i][j]) % mod;
42         }
43     }
44  
45     LL ans = 0;
46     for(int i = 0; i <= N; ++i){
47         if(i % 2 == 0) ans = (ans + C[N][i] * way[i]) % mod;
48         else ans = (ans - C[N][i] * way[i] % mod + mod) % mod;
49     }
50     printf("%lld\n", ans);
51     return 0;
52 }
Aguin

 

F - Sweet Alchemy

posted @ 2018-04-22 20:12  Aguin  阅读(164)  评论(0编辑  收藏  举报