BZOJ.4009.[HNOI2015]接水果(整体二分 扫描线)

LOJ
BZOJ
洛谷

又是一个三OJ rank1!=w=


\(Description\)

(还是感觉,为啥非要出那种题目背景啊=-=直接说不好么)
给定一棵树和一个路径集合(每条路径有一个权值)。\(Q\)次询问,每次询问给定一条路径,求路径集合中完全被这条路径包含的路径中,权值第\(k\)大的是多少。
\(n,m,Q\leq40000\)

\(Solution\)

首先考虑一条路径\((a,b)\)完全包含路径\((u,v)\),需要满足什么条件。
\(L[x]\)\(x\ DFS\)序的编号,\(R[x]=L[x]+size[x]-1\)\(x\)子树\(DFS\)序编号的最后一个。
\(LCA(u,v)\neq u\),那么\(L[u]\leq L[a]\leq R[u],\ L[v]\leq L[b]\leq R[v]\)。也即点\((L[a],L[b])\)在矩形\([L[u]\sim R[u],\ L[v]\sim R[v]]\)中。
\(LCA(u,v)=u\),记\(w\)\(u\to v\)路径上的第二个点(\(u\)\(v\)子树方向上的儿子),则\(a\)\(w\)子树外,\(b\)\(v\)子树内,即\(L[a]\)在区间\([1,L[w]-1]\bigcup[R[w]+1,n]\)中,\(L[b]\)\([L[v],R[v]]\)中。
那么每个盘子就是一个矩形,每个水果是一个点,我们要对每个点求,包含它的矩形中第\(k\)大的是多少。
整体二分+扫描线。

具体:先把矩形拆成扫描线,再对扫描线按权值排序。每次加入权值\(\leq mid\)的扫描线,同时处理每个询问。
若对于一个询问,包含它的矩形个数\(\geq k\),则它的答案\(\leq mid\);否则\(k\)减掉对应个数,它的答案\(\gt mid\)

细节:\(LCA(u,v)\)是否\(u\)可以直接判\(v\)\(u\)的子树里。
要让修改和询问的\(x\)都小于等于\(y\)
最好对权值离散化一下下。
树状数组是区间修改单点查询。。差分一下。

变量名写的有点恶心=-=


//15268kb   1128ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define MAXIN 300000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=40005,M=N<<2;int Enum,H[N],nxt[N<<1],ho[N<<1],val[N],L[N],R[N],Ans[N],fa[N],dep[N],sz[N],son[N],top[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Quries
{int x,y,k,id;bool operator <(const Quries &a)const{return x<a.x;}
}q[N],tmpq1[N],tmpq2[N];
struct OPT
{int p,l,r,v;bool operator <(const OPT &a)const{return p<a.p;}
}opt[N<<2],tmpo1[M],tmpo2[M];
struct BIT
{int n,t[N];#define lb(x) (x&-x)inline void Modify(int l,int r,int v){for(int p=l; p<=n; p+=lb(p)) t[p]+=v;for(int p=r+1; p<=n; p+=lb(p)) t[p]-=v;}inline int Query(int p){int res=0;for(; p; p^=lb(p)) res+=t[p];return res;}
}T;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now;
}
inline void AE(int u,int v)
{ho[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;ho[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
inline int Jump(int u,int v)
{int las=v;while(top[u]!=top[v]) v=fa[las=top[v]];return u==v?las:son[u];
}
void DFS1(int x)
{int mx=0; sz[x]=1;for(int i=H[x],v; i; i=nxt[i])if((v=ho[i])!=fa[x]) fa[v]=x, dep[v]=dep[x]+1, DFS1(v), sz[x]+=sz[v], sz[v]>mx&&(mx=sz[v],son[x]=v);
}
void DFS2(int x,int tp)
{static int Index=0;top[x]=tp, L[x]=++Index;if(son[x]){DFS2(son[x],tp);for(int i=H[x],v; i; i=nxt[i])if((v=ho[i])!=fa[x]&&v!=son[x]) DFS2(v,v);}R[x]=Index;
}
void Solve(int l,int r,int ho,int to,int hq,int tq)
{if(l==r||ho>to||hq>tq){for(int i=hq,v=val[l]; i<=tq; ++i) Ans[q[i].id]=v;return;}int m=l+r>>1,v=val[m],now=ho,to1=0,to2=0,tq1=0,tq2=0;for(int i=hq; i<=tq; ++i){while(now<=to && opt[now].p<=q[i].x)if(std::abs(opt[now].v)<=v) T.Modify(opt[now].l,opt[now].r,opt[now].v>0?1:-1), tmpo1[to1++]=opt[now++];else tmpo2[to2++]=opt[now++];int t=T.Query(q[i].y);if(q[i].k>t) q[i].k-=t, tmpq2[tq2++]=q[i];else tmpq1[tq1++]=q[i];}while(now<=to)if(std::abs(opt[now].v)<=v) T.Modify(opt[now].l,opt[now].r,opt[now].v>0?1:-1), tmpo1[to1++]=opt[now++];else tmpo2[to2++]=opt[now++];for(int i=ho,p=0; p<to1; opt[i++]=tmpo1[p++]);for(int i=ho+to1,p=0; p<to2; opt[i++]=tmpo2[p++]);for(int i=hq,p=0; p<tq1; q[i++]=tmpq1[p++]);for(int i=hq+tq1,p=0; p<tq2; q[i++]=tmpq2[p++]);Solve(l,m,ho,ho+to1-1,hq,hq+tq1-1), Solve(m+1,r,ho+to1,to,hq+tq1,tq);
}int main()
{int n=read(),m=read(),Q=read();for(int i=1; i<n; ++i) AE(read(),read());DFS1(1), DFS2(1,1);int tot=0;for(int i=1; i<=m; ++i){int u=read(),v=read(); val[i]=read();if(L[u]>L[v]) std::swap(u,v);if(L[v]<L[u]||L[v]>R[u]){opt[++tot]=(OPT){L[u],L[v],R[v],val[i]};if(R[u]<n) opt[++tot]=(OPT){R[u]+1,L[v],R[v],-val[i]};}else{int w=Jump(u,v);//if(L[w]>1) 这个显然不用判啊=-= (但是下面那个要判啊 opt[++tot]=(OPT){1,L[v],R[v],val[i]}, opt[++tot]=(OPT){L[w],L[v],R[v],-val[i]};if(R[w]<n) opt[++tot]=(OPT){L[v],R[w]+1,n,val[i]}, opt[++tot]=(OPT){R[v]+1,R[w]+1,n,-val[i]};//加上可能的p=n+1的操作好惹,以便清空树状数组。}}for(int i=1,u,v; i<=Q; ++i)u=read(),v=read(),q[i]=(Quries){std::min(L[u],L[v]),std::max(L[u],L[v]),read(),i};std::sort(opt+1,opt+1+tot), std::sort(q+1,q+1+Q), std::sort(val+1,val+1+m);int cnt=1;for(int i=2; i<=m; ++i) if(val[i]!=val[i-1]) val[++cnt]=val[i];T.n=n, Solve(1,cnt,1,tot,1,Q);for(int i=1; i<=Q; printf("%d\n",Ans[i++]));return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10699072.html

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

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

相关文章

HTML5常用标签及特殊字符表

*http://html5doctor.com/nav*http://html5doctor.com/article*http://html5doctor.com/section*http://html5doctor.com/asidehttp://html5doctor.com/divhttp://html5doctor.com/figurehttp://html5doctor.com/outlinehttp://html5doctor.com/semantics p 和 span 的理解 p标…

【转载】使用Imaging组件加载GIF动画

Mobil手机加载GIF动态图像的方法有两种&#xff0c;一个就是使用GIF89a标准算法&#xff0c;另一个就是使用SDK自带的Imaging组件&#xff0c;这两种方法是很典型的手机图像处理技术的实践。使用Imaging组件加载GIF比使用标准算法处理高效的多&#xff0c;特别是在处理真彩GIF动…

在Java中获取素数的无限列表

一个常见的问题是确定数字的素因式分解。 蛮力方法是审判部门&#xff08; 维基百科 &#xff0c; 可汗学院 &#xff09;&#xff0c;但是如果必须考虑多个数字&#xff0c;这需要大量的浪费工作。 一种广泛使用的解决方案是Eratosthenes筛&#xff08; 维基百科 &#xff0c…

CF888G XOR-MST trie,贪心

CF888G XOR-MST 链接 CF888G 思路 trie上贪心&#xff0c;先左右两边连边&#xff0c;再用一条边的代价连起左右两颗树。因为内部的边一定比跨两棵树的边权笑&#xff0c;显然是对的。 代码自己瞎yy的。启发式合并 代码 #include <bits/stdc.h> #define ll long long usi…

【处理手记】Configuration system failed to initialize异常的另类原因

有个c#程序在某台电脑上&#xff0c;执行某个操作时&#xff0c;总是会报如图错误&#xff1a; 度娘一番&#xff0c;发现市面上常见的原因是配置文件中的特定节点的位置不对&#xff0c;或者配置文件损坏等等&#xff0c;而这个程序根本没有使用内置的配置文件方案&#xff0c…

学习《Building Applications with FME Objects》 之四 从数据集读取要素

FMEOReader可以访问任何支持格式的数据。 FMEOReader返回两类要素&#xff1a;schema&#xff08;模式&#xff09;要素和数据要素&#xff0c;模式要素用于描述数据集模型。每种支持的格式都有一个模式&#xff0c;一个模式要素是一类要素的数据模型&#xff0c;模式要素描述属…

使用Zapier将应用程序与Neo4j集成

最近&#xff0c;我被带往Zapier &#xff0c;以便在系统之间完成一些轻量级的集成&#xff0c;以快速地进行概念验证。 最初是持怀疑态度的&#xff0c;我发现它确实可以节省时间&#xff0c;并将您从未集成过的系统所有部分捆绑在一起。 而且&#xff0c;这是人们集成他们使…

手机闪屏

表示&#xff0c;本人买了一个华为手机&#xff0c;采用三四个月&#xff0c;就开始闪屏了&#xff0c;手机一划屏就闪&#xff0c;开始的时候表示不能理解&#xff0c;不是手机一般是1年才换吗&#xff1f;突然遇到我也是纠结。 于是乎&#xff0c;浏览了些百度上面的解决方式…

工程能力之C4模型

概述 刚在InfoQ上看到一篇介绍C4Model的文章,觉得这个模型设计的很赞,很有指导意义,做个简单的记录. Why,为什么需要架构图? ThoughtWorks中国 文章中有几句话我觉得很有道理,这里直接摘抄. “纸上的不是架构&#xff0c;每个人脑子里的才是” ; “那些精妙的方案之所以落不了…

[silverlight基础]仿文字连接跑马灯效果-高手绕道

运行效果如下:分析示意图&#xff1a;代码:1<Canvas x:Name"a"Background"AliceBlue"MouseEnter"a_MouseEnter"MouseLeave"a_MouseLeave"Cursor"Hand">2<Canvas.Clip>3<RectangleGeometry RadiusX"0&qu…

Hibernate脏检查的剖析

介绍 持久性上下文使实体状态转换进入队列&#xff0c;该实体状态转换在刷新后转换为数据库语句。 对于托管实体&#xff0c;Hibernate可以代表我们自动检测传入的更改并安排SQL UPDATE。 这种机制称为自动脏检查 。 默认的脏检查策略 默认情况下&#xff0c;Hibernate检查所有…

http GET 和 POST 请求的优缺点、区别以及误区

原文章&#xff1a;https://blog.csdn.net/qq_28483283/article/details/80207674 请优先参考原文章 Get和Post在面试中一般都会问到&#xff0c;一般的区别&#xff1a; &#xff08;1&#xff09;post更安全&#xff08;不会作为url的一部分&#xff0c;不会被缓存、保存在服…

软件工程第二次作业-VSTS单元测试

一、选择开发工具 开发工具选择 Visual studio 2017 社区版&#xff0c;开发语言为C 由于之前已经安装完毕&#xff0c;所以不上传安装过程&#xff0c;主界面如下&#xff1a; 二、练习自动单元测试 使用的测试工具是VSTS&#xff0c;具体步骤如下&#xff1a; 1.编写一个判断…

随便写写(8)

凌晨两点了&#xff0c;还在捣鼓虚拟机&#xff0c;教师节老师们吃不上饭&#xff0c;罪过可就大了。远程有点慢&#xff0c;还遇到个小问题&#xff0c;.netfx 3.5几次都没装上&#xff0c;看了下日志&#xff0c;好像是ghost里的.netfx 2.0有问题&#xff0c;想卸载之&#x…

React后台管理系统-登录页面

登录页面 <div className"col-md-4 col-md-offset-4"> <div className"panel panel-default login-panel"> <div className"panel-heading">欢迎登录 - MMALL管理系统</div> <div className"panel-body"&g…

识别JVM –比预期的要复杂

在Plumbr&#xff0c;我们花了最后一个月的时间来为将来的重大改进奠定基础。 此类构件之一是为JVM添加唯一标识符&#xff0c;以便将来自同一JVM的所有会话链接在一起。 虽然一开始看起来似乎很琐碎的任务&#xff0c;但是当查看JVM捆绑的jps命令的输出时&#xff0c;围绕该问…

随记3

查看本机ip&#xff1a;ifconfig | grep "inet " | grep -v 127.0.0.1去两端空格&#xff1a;rowrow.strip(\t)替换\n \r \t 为空&#xff1a;row row.replace(\r,).replace(\n,).replace(\t,’)字符串长度&#xff1a;aa ‘afebb’ print(len(aa))列表 List列表…

求一架构 : 保留历史数据

最近做一个学校管理系统&#xff0c;当中遇到一个比较麻烦的问题“保留历史数据”&#xff0c;很疑惑&#xff0c;说出来大家讨论下&#xff0c;相信很多人也遇到同样的问题。校方提出需求如下&#xff1a;1.要保留学期留历史数据比如&#xff1a;●  一年级一班2008-2009上学…

React后台管理系统-品类的增加、修改和查看

1.页面 2.品类列表展示 let listBody this.state.list.map((category, index) > { return ( <tr key{index}> <td>{category.id}</td> <td>{category.name}</td> <td> <a className"opear" onClick{(e) > this.onUpda…

hdu5111 树链剖分,主席树

hdu5111 链接 hdu 思路 先考虑序列上如何解决。 1 3 2 5 4 1 2 4 5 3 这个序列变成 1 2 3 4 5 1 3 5 5 2 是对答案没有影响的(显然)。 然后查询操作\(l,r,L,R\)就是&#xff0c; 一段连续的区间\([L,R]\)内包含几个值在\([l,r]\)的数字个数. 主席树就可以做了。\(query(rt[L-1]…