任重而道远
Solution:
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5, Mod = 1e9 + 7;
ll n, a, b, sww;
ll l[N], t[N], fac[N << 1], vfac[N << 1];
ll read () {
ll x = 0, f = 0; char c = getchar ();
while (!isdigit (c)) f |= (c == '-'), c = getchar ();
while (isdigit (c)) x = x * 10 + c - '0', c = getchar ();
return f ? -x : x;
}
ll mpow (ll a, ll b) {
ll rt = 1;
for (; b; b >>= 1, a = a * a % Mod)
if (b & 1) rt = rt * a % Mod;
return rt;
}
void init () {
fac[0] = 1, vfac[0] = mpow (fac[0], Mod - 2);
for (int i = 1; i <= 2 * N; i++) {
fac[i] = fac[i - 1] * i % Mod;
vfac[i] = mpow (fac[i], Mod - 2);
}
}
ll C (ll n, ll m) {
if (m > n) return 0;
if (m == 0 || m == n) return 1;
return fac[n] * vfac[m] % Mod * vfac[n - m] % Mod;
}
int main () {
freopen ("matrix.in", "r", stdin);
freopen ("matrix.out", "w", stdout);
init ();
n = read (), b = read (), a = read ();
for (int i = 1; i <= n; i++) l[i] = read ();
for (int i = 1; i <= n; i++) t[i] = read ();
for (int i = 2; i <= n; i++) {
ll tot = n - i + n - 2;
sww = (sww + b * l[i] % Mod * C (tot, n - 2) % Mod * mpow (a, n - i) % Mod * mpow (b, n - 2) % Mod) % Mod;
sww = (sww + a * t[i] % Mod * C (tot, n - 2) % Mod * mpow (a, n - 2) % Mod * mpow (b, n - i) % Mod) % Mod;
}
printf ("%lld\n", sww);
return 0;
}
Solution:
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
const int N = 55;
int n, p, q, sww, tot;
int a[N], dp[N][2005], sum[N];
int read () {
int x = 0, f = 0; char c = getchar ();
while (!isdigit (c)) f |= (c == '-'), c = getchar ();
while (isdigit (c)) x = x * 10 + c - '0', c = getchar ();
return f ? -x : x;
}
bool check (int x) {
dp[0][0] = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j <= sum[i] / (p + q); j++)
for (int k = 0; k <= a[i + 1] / p; k++) {
int m = std :: min ((a[i + 1] - k * p) / q, x - k);
dp[i + 1][j + k] = std :: max (dp[i][j] + m, dp[i + 1][j + k]);
}
return dp[n][x] >= x;
}
int main () {
freopen ("pq.in", "r", stdin);
freopen ("pq.out", "w", stdout);
n = read ();
for (int i = 1; i <= n; i++) a[i] = read (), sum[i] = sum[i - 1] + a[i];
p = read (), q = read ();
if (p < q) std :: swap (p, q);
for (int all = sum[n] / (p + q); all >= 0; all--)
if (check (all)) {sww = all; break;}
printf ("%d\n", sww * (p + q));
return 0;
}
Solution:
AC代码:
#include<bits/stdc++.h>
using namespace std;
struct Node {int v, nex, w;} Edge[200005];
int h[30005], vis[30005], dis[30005], w[30005], t[30005], S[30005], T[30005], tov[30006];
int n, m, nums, numt, stot = 1, tot;
void add(int u, int v, int w) {
Edge[++stot] = (Node) {v, h[u], w}, h[u] = stot;
}
void Spfa1() {
queue < int > q;
memset(vis, 0, sizeof(vis));
memset(dis, 0x3f3f3f3f, sizeof(dis));
for(int i = 1; i <= nums; i ++) q.push(S[i]), vis[S[i]] = 1, dis[S[i]] = min(dis[S[i]], w[S[i]]);
while(!q.empty()) {
int u = q.front(); q.pop(); vis[u] = 0;
for(int i = h[u]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(dis[v] > dis[u] + Edge[i].w && v != 1) {
dis[v] = dis[u] + Edge[i].w;
if(!vis[v]) {
vis[v] = 1; q.push(v);
}
}
}
}
}
void Spfa2() {
queue < int > q;
memset(vis, 0, sizeof(vis));
memset(dis, 0x3f3f3f3f, sizeof(dis));
for(int i = 1; i <= numt; i ++) q.push(T[i]), vis[T[i]] = 1, dis[T[i]] = min(dis[T[i]], w[T[i]]);
while(!q.empty()) {
int u = q.front(); q.pop(); vis[u] = 0;
for(int i = h[u]; i; i = Edge[i].nex) {
int v = Edge[i].v;
if(dis[v] > dis[u] + Edge[i].w && v != 1) {
dis[v] = dis[u] + Edge[i].w;
if(!vis[v]) {
vis[v] = 1; q.push(v);
}
}
}
}
}
int main() {
freopen("graph.in", "r", stdin);
freopen("graph.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i ++) {
int u, v, a, b;
scanf("%d%d%d%d", &u, &v, &a, &b);
add(u, v, a); add(v, u, b);
}
int ans = 0x3f3f3f3f;
memset(w, 0x3f3f3f3f, sizeof(w));
memset(t, 0x3f3f3f3f, sizeof(t));
for(int i = h[1]; i; i = Edge[i].nex)
tov[++tot] = Edge[i].v, w[Edge[i].v] = min(w[Edge[i].v], Edge[i].w), t[Edge[i].v] = min(t[Edge[i].v], Edge[i ^ 1].w);
sort(tov + 1, tov + 1 + tot);
int M = tov[tot], tt = 0;
while(M) {
int tmp = (M & 1);
nums = 0, numt = 0;
for(int i = 1; i <= tot; i ++)
if(((tov[i] >> tt) & 1) == tmp) S[++nums] = tov[i];
else T[++numt] = tov[i];
Spfa1();
for(int j = 1; j <= numt; j ++) {
ans = min(ans, t[T[j]] + dis[T[j]]);
}
Spfa2();
for(int j = 1; j <= nums; j ++) {
ans = min(ans, t[S[j]] + dis[S[j]]);
}
M >>= 1, tt ++;
}
printf("%d", ans);
return 0;
}