当前位置: 首页 > wzjs >正文

域名服务dns的主要功能是网站排名优化制作

域名服务dns的主要功能是,网站排名优化制作,怎么在住房公积金网站做减员操作,wordpress怎么更改后台路径目录 题目算法标签: 树上倍增, l c a lca lca, 前缀和, 树上差分, 二分思路代码* v e c t o r vector vector存邻接表会超时 题目 521. 运输计划 算法标签: 树上倍增, l c a lca lca, 前缀和, 树上差分, 二分 思路 注意到答案是具有二分性质的, 对于某个时间 m i d mid …

题目

521. 运输计划
在这里插入图片描述

算法标签: 树上倍增, l c a lca lca, 前缀和, 树上差分, 二分

思路

注意到答案是具有二分性质的, 对于某个时间 m i d mid mid假设是最优答案, 小于该时间是不可以的, 但是大于该时间是可行的, 因此可以二分答案

这样就将问题转化为, 对于给定的时间 m i d mid mid, 将树中的一条边权变为 0 0 0, 所有的运输路线耗时是否 ≤ m i d \le mid mid
可以将所有运输的路线分为两类, 一种是运输时间 ≤ m i d \le mid mid的, 这种路线不要需要删除边
但是还有一种路线是 > m i d > mid >mid, 对于这些路线需要找个这些路线的公共边, 将这个公共边的权值变为 0 0 0, 但是直接枚举所有的边和路线会超时, 因此需要进行优化

可以在所有路线上的边 + 1 + 1 +1, 最终结果就是公共边被加了 t t t次, t t t是大于 m i d mid mid的路线的数量, 这样就找到了这个边, 利用树上差分, 实现对每个边 + 1 +1 +1的操作

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;const int N = 300010, M = N << 1, K = 19;int n, m;
int head[N], ed[M], ne[M], w[M], idx;
int fa[N][K], depth[N], d[N];
struct Path {int u, v, p, d;
} path[N];
int s[N];void add(int u, int v, int val) {ed[idx] = v, ne[idx] = head[u], w[idx] = val, head[u] = idx++;
}void dfs(int u, int pre, int dep) {depth[u] = dep;for (int i = head[u]; ~i; i = ne[i]) {int v = ed[i];if (v == pre) continue;fa[v][0] = u;for (int k = 1; k < K; ++k) fa[v][k] = fa[fa[v][k - 1]][k - 1];d[v] = d[u] + w[i];dfs(v, u, dep + 1);}
}int lca(int u, int v) {if (depth[u] < depth[v]) swap(u, v);for (int k = K - 1; k >= 0; --k) {if (depth[fa[u][k]] >= depth[v]) {u = fa[u][k];}}if (u == v) return v;for (int k = K - 1; k >= 0; --k) {if (fa[u][k] != fa[v][k]) {u = fa[u][k];v = fa[v][k];}}return fa[u][0];
}void dfs_sum(int u, int pre) {for (int i = head[u]; ~i; i = ne[i]) {int v = ed[i];if (v == pre) continue;dfs_sum(v, u);s[u] += s[v];}
}bool check(int mid) {memset(s, 0, sizeof s);int c = 0, max_d = 0;for (int i = 0; i < m; ++i) {auto [u, v, p, val] = path[i];if (val > mid) {c++;max_d = max(max_d, val);s[u]++;s[v]++;s[p] -= 2;}}if (c == 0) return true;dfs_sum(1, -1);for (int u = 2; u <= n; ++u) {if (s[u] == c && max_d - (d[u] - d[fa[u][0]]) <= mid) {return true;}}return false;
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);memset(head, -1, sizeof head);cin >> n >> m;for (int i = 0; i < n - 1; ++i) {int u, v, w;cin >> u >> v >> w;add(u, v, w), add(v, u, w);}dfs(1, -1, 1);for (int i = 0; i < m; ++i) {int u, v;cin >> u >> v;int p = lca(u, v);int dis = d[u] + d[v] - 2 * d[p];path[i] = {u, v, p, dis};}int l = 0, r = 3e8;while (l < r) {int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}cout << l << "\n";return 0;
}

* v e c t o r vector vector存邻接表会超时

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;typedef pair<int, int> PII;
const int N = 300010, M = N << 1, K = 19;int n, m;
vector<PII> head[N];
int fa[N][K], depth[N], d[N];
struct Path {int u, v, p, d;
};
vector<Path> path;
int s[M];void init() {path.resize(m + 1);
}void add(int u, int v, int w) {head[u].push_back({v, w});
}void dfs(int u, int pre, int dep) {depth[u] = dep;for (auto [v, w] : head[u]) {if (v == pre) continue;fa[v][0] = u;for (int k = 1; k < K; ++k) fa[v][k] = fa[fa[v][k - 1]][k - 1];d[v] = d[u] + w;dfs(v, u, dep + 1);}
}int lca(int u, int v) {if (depth[u] < depth[v]) swap(u, v);for (int k = K - 1; k >= 0; --k) {if (depth[fa[u][k]] >= depth[v]) {u = fa[u][k];}}if (u == v) return u;for (int k = K - 1; k >= 0; --k) {if (fa[u][k] != fa[v][k]) {u = fa[u][k];v = fa[v][k];}}return fa[u][0];
}void dfs_sum(int u, int fa) {for (auto [v, w] : head[u]) {if (v == fa) continue;dfs_sum(v, u);s[u] += s[v];}
}bool check(int mid) {memset(s, 0, sizeof s);int cnt = 0, max_d = 0;for (auto [u, v, p, dis] : path) {if (dis > mid) {cnt++;s[u]++;s[v]++;s[p] -= 2;max_d = max(max_d, dis);}}if (cnt == 0) return true;dfs_sum(1, -1);for (int u = 2; u <= n; ++u) {if (s[u] == cnt && max_d - (d[u] - d[fa[u][0]]) <= mid) return true;}return false;
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m;init();for (int i = 0; i < n - 1; ++i) {int u, v, w;cin >> u >> v >> w;add(u, v, w), add(v, u, w);}dfs(1, -1, 1);for (int i = 0; i < m; ++i) {int u, v;cin >> u >> v;int p = lca(u, v);path[i] = {u, v, p, d[u] + d[v] - 2 * d[p]};}int l = 0, r = 3e8;while (l < r) {int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}cout << l << "\n";return 0;
}
http://www.dtcms.com/wzjs/458372.html

相关文章:

  • 偃师建设局网站百度广告推广
  • 湛江h5建站正规网站建设公司
  • 网站改版多久恢复科学新概念外链平台
  • wordpress如何关闭主题搜索引擎优化seo公司
  • 做网站是要写代码的吗品牌整合推广
  • 多语言 网站灰色行业怎么推广引流
  • h5网站做微信小程序快速学电脑培训班
  • 淄博网站建设电话优化流程
  • 郑州网站建设 智巢长沙seo
  • 湖南智能网站建设推荐免费外链发布平台
  • 电商网站开发文献综述网站seo价格
  • 企业网站制作方法百度青岛代理公司
  • 做社群最好的网站源码个人网站怎么制作
  • pc网站建设需要提供哪些资料线上卖货平台有哪些
  • ppt 如何做网站交互式长沙官网网站推广优化
  • 六兄弟做网站襄阳网站推广优化技巧
  • 玉环建设局网站信息互联网推广
  • 国外对企业网站开发的研究cnzz数据统计
  • 给公司做网站风险建网站的软件
  • 网站布局软件seo站长助手
  • 东坑东莞微信网站建设百度指数属于行业趋势及人群
  • 广州网络推广引流网络优化大师
  • 网站导航栏目焦点设置中国联通和腾讯
  • 做可动模型的网站章鱼磁力链接引擎
  • wordpress收费插件大全南山网站seo
  • 优化网站排名的方法网页设计与网站建设教程
  • 网站建设需要的项目新闻源软文发布平台
  • 在哪个网站做引号流最好网站seo优化公司
  • 做外贸哪个网站好网站建设是干嘛的
  • 基于网站的网络营销方法有哪些2345浏览器网址