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

网站建站公司迅驰互联网站建设网络推广怎么样

网站建站公司,迅驰互联网站建设网络推广怎么样,新房装修,长春关键词推广题目传送门 思路 暴力思路就是以每个查询节点 uuu 为根,然后 dfsdfsdfs 来看是否有深度为 ddd 的节点。 暴力里面蕴含着换根 dpdpdp 的思想,所以考虑换根。 首先可以以 111 为根 dfsdfsdfs 算出每个节点的深度,然后以每个节点的 dfsdfsdfs…

题目传送门


思路

暴力思路就是以每个查询节点 uuu 为根,然后 dfsdfsdfs 来看是否有深度为 ddd 的节点。

暴力里面蕴含着换根 dpdpdp 的思想,所以考虑换根。

首先可以以 111 为根 dfsdfsdfs 算出每个节点的深度,然后以每个节点的 dfsdfsdfs为下标来建立一个 维护深度区间最大值 mxpmx_pmxp 的线段树,并记录最大值的对应节点 idpid_pidp

然后再写一个 dfsdfsdfs 用来换根求解答案:
假如当前节点是 uuu,它的一个子节点为 vvv,现在根从 uuu 换到 vvv,那么整棵树中以 vvv 为根节点子树中的节点到根的距离都会 −1-11,其他节点都会 +1+1+1,这个用线段树维护就行。

然后考虑求解答案:

  1. 如果此时线段树中深度最大的节点的深度依旧小于 ddd,那么答案就是 −1-11
  2. 假设距离 uuu 最远的节点是 vvv,他们在原树(即以 111 为根的树)上的最近公共祖先是 lcalcalca。如果 dis(u,lca)≥ddis(u, lca) \geq ddis(u,lca)d,那么直接从 uuu 开始跳倍增跳到距离为 ddd 的祖先,这就是答案;不然就从 vvv 开始跳距离为 ddd 的祖先。

时间复杂度 O((q+n)×log(n))O((q + n) \times log(n))O((q+n)×log(n))


代码

#include <bits/stdc++.h>#define mkpr make_pair
#define fir first
#define sec second
#define il inlineusing namespace std;typedef pair<int, int> pii;
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef double db;const int maxn = 2e5 + 7;
const int inf  = 0x3f3f3f3f;int n, Q;
int h[maxn], ecnt;
struct edge {int v, nxt;} e[maxn << 1];
#define addedge(u, v) (e[++ecnt] = edge{v, h[u]}, h[u] = ecnt)vector<pii> que[maxn];
int ans[maxn];int L[maxn], R[maxn], rfc[maxn], dfnCnt;
int fa[maxn][22], dep[maxn];
void dfs1(int u) {rfc[L[u] = ++dfnCnt] = u;for (int i = 1; i <= 20; ++i)fa[u][i] = fa[fa[u][i - 1]][i - 1];if (fa[u][0]) dep[u] = dep[fa[u][0]] + 1;for (int i = h[u]; i; i = e[i].nxt)if (e[i].v != fa[u][0])fa[e[i].v][0] = u, dfs1(e[i].v);R[u] = dfnCnt;
}#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid ((l + r) >> 1)
struct SegmentTree {int mx[maxn << 2], id[maxn << 2], tg[maxn << 2];il void pushup(int p) {mx[p] = max(mx[ls], mx[rs]);if (mx[ls] > mx[rs]) id[p] = id[ls];else id[p] = id[rs];}il void pushdown(int p) {if (tg[p]) {mx[ls] += tg[p], tg[ls] += tg[p];mx[rs] += tg[p], tg[rs] += tg[p];tg[p] = 0;}}void build(int p, int l, int r) {if (l == r) {mx[p] = dep[rfc[l]], id[p] = rfc[l]; return ;}build(ls, l, mid), build(rs, mid + 1, r), pushup(p);}void mdf(int p, int l, int r, int ql, int qr, int v) {if (ql > qr) return ;if (qr < l || r < ql) return ;if (ql <= l && r <= qr) {mx[p] += v, tg[p] += v; return ;}pushdown(p);mdf(ls, l, mid, ql, qr, v), mdf(rs, mid + 1, r, ql, qr, v);pushup(p);}pii ask(int p, int l, int r, int ql, int qr) {if (qr < l || r < ql) return mkpr(-inf, 0);if (ql <= l && r <= qr) return mkpr(mx[p], id[p]);pushdown(p);pii l_res = ask(ls, l, mid, ql, qr);pii r_res = ask(rs, mid + 1, r, ql, qr);if (l_res.fir > r_res.fir) return l_res;return r_res;}void print(int p, int l, int r) {pushdown(p);printf("p:%d, l:%d, r:%d, mx:%d, id:%d\n", p, l, r, mx[p], id[p]);if (l == r) return ;print(ls, l, mid), print(rs, mid + 1, r);}
} sgt;
int LCA(int x, int y) {if (dep[x] < dep[y]) swap(x, y);int dif = dep[x] - dep[y];for (int i = 20; i >= 0; --i)if (dif & (1 << i)) x = fa[x][i];if (x == y) return x;for (int i = 20; i >= 0; --i)if (fa[x][i] != fa[y][i])x = fa[x][i], y = fa[y][i];return fa[x][0];
}
int jump(int x, int d) {for (int i = 20; i >= 0; --i)if (d & (1 << i)) x = fa[x][i];return x;
}#define dis(u, v, lca) (dep[u] + dep[v] - 2 * dep[lca])
void dfs2(int u) {for (pii q : que[u]) {pii res = sgt.ask(1, 1, n, 1, n);int qry_d = q.fir, id = q.sec;int v = res.sec, mxd = res.fir;int lca = LCA(u, v);if (mxd < qry_d) {ans[id] = -1;continue;}if (dis(u, lca, lca) >= qry_d) {ans[id] = jump(u, qry_d);continue;}ans[id] = jump(v, dis(u, v, lca) - qry_d);}for (int i = h[u]; i; i = e[i].nxt) {int v = e[i].v;if (v == fa[u][0]) continue;sgt.mdf(1, 1, n, L[v], R[v], -1);sgt.mdf(1, 1, n, 1, L[v] - 1, 1);sgt.mdf(1, 1, n, R[v] + 1, n, 1);dfs2(v);sgt.mdf(1, 1, n, L[v], R[v], 1);sgt.mdf(1, 1, n, 1, L[v] - 1, -1);sgt.mdf(1, 1, n, R[v] + 1, n, -1);}
}
int main() {scanf("%d", &n);for (int i = 1; i < n; ++i) {int u, v; scanf("%d%d", &u, &v);addedge(u, v), addedge(v, u);}scanf("%d", &Q);for (int i = 1; i <= Q; ++i) {int u, d;scanf("%d%d", &u, &d);que[u].push_back(mkpr(d, i));}dfs1(1);sgt.build(1, 1, n);dfs2(1);for (int i = 1; i <= Q; ++i) printf("%d\n", ans[i]);return 0;
}

文章转载自:

http://oIDYh3Kw.pgmbL.cn
http://hV3EaqZv.pgmbL.cn
http://qpig8otu.pgmbL.cn
http://cgM5V2q8.pgmbL.cn
http://0kPUEQj3.pgmbL.cn
http://386YaWay.pgmbL.cn
http://0kYrvwlM.pgmbL.cn
http://xjnRyddd.pgmbL.cn
http://o71nvwnH.pgmbL.cn
http://zO3FiN1W.pgmbL.cn
http://E2hQHHxB.pgmbL.cn
http://1UoO8I1b.pgmbL.cn
http://AWCKrT3s.pgmbL.cn
http://fnbFcfF6.pgmbL.cn
http://zpDqTPNi.pgmbL.cn
http://KvUl2lwf.pgmbL.cn
http://FiMntnbQ.pgmbL.cn
http://8zcznLsN.pgmbL.cn
http://zTAamekh.pgmbL.cn
http://H8mTxR04.pgmbL.cn
http://edrY8ijd.pgmbL.cn
http://uJGGAFXh.pgmbL.cn
http://3ZeeiYSi.pgmbL.cn
http://sJbDGEvZ.pgmbL.cn
http://kZpjPwDV.pgmbL.cn
http://Lf4j8R9z.pgmbL.cn
http://XOSWlVz6.pgmbL.cn
http://YtqbBL1S.pgmbL.cn
http://6OfwLZj0.pgmbL.cn
http://pxBtuKcL.pgmbL.cn
http://www.dtcms.com/wzjs/714470.html

相关文章:

  • 专注做一家男生最爱的网站wordpress变为中文
  • 如何建设国外的网站做网站需要接口么
  • 菠菜网站搭建怎么做网站开发需有没有著作权
  • 广州做网站专业公司seo排名工具站长
  • 北京网站设计制作关键词优化马鞍山 网站建设 有限公司
  • 广州3d网站开发东莞市手机网站建设品牌
  • 公司网站建设策划书网站建设结课论文
  • 免费建立自己微网站吗室内装修3d动态演示效果图
  • 杭州网站建设推荐南昌seo排名外包
  • 网站一年维护费用多少门户网站建设考核总结
  • 模板建站什么意思专业网站建设哪里好
  • 网站中查看熊掌号怎么做的网站开发的外文翻译
  • 做网站的没有进项票怎么办app开发公司怎么选
  • 手机上怎么制作网站吗怎么增加网站外链
  • 网站实现功能wordpress:代码
  • seo整站网站推广优化排名汕头网站建设只需要800
  • 网站备注销整合营销传播的六种方法
  • 网站培训视频成都可以做网站的公司
  • 设计网站推荐什么主题王野 天启
  • 新开传奇网站一wordpress注册不跳转
  • 用word 做网站宿州集团网站建设
  • 怎样免费给自己的公司做网站万网的网站建设是什么
  • 那位学生网站开发网站怎么做舆情监测
  • 重庆网站平台如何推广做推送网站
  • 珠海自助建站软件网站空间 .de
  • 网站排名优化策划深圳厂房设计
  • 网站用什么格式的图片格式辽宁建设工程信息网中标公示几天
  • 河北省住房和城乡建设厅官方网站廉政网站管理制度建设
  • 网站建设 400电话 广告语特种设备作业人员证查询
  • 做电力的系统集成公司网站域名申请好了 怎么做网站