From 176c835c9e0d70d7c6f05964155724588e0304b2 Mon Sep 17 00:00:00 2001 From: TooYoungTooSimp <6648049+TooYoungTooSimp@users.noreply.github.com> Date: Mon, 19 Dec 2016 19:37:34 +0800 Subject: [PATCH] =?UTF-8?q?bzoj=201196=201821=204152=20=EF=BC=88=E7=8B=97?= =?UTF-8?q?=E6=97=A5=E7=9A=84=E6=95=B0=E7=BB=84=E8=B6=8A=E7=95=8C=E6=88=91?= =?UTF-8?q?=E8=B0=83=E4=BA=86=E4=B8=80=E4=B8=AA=E5=B0=8F=E6=97=B6=E6=89=8D?= =?UTF-8?q?=E5=8F=91=E7=8E=B0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OnlineJudges/lydsy/1196.cpp | 26 ++++++++++++++++ OnlineJudges/lydsy/1821.cpp | 35 +++++++++++++++++++++ OnlineJudges/lydsy/4152.cpp | 62 +++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 OnlineJudges/lydsy/1196.cpp create mode 100644 OnlineJudges/lydsy/1821.cpp create mode 100644 OnlineJudges/lydsy/4152.cpp diff --git a/OnlineJudges/lydsy/1196.cpp b/OnlineJudges/lydsy/1196.cpp new file mode 100644 index 0000000..18c913f --- /dev/null +++ b/OnlineJudges/lydsy/1196.cpp @@ -0,0 +1,26 @@ +#include +#include +int fa[10010], X[20010], Y[20010], C1[20010], C2[20010], n, k, m; +int Find(int x) { return fa[x] == -1 ? x : fa[x] = Find(fa[x]); } +bool check(int x) +{ + memset(fa, -1, sizeof(fa)); + int cnt1 = 0, cnt2 = 0; + for (int i = 1, fx, fy; i < m; i++) + if ((C1[i] <= x) && ((fx = Find(X[i])) != (fy = Find(Y[i])))) + cnt1++, fa[fx] = fy; + for (int i = 1, fx, fy; i < m; i++) + if ((C2[i] <= x) && ((fx = Find(X[i])) != (fy = Find(Y[i])))) + cnt2++, fa[fx] = fy; + return cnt1 >= k && cnt1 + cnt2 == n - 1; +} +int main() +{ + scanf("%d%d%d", &n, &k, &m); + for (int i = 1; i < m; i++) + scanf("%d%d%d%d", X + i, Y + i, C1 + i, C2 + i); + int l = 0, r = 0x3f3f3f3f, mid; + while (l < r) check(mid = (l + r) >> 1) ? r = mid : l = mid + 1; + printf("%d", l); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/1821.cpp b/OnlineJudges/lydsy/1821.cpp new file mode 100644 index 0000000..66f2313 --- /dev/null +++ b/OnlineJudges/lydsy/1821.cpp @@ -0,0 +1,35 @@ +#include +#include +#include +#include +using namespace std; +int n, k, fa[1010], X[1010], Y[1010], cnt, ecnt; +double ans; +int Find(int x) { return fa[x] == -1 ? x : fa[x] = Find(fa[x]); } +struct edge +{ + int u, v; + double l; + bool operator<(const edge &rhs) const { return l < rhs.l; } +}edges[1000010]; +int main() +{ + memset(fa, -1, sizeof(fa)); + scanf("%d%d", &n, &k); + for (int i = 1; i <= n; i++) scanf("%d%d", X + i, Y + i); + for (int i = 1; i <= n; i++) + for (int j = 1; j < i; j++, ecnt++) + edges[ecnt].u = i, edges[ecnt].v = j, + edges[ecnt].l = sqrt((X[i] - X[j]) * (X[i] - X[j]) + + (Y[i] - Y[j]) * (Y[i] - Y[j])); + sort(edges, edges + ecnt); + for (int i = 0, fx, fy; i < ecnt; i++) + if ((fx = Find(edges[i].u)) != (fy = Find(edges[i].v))) + { + fa[fx] = fy; + cnt++, ans = edges[i].l; + if (cnt - 1 == n - k) break; + } + printf("%.2lf", ans); + return 0; +} \ No newline at end of file diff --git a/OnlineJudges/lydsy/4152.cpp b/OnlineJudges/lydsy/4152.cpp new file mode 100644 index 0000000..3e16778 --- /dev/null +++ b/OnlineJudges/lydsy/4152.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +using namespace std; +const int maxn = 200010; +inline void readInt(int &x) +{ + int ch = x = 0; + while (!isdigit(ch = getchar())); + for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0'; +} +int head[maxn], to[maxn << 2], nxt[maxn << 2], len[maxn << 2], ecnt, n; +inline void addEdge(int f, int t, int l) +{ + ecnt++; + nxt[ecnt] = head[f]; + head[f] = ecnt; + to[ecnt] = t; + len[ecnt] = l; +} +struct P { int id, x, y; } ps[maxn]; +bool cmpx(const P &lhs, const P &rhs) { return lhs.x < rhs.x; } +bool cmpy(const P &lhs, const P &rhs) { return lhs.y < rhs.y; } +int pathlen[maxn]; +struct heapnode +{ + int id, dis; + heapnode(int x, int y) :id(x), dis(y) {} + bool operator<(const heapnode &rhs) const { return dis > rhs.dis; } +}; +int main() +{ + readInt(n); + for (int i = 0; i < n; i++) ps[i].id = i + 1, readInt(ps[i].x), readInt(ps[i].y); + sort(ps, ps + n, cmpx); + for (int i = 0; i < n - 1; i++) + addEdge(ps[i].id, ps[i + 1].id, ps[i + 1].x - ps[i].x), + addEdge(ps[i + 1].id, ps[i].id, ps[i + 1].x - ps[i].x); + sort(ps, ps + n, cmpy); + for (int i = 0; i < n - 1; i++) + addEdge(ps[i].id, ps[i + 1].id, ps[i + 1].y - ps[i].y), + addEdge(ps[i + 1].id, ps[i].id, ps[i + 1].y - ps[i].y); + memset(pathlen, 0x3f3f3f3f, sizeof(pathlen)); + pathlen[1] = 0; + priority_queue Q; + Q.push(heapnode(1, 0)); + while (!Q.empty()) + { + heapnode x = Q.top(); Q.pop(); + if (x.dis > pathlen[x.id]) continue; + for (int cur = head[x.id]; cur; cur = nxt[cur]) + if (pathlen[to[cur]] > pathlen[x.id] + len[cur]) + { + pathlen[to[cur]] = pathlen[x.id] + len[cur]; + Q.push(heapnode(to[cur], pathlen[to[cur]])); + } + } + printf("%d", pathlen[n]); + return 0; +} \ No newline at end of file