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. 给大家分享一下less的使用几个技巧

    1.层级关系 让这个box范围内的全部包进来,这样的话就完美的进行调节,再也不用到处找第几行第几个,我刚才在哪个位置给覆盖了.一看便知! .box{ width: %; height: 300px; ...

  2. 你不知道的前端SDK开发技巧

    最近在做公司内部的一个的一个SDK的重构,这里总结一些经验分享给大家. 类型检查和智能提示 作为一个SDK,我们的目标是让使用者能够减少查看文档的时间,所以我们需要提供一些类型的检查和智能提示,一般我 ...

  3. (三)ELK logstash input

    一,input模块 input 插件官方详解: https://www.elastic.co/guide/en/logstash/current/input-plugins.html Logstash ...

  4. Golden Tiger Claw(二分图)

    Golden Tiger Claw 题意 找到和最小的两个序列a,b满足对于任意i,j有a[i]+b[j]>=c[i][j](矩阵c给出). solution 裸的二分图就水过了-- #incl ...

  5. C#读取Excel转换为DataBle

    /// <summary> /// Excel->DataTable /// </summary> /// <param name="filePath&q ...

  6. 上海python14期第一次周考

    上海python14期第一次周考 1 介绍 满分50分 考试范围: Python语法 数据类型 流程控制 考试时间: 周五下午3.00点-晚6:00 2 基础题(38分) 什么是编程语言?什么是语言? ...

  7. 【初学】Spring源码笔记之零:阅读源码

    笔记要求 了解Java语言 了解Spring Framework的基础 会使用Maven 关于本笔记 起因 本职数据分析,为公司内部人员开发数据处理系统,使用了Python/Django+Bootst ...

  8. Scala 基础(九):Scala 函数式编程(一)基础(一)概念、定义、调用机制

    1 概念的说明 1)在scala中,方法和函数几乎可以等同(比如他们的定义.使用.运行机制都一样的),只是函数的使用方式更加的灵活多样. 2)函数式编程是从编程方式(范式)的角度来谈的,可以这样理解: ...

  9. Scala 基础(二):sbt介绍与构建Scala项目

    一.sbt简介 sbt是类似ANT.MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具. 主要特性: 原生支持编译Scala代码和与诸多Scala测试框架 ...

  10. java 面向对象(三十八):反射(二) Class类的理解与获取Class的实例

    1.Class类的理解 1.类的加载过程:程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾).接着我们使用java.exe命令对某个字节码文件进行解释运行.相当于将某个 ...