LINK1:精神污染

LINK2:[ONTAK2010Highways](http://www.lydsy.com/JudgeOnline/problem.php?id=3488)

LINK3:[接水果](https://www.luogu.com.cn/problem/P3242)

三道题挺相似的 也挺重要的 所以写一发题解。

精神污染:随机选择两条路径求一条路径被另一条路径包含的概率。
不难发现是污染的路径对数/总路径对数。总路径对数也很显然.
最难得地方是 求出左边的东西。考虑枚举一条路径 求出有多少条路径被其覆盖了。
树上路径覆盖问题 我们需要一个根号的算法或者log的算法。
先考虑链的情况 对于当前暴力枚举的路径不妨设为x,y 对于其他路径的两个端点设为ai bi
当前路径覆盖其他路径当且仅当 ai bi都在x-y的路径上 我们可以通过求LCA来表示这个东西不过过于繁琐我们还有更快的dfs序.
考虑lx下面分析接水果和刚才未完成的分类讨论。

接水果和刚才不同的是要求包含的第k大的值。

考虑二分 然后我们一条一条的加进去再查询。

多组询问 那就整体二分。

考虑如何快速判定一个路径到底包含了多少条路径。

可以发现这是一个上述问题的子问题。配合我们上述做法 也不过nlog^2的复杂度。

不过常数巨大 考虑优化一下这个做法 我们维护可持久化主席树 这个极其消耗时间 单次可以承受 但logn次就难以承受了。

一对点被另外一对点所包含 设当前这对点dfs序为posx lastx posy lasty

如果x,y(d[x]>d[y])没有祖先关系我们发现另外一对点的dfs序分别出现在上述两个区间之中即可。

如果存在祖先关系那么显然 y=lca(x,y) 另外一对点的其中一个点在posx lastx中 设z为y到x路径上的第一个儿子 那么令一个点的范围[1,posz-1][lastz,n]
这两个区间之中 可以发现我们把这种点对关系转换成区间关系 这其实是一个二维数点问题 我们可以扫描线+bit/线段树解决。

至于第二道题目显然也是这种类型的 特此这钟类型的题目有两种做法 其中第二种常用且常数较小。

可以发现我们这样做是一个二维数点问题 K-D tree也是可以查询的 不过每次复杂度是$sqrt(n)$。。当然也是可以过的啦。

但是接水果这道题整体二分比较显然 还是练练整体二分吧。

多此一举了一个地方导致查半天的错误。。还是思想不够缜密。这里放出代码 比较难写qwq.
```
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define db double
#define INF 1000000000
#define ld long double
#define pb push_back
#define put(x) printf("%d\n",x)
#define min(x,y) ((x)>(y)?(y):(x))
#define max(x,y) ((x)>(y)?(x):(y))
#define rep(p,n,i) for(ll i=p;i
#define F first
#define S second
#define mk make_pair
#define EPS 1e-7
#define P 13331ll
#define mod 998244353
using namespace std;
char buf[1'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&chsz[son[x]])son[x]=tn;
}
las[x]=cnt;
}
inline void dp(int x,int father)
{
top[x]=father;
if(!son[x])return;
dp(son[x],father);
for(int i=lin[x];i;i=nex[i])
if(ver[i]!=fa[x]&&ver[i]!=son[x])dp(ver[i],ver[i]);
}
inline int get(int x,int y)
{
while(top[x]!=top[y])
{
if(fa[top[x]]==y)return top[x];
x=fa[top[x]];
}
return son[y];
}
inline void add1(int x,int y)
{
while(xQr)return;
if(L==R)
{
for(int i=Ql;i>1;
int flag=l;
for(int i=Ql;i=s[i].k)sl[++ql]=s[i];
else s[i].k-=w[s[i].id],sr[++qr]=s[i];
}
for(int i=Ql;i=dfn[x])
{
int zz=get(x,y);
t[++ss]=(wy){1,dfn[x],las[x]+1,z,1};
t[++ss]=(wy){dfn[zz],dfn[x],las[x]+1,z,-1};
t[++ss]=(wy){las[zz]+1,dfn[x],las[x]+1,z,1};
}
else
{
t[++ss]=(wy){dfn[y],dfn[x],las[x]+1,z,1};
t[++ss]=(wy){las[y]+1,dfn[x],las[x]+1,z,-1};
}
}
for(int i=1;isz[son[x]])son[x]=tn;
}
las[x]=cnt;
}
inline void dp(int x,int father)
{
top[x]=father;
if(!son[x])return;
dp(son[x],father);
for(int i=lin[x];i;i=nex[i])
if(ver[i]!=fa[x]&&ver[i]!=son[x])dp(ver[i],ver[i]);
}
inline int get(int x,int y)
{
while(top[x]!=top[y])
{
if(fa[top[x]]==y)return top[x];
x=fa[top[x]];
}
return son[y];
}
inline void add1(int x,int y)
{
while(x=dfn[x])
{
int z=get(x,y);
q[++s]=(wy){1,las[x],n};
q[++s]=(wy){-1,las[x],las[z]};
q[++s]=(wy){1,las[x],dfn[z]-1};
q[++s]=(wy){-1,dfn[x]-1,n};
q[++s]=(wy){1,dfn[x]-1,las[z]};
q[++s]=(wy){-1,dfn[x]-1,dfn[z]-1};
}
else
{
q[++s]=(wy){1,las[x],las[y]};
q[++s]=(wy){-1,dfn[x]-1,las[y]};
q[++s]=(wy){-1,las[x],dfn[y]-1};
q[++s]=(wy){1,dfn[x]-1,dfn[y]-1};
}
}
sort(t+1,t+1+2*m);sort(q+1,q+1+s);
int flag=1;
for(int i=1;isz[son[x]])son[x]=tn;
}
las[x]=cnt;
}
inline void dp(int x,int father)
{
top[x]=father;
if(!son[x])return;
dp(son[x],father);
for(int i=lin[x];i;i=nex[i])
if(ver[i]!=fa[x]&&ver[i]!=son[x])dp(ver[i],ver[i]);
}
inline int get(int x,int y)
{
while(top[x]!=top[y])
{
if(fa[top[x]]==y)return top[x];
x=fa[top[x]];
}
return son[y];
}
inline void add1(int x,int y)
{
while(x=dfn[x])
{
int z=get(x,y);
q[++s]=(wy){1,las[x],n,i};
q[++s]=(wy){-1,las[x],las[z],i};
q[++s]=(wy){1,las[x],dfn[z]-1,i};
q[++s]=(wy){-1,dfn[x]-1,n,i};
q[++s]=(wy){1,dfn[x]-1,las[z],i};
q[++s]=(wy){-1,dfn[x]-1,dfn[z]-1,i};
}
else
{
q[++s]=(wy){1,las[x],las[y],i};
q[++s]=(wy){-1,dfn[x]-1,las[y],i};
q[++s]=(wy){-1,las[x],dfn[y]-1,i};
q[++s]=(wy){1,dfn[x]-1,dfn[y]-1,i};
}
}
sort(t+1,t+1+2*m);sort(q+1,q+1+s);
int flag=1;
for(int i=1;i

BZOJ3772精神污染&BZOJ3488&luogu3242接水果的更多相关文章

  1. BZOJ3772: 精神污染

    Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...

  2. BZOJ3772精神污染——可持久化线段树+出栈入栈序

    题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...

  3. [BZOJ3772]精神污染 主席树上树+欧拉序

    3772: 精神污染 Time Limit: 10 Sec  Memory Limit: 64 MB Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位 ...

  4. BZOJ3772 精神污染 【主席树 + dfs序】

    题目 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海 ...

  5. BZOJ3772 精神污染 主席树 dfs序

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3772 题意概括 给出一个树,共n个节点. 有m条互不相同的树上路径. 现在让你随机选择2条路径,问 ...

  6. BZOJ3772精神污染

    参见http://blog.csdn.net/popoqqq/article/details/43122821 #include<bits/stdc++.h> using namespac ...

  7. bzoj3772 精神污染 dfs 序+主席树

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3772 题解 很简单的一道题目. 上午研究一个题目的时候发现了这个题目是一个弱化版,所以来写了一 ...

  8. 【BZOJ3772】精神污染 DFS序+主席树

    [BZOJ3772]精神污染 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...

  9. 【bzoj3772】精神污染

    Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...

随机推荐

  1. 面向对象之继承以及抽象(Java实现)

    回顾封装 关于面向对象三大特性,我们可以很自信的回答:封装.继承.多态 之前学习的封装,可以很直观的理解为了保护数据,我们在idea中可以用alt+insert进行一个选择 constructer构造 ...

  2. 工作那么久,才知道的 SOLID 设计原则

    认识 SOLID 原则 无论是软件系统设计,还是代码实现,遵循有效和明确的设计原则,都利于系统软件灵活可靠,安全快速的落地,更重要的是能灵活地应对需求,简化系统扩展和维护,避免无效的加班.本文主要讨论 ...

  3. day14总结

    装饰器 """1.什么是装饰器 器指的是工具/功能 装饰指的是为被装饰对象添加额外的功能 大白话:定义装饰器就是定义了一个函数,该函数就是用来为其他函数添加额外的功能的 ...

  4. LintCode笔记 - 82.落单的数

    这一题相对简单,但是代码质量可能不是很好,我分享一下我的做题笔记以及做题过程给各位欣赏,有什么不足望各位大佬指出来 原题目,各位小伙伴也可以试着做一下 . 落单的数 中文English 给出 * n ...

  5. hls&flv直播请求过程

    hls&flv直播请求过程 直播类产品层出不穷,从各方面塑造了我们的生活方式.直播产品中,延时是决定用户体验的关键因素,它也将间接决定直播产品的成败.这其间,对延时影响较大的就是直播架构中选择 ...

  6. Guava集合--Immutable(不可变)集合

    所谓不可变集合,顾名思义就是定义了之后不可修改的集合. 一.为什么要使用不可变集合 不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的: 不可变对象被多个线程调用时,不存在竞态 ...

  7. day1 python计算器底层运作,注释及变量

    每日一记 utf-8 国际标准编码(可变长的unicode编码)中文3字节,英文数字特殊字符1字节 gbk 中国标准编码 中文2字节,英文数字特殊字符1字节 1.原码,反码,补码 "&quo ...

  8. 抽象工厂模式(c++实现)

    抽象工厂模式 目录 抽象工厂模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 感悟 模式定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而 ...

  9. 题解 洛谷 P1552 【[APIO2012]派遣】

    根据题意,我们不难发现忍者之间的关系是树形结构. 发现答案的统计只是在该节点的子树中,因此我们考虑通过树形\(DP\)来解决问题. 从叶子节点开始,从下往上考虑,因为一个节点的最优答案只与他的领导力和 ...

  10. TeamViewer如何绑定谷歌二次验证码/谷歌身份验证?

    1.下载TeamViewer,找到谷歌二次验证界面 下载.注册TeamViewer后,点击右上角账户名-“编辑配置文件” [常规]-“双重验证”,点“启用”   进入[激活双重验证]界面,点“启动激活 ...