From 57d610fa2b2f9d93bb43dacd23df0aacd4960155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E5=AE=87=E8=BE=B0?= Date: Tue, 20 Dec 2016 09:50:28 +0800 Subject: [PATCH] bzoj 1007 1486 1491 --- OnlineJudges/lydsy/1007.cpp | 30 ++++++++++++++++++++++ OnlineJudges/lydsy/1486.cpp | 50 +++++++++++++++++++++++++++++++++++++ OnlineJudges/lydsy/1491.cpp | 31 +++++++++++++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 OnlineJudges/lydsy/1007.cpp create mode 100644 OnlineJudges/lydsy/1486.cpp create mode 100644 OnlineJudges/lydsy/1491.cpp diff --git a/OnlineJudges/lydsy/1007.cpp b/OnlineJudges/lydsy/1007.cpp new file mode 100644 index 0000000..514054f --- /dev/null +++ b/OnlineJudges/lydsy/1007.cpp @@ -0,0 +1,30 @@ +#include +#include +struct line +{ + int k, b, id; + bool operator<(const line &rhs) const { return (k < rhs.k) || (k == rhs.k && b > rhs.b); } +}a[50010]; +int n; +int stk[50010], top; +bool ans[50010]; +bool check(int x, int y, int z) +{ + return 1ll * (a[y].k - a[z].k) * (a[y].b - a[x].b) >= 1ll * (a[z].b - a[y].b) * (a[x].k - a[y].k); +} +int main() +{ + scanf("%d", &n); + for (int i = 0; i < n; i++) scanf("%d%d", &a[i].k, &a[i].b), a[i].id = i + 1; + std::sort(a, a + n); + stk[top++] = 0; + for (int i = 1; i < n; i++) + { + if (a[i].k == a[stk[top - 1]].k) continue; + while (top > 1 && check(stk[top - 2], stk[top - 1], i)) top--; + stk[top++] = i; + } + while (top) ans[a[stk[--top]].id] = true; + for (int i = 0; i <= n; i++) if (ans[i]) printf("%d ", i); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/1486.cpp b/OnlineJudges/lydsy/1486.cpp new file mode 100644 index 0000000..2d6f8f8 --- /dev/null +++ b/OnlineJudges/lydsy/1486.cpp @@ -0,0 +1,50 @@ +#include +#include +const double eps = 1e-9; +template T max(T a, T b) { return a > b ? a : b; } +template T min(T a, T b) { return a < b ? a : b; } +int head[3010], next[10010], to[10010], ecnt, n, m, flag, flags[3010]; +double a[10010], len[10010], dis[3010]; +inline void addEdge(int x, int y) +{ + ecnt++; + next[ecnt] = head[x]; + head[x] = ecnt; + to[ecnt] = y; +} +bool dfs(int x) +{ + if (flags[x] == flag) return true; + flags[x] = flag; + for (int cur = head[x]; cur; cur = next[cur]) + if (dis[to[cur]] > dis[x] + len[cur]) + { + dis[to[cur]] = dis[x] + len[cur]; + if (dfs(to[cur])) return true; + } + flags[x] = 0; + return false; +} +bool check(double x) +{ + for (int i = 1; i <= m; i++) len[i] = a[i] - x; + for (int i = 1; i <= n; i++) + { + flag++; + memset(dis, 0, sizeof(dis)); + if (dfs(i)) return true; + } + return false; +} +int main() +{ + scanf("%d%d", &n, &m); + for (int i = 1, x, y; i <= m; i++) + scanf("%d%d%lf", &x, &y, a + i), addEdge(x, y); + double l = 1e304, r = -1e304, mid; + for (int i = 1; i <= m; i++) + l = min(l, a[i]), r = max(r, a[i]); + while (r - l > eps) (check(mid = (l + r) / 2) ? r : l) = mid; + printf("%.8lf", (l + r) / 2); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/1491.cpp b/OnlineJudges/lydsy/1491.cpp new file mode 100644 index 0000000..a42c409 --- /dev/null +++ b/OnlineJudges/lydsy/1491.cpp @@ -0,0 +1,31 @@ +#include +#include +int G[101][101], n, m; +long long a[101][101]; +double ans[101]; +int main() +{ + memset(G, 0x3f3f3f3f, sizeof(G)); + scanf("%d%d", &n, &m); + for (int i = 0, x, y, z; i < m; i++) + { + scanf("%d%d%d", &x, &y, &z); + G[x][y] = G[y][x] = z; + a[x][y] = a[y][x] = 1; + } + for (int k = 1; k <= n; k++) + for (int i = 1; i <= n; i++) + for (int j = 1; j <= n; j++) + { + if (G[i][j] > G[i][k] + G[k][j]) G[i][j] = G[i][k] + G[k][j], a[i][j] = 0; + if (G[i][j] == G[i][k] + G[k][j]) a[i][j] += a[i][k] * a[k][j]; + } + for (int i = 1; i <= n; i++) a[i][i] = 0; + for (int k = 1; k <= n; k++) + for (int i = 1; i <= n; i++) + for (int j = 1; j <= n; j++) + if (G[i][j] == G[i][k] + G[k][j] && a[i][j] > 0) + ans[k] += 1.0 * a[i][k] * a[k][j] / a[i][j]; + for (int i = 1; i <= n; i++) printf("%.3lf\n", ans[i]); + return 0; +} \ No newline at end of file