随便判判

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 ", ans); 16 return 0; 17 }
讨论下下

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 ", M); 50 return 0; 51 }
看题解的

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 ", ans); 51 return 0; 52 }