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. Serverless介绍篇(一)云开发在Serverless方面取得了怎样的新成果?

    过去几年间,Serverless 发展迅猛,与其相伴的还有从小程序.移动端等到前后端一体化的演进与实践,也正因如此,从云计算到前端,众多开发者都极为关注.本文介绍了腾讯云CloudBase 的 Ser ...

  2. 数据可视化之DAX篇(三) 认识DAX中的表函数和值函数

    https://zhuanlan.zhihu.com/p/64421003 学习 DAX 的过程中,会遇到各种坑,刚开始甚至无法写出一个正确的度量值,总是提示错误.其实很多原因都是不理解 DAX 函数 ...

  3. 数据可视化之DAX篇(十五)Power BI按表筛选的思路

    https://zhuanlan.zhihu.com/p/121773967 ​数据分析就是筛选.分组.聚合的过程,关于筛选,可以按一个维度来筛选,也可以按多个维度筛选,还有种常见的方式是,利用几个特 ...

  4. hihoCoder 1051 补提交卡 最详细的解题报告

    题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数 ...

  5. shaderlab - 9chapter-阴影

    原理 相机和光源重合,相机能看到的表面,形成的深度图--叫做,阴影纹理(shadowMap). 传统的,用base和add更新深度信息,但是,此处需求是深度信息而已,掺杂了光的计算了,所以,unity ...

  6. day2:Number,tuple,str,list,set,dict

    # ### Number ( int float bool complex) 1.int 整型 (正整数 0 负整数)intvar = 1print(intvar) # type 获取值的类型res ...

  7. 二、Python系列——time时间格式的转换及计算

    # -*- coding:utf-8 -*- import pandas as pd import time import datetime start_date = '2020-06-08' # 一 ...

  8. Appium+Python3环境搭建,其实超简单!【软件测试教程】

    appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python.略懂Python,所以接下来的教程是appium+python, ...

  9. 使用Python来写mock代码(桩代码)-其实很简单

    1.Mock基本用法 使用Mock能创建你能访问(模拟)的属性和方法 指定类或者函数的返回值和断言方式 创建handle_mock_01.py文件 # 1. 导入mock模块 from unittes ...

  10. 在ShareX里添加流浪图床

    这里以咱流浪图床为例哈:-D 上传目标类型:图像.文件 请求方法:POST 请求URL:https://p.sda1.dev/api/v1/upload_external_noform URL参数:名 ...