[XSY3112] 接水果(树上包含路径,整体二分,扫描线)

传送门

给出一棵nnn个点的树。接下来给出PPP条树上路径ai→bia_i\to b_iaibi,及其权值cic_ici。最后有QQQ个询问,每个询问给出一条树上路径ui→viu_i\to v_iuivi,问在包含ui→viu_i\to v_iuivi的所有树上路径中(包含指ui→viu_i\to v_iuiviai→bia_i\to b_iaibi的子路径),权值第kkk小的路径权值是多少?

不妨设dep[u]<dep[v]dep[u]<dep[v]dep[u]<dep[v]
lca(u,v)=ulca(u,v)=ulca(u,v)=u,记pppuuu在向vvv方向的儿子,
那么包含u→vu\to vuv的路径a→ba\to bab一定满足:a∉subtreep,b∈subtreeva\not\in subtree_p,b\in subtree_vasubtreep,bsubtreev
lca(u,v)≠ulca(u,v)\not=ulca(u,v)=u
那么包含u→vu\to vuv的路径a→ba\to bab一定满足:a∈subtreeu,b∈subtreeva\in subtree_u,b\in subtree_vasubtreeu,bsubtreev

也就是说,对于包含u→vu\to vuv的路径a→ba\to babdfn[a],dfn[b]dfn[a],dfn[b]dfn[a],dfn[b]的取值范围是 一段或两端区间。
因此所有符合条件的路径a→ba\to bab可以用二维平面上的 一个或两个矩形 表示出来。

原题要求的就是所有包含询问点矩形中权值第kkk小的。

考虑整体二分,统计一个点在多少个 权值在[l,r][l,r][l,r]内的矩形 中出现过。用扫描线解决。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=80010;
struct Edge{int v,nxt;}edge[N];
int n,m,q,cnt,head[N];
int fa[N][20],dep[N],ind,dfn[N],lst[N];
int tot,ans[N],sum[N];
struct Rectangle{int xd,xu,yd,yu,v;}rect[N];
bool operator < (Rectangle a,Rectangle b){return a.v<b.v;} 
struct Point{int x,y,k,id;}pt[N],tmp1[N],tmp2[N];
struct Line{int x,yd,yu,v,id;}line[N];
bool operator < (Line a,Line b){return a.x==b.x?a.id<b.id:a.x<b.x;} 
struct Bit{int val[N];void modify(int l,int r,int v){for(int i=l;i<=n;i+=(i&(-i))) val[i]+=v;for(int i=r+1;i<=n;i+=(i&(-i))) val[i]-=v;}int query(int x){int res=0;for(;x;x-=(x&(-x))) res+=val[x];return res;}
}T;
void add(int u,int v){edge[++cnt].v=v;edge[cnt].nxt=head[u];head[u]=cnt;
}
void dfs(int u){dfn[u]=++ind;for(int i=0;fa[u][i];i++) fa[u][i+1]=fa[fa[u][i]][i];for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].v;if(v==fa[u][0]) continue;fa[v][0]=u;dep[v]=dep[u]+1;dfs(v);}lst[u]=ind;
}
int jump(int u,int dis){for(int i=18;dis;i--){if(dis>=(1<<i)){dis-=(1<<i);u=fa[u][i];}}return u;
}
int LCA(int u,int v){if(dep[u]<dep[v]) swap(u,v);u=jump(u,dep[u]-dep[v]);if(u==v) return u;for(int i=18;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];return fa[u][0];
}
void solve(int l,int r,int st,int ed){if(st>ed) return;if(l==r){for(int i=st;i<=ed;i++) ans[pt[i].id]=rect[l].v;return;}int mid=(l+r)>>1,siz=0;for(int i=l;i<=mid;i++){line[++siz]=(Line){rect[i].xd,rect[i].yd,rect[i].yu,1,0};line[++siz]=(Line){rect[i].xu,rect[i].yd,rect[i].yu,-1,n+1};}for(int i=st;i<=ed;i++) line[++siz]=(Line){pt[i].x,pt[i].y,0,0,i};sort(line+1,line+siz+1);for(int i=1;i<=siz;i++){if(st<=line[i].id&&line[i].id<=ed) sum[line[i].id]=T.query(line[i].yd);else T.modify(line[i].yd,line[i].yu,line[i].v);}int a=0,b=0;for(int i=st;i<=ed;i++){if(sum[i]>=pt[i].k) tmp1[++a]=pt[i];else tmp2[++b]=(Point){pt[i].x,pt[i].y,pt[i].k-sum[i],pt[i].id};}for(int i=st;i<=st+a-1;i++) pt[i]=tmp1[i-st+1];for(int i=st+a;i<=ed;i++) pt[i]=tmp2[i-st-a+1];solve(l,mid,st,st+a-1);solve(mid+1,r,st+a,ed);
}
int main(){scanf("%d%d%d",&n,&m,&q);for(int i=1;i<n;i++){int a,b;scanf("%d%d",&a,&b);add(a,b);add(b,a);}dfs(1);for(int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);int u=LCA(a,b);if(dfn[a]>dfn[b]) swap(a,b);if(u!=a) rect[++tot]=(Rectangle){dfn[a],lst[a],dfn[b],lst[b],c};else{int w=jump(b,dep[b]-dep[a]-1);rect[++tot]=(Rectangle){1,dfn[w]-1,dfn[b],lst[b],c};if(lst[w]<n) rect[++tot]=(Rectangle){dfn[b],lst[b],lst[w]+1,n,c};}}sort(rect+1,rect+tot+1);for(int i=1;i<=q;i++){int a,b,k;scanf("%d%d%d",&a,&b,&k);if(dfn[a]>dfn[b]) swap(a,b);pt[i]=(Point){dfn[a],dfn[b],k,i};}solve(1,tot,1,q);for(int i=1;i<=q;i++) printf("%d\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tr A HDU1575

文章目录题目&#xff1a;题解&#xff1a;代码&#xff1a;Tr A HDU1575题目&#xff1a; A为一个方阵&#xff0c;则Tr A表示A的迹&#xff08;就是主对角线上各项的和&#xff09;&#xff0c;现要求Tr(A^k)%9973。 Input 数据的第一行是一个T&#xff0c;表示有T组数据。 每…

asp.net core webapi项目配置全局路由

一、前言在开发项目的过程中&#xff0c;我新创建了一个controller&#xff0c;发现vs会给我们直接在controller头添加前缀&#xff0c;比如[Route("api/[controller]")],即在访问接口的时候会变成http://localhost:8000/api/values&#xff0c;但是如果控制器有很多…

CF622F-The Sum of the k-th Powers【拉格朗日插值】

正题 题目链接:https://www.luogu.com.cn/problem/CF622F 题目大意 给出n,kn,kn,k&#xff0c;求 ∑i1nik\sum_{i1}^ni^ki1∑n​ik 解题思路 很经典的拉格朗日差值问题 这个东西显然是可以化成一个k1k1k1次的多项式的&#xff0c;所以我可以直接代k2k2k2个点插出值来。看到顺…

平板游戏问题(luogu 2003/2018 特长生 T4)

正题 luogu 2003 题目大意 在平面上有若干块板子&#xff0c;每块板子的左右端分别向下连一条柱子&#xff0c;连到第一块板子&#xff0c;问你共要多少长度的柱子 解题思路 枚举一个板子中间的柱子&#xff08;即对这些柱子可能有贡献&#xff09; 然后取一个最高的立即可…

位运算及其性质

定义 运算名符号效果按位与&如果两个相应的二进制位都为1&#xff0c;则该位的结果值为1&#xff0c;否则为0按位或l两个相应的二进制位中只要有一个为1&#xff0c;该位的结果值为1按位异或^若参加运算的两个二进制位值相同则为0&#xff0c;否则为1取反~对一个二进制数按…

C Looooops POJ - 2115

C Looooops POJ - 2115 题目&#xff1a; A Compiler Mystery: We are given a C-language style for loop of type statement; I.e., a loop which starts by setting variable to value A and while variable is not equal to B, repeats statement followed by increasing …

IdentityServer4实战 - 谈谈 JWT Token 的安全策略

一.前言众所周知&#xff0c;IdentityServer4 默认支持两种类型的 Token&#xff0c;一种是 Reference Token&#xff0c;一种是 JWT Token 。前者的特点是 Token 的有效与否是由 Token 颁发服务集中化控制的&#xff0c;颁发的时候会持久化 Token&#xff0c;然后每次验证都需…

P4320-道路相遇,P5058-[ZJOI2004]嗅探器【圆方树,LCA】

两题差不多就一起写了 P4320-道路相遇 题目链接:https://www.luogu.com.cn/problem/P4320 题目大意 nnn个点mmm条边的一张图&#xff0c;qqq次询问两个点之间路径的必经点数量。 解题思路 建出圆方树然后问题就变为询问两个点之间路径的圆点数量&#xff0c;可以直接倍增L…

【Manacher】绿绿和串串(luogu 5446)

正题 luogu 5446 题目大意 定义对折为&#xff1a;以最后一个字符为对称轴翻转 问你一个字符串可能是由那些前缀对折若干次而来的 解题思路 先用Manacher求出回文长度 那么满足以下条件之一的前缀就是可行方案 最后一个字符的回文长度加上它的位置为n&#xff08;后面若干…

使用.Net Core实现FNV分布式hash一致性算法

说到FNV哈希算法不得不提Memcached&#xff0c;我们先简单介绍一下Memcached。MemcachedMemcached分为客户端与服务端&#xff0c;Memcached是服务端&#xff0c;服务端本身不提供分布式实现&#xff0c;只是一个单独的k-v缓存&#xff1b;Memcached的分布式是在客户端类库中实…

一起开心暑假集训第一周限时训练 2020/7/5

文章目录A - Goldbachs Conjecture POJ - 2262B - 同余方程 计蒜客 - T2010C - Tr A HDU - 1575D - C Looooops POJ - 2115vjudge试题集链接 A - Goldbach’s Conjecture POJ - 2262 试题链接&#xff1a; 线性筛先预处理&#xff0c;然后判断就行 #include<iostream>…

P5631-最小mex生成树【线段树,并查集】

正题 题目链接:https://www.luogu.com.cn/problem/P5631 题目大意 nnn个点mmm条边的一张图&#xff0c;求mexmexmex值最小的一棵生成树。 解题思路 考虑比较暴力的做法&#xff0c;枚举答案&#xff0c;然后判断其他边能否构成一棵生成树。 发现一条边会被重复加入多次&…

【Manacher】【贪心】字符串连接(金牌导航 Manacher-4)

正题 金牌导航 Manacher-4 题目大意 给出一个字符串&#xff0c;让你用最少的回文串连接得到该串&#xff08;这里连接是可以有重合的&#xff09; 解题思路 先用Manacher求出以x为左端点的回文串右端点最大的位置 然后在当前回文串中贪心求下一回文串的右端点 代码 #incl…

[XSY4197] Snow(树形DP)

我们在树上的每个点iii上放aia_iai​个小点&#xff0c;初始时先让每个点单独减&#xff0c;这样要花费aia_iai​之和的次数。 然后尝试把某些减合并。一个点上面的小点至多可以向两个相邻的小点连边&#xff08;这两个小点不能在同一个点上&#xff09;。每连一条边&#xff…

Followme Devops实践之路

引言天下武功,唯快不破想要提高开发团队效率&#xff0c;势必要有一套完整而成熟的开发流程方案&#xff0c;除了sprint迭代开发模式之外,还有近几年流行的devops流程,都是可以大幅度提高开发效率的工具. 我们团队也不断探索、实践&#xff0c;最终形成了现有的一套体系&#x…

【每日一题】6月30日 Growth

来源&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 1048576K&#xff0c;其他语言2097152K 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 弱弱有两个属性a和b&#xff0c;这两个属性初始的时…

P5445-[APIO2019]路灯【set,树状数组套线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P5445 题目大意 n1n1n1个点&#xff0c;iii和i1i1i1个点之间有一条边&#xff0c;qqq个操作 断开/连接第xxx和x1x1x1之间的边询问目前为止aaa和bbb点在多少个操作后是联通的&#xff08;包括开始前&#xff09; 解题思路 粗…

【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)

正题 luogu 1019 题目大意 给你若干个词语&#xff0c;让你把他们连起来&#xff08;重复段叠在一起&#xff09;&#xff0c;每个词语最多用两次&#xff0c;问你该串最长是多少 解题思路 dfs枚举一个单词后面接哪个单词&#xff0c;然后枚举重叠长度&#xff0c;再用hash判…

基环树小记

概念 基环树就是有n个点n条边的图&#xff08;比树多出现一个环&#xff09;。 特殊形态的基环树 无向树(N点N边无向图) 外向树(每个点只有一条入边) 内向树(每个点只有一条出边) 以上三种树有十分优秀的性质&#xff0c;就是可以直接将环作为根。就可以对每个环的子树进行单…

【每日一题】7月1日题目精讲 借教室

来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld文章目录题目描述题解&#xff1a;差分&#xff1a;二分&#xff1a;整合代码&#xff1a;题目描述 在大学期…