BZOJ3772精神污染

题面:权限题,去网上找题面吧。

解析

有两种思考方式:1.考虑每条路径分别被多少条路径覆盖。2.考虑每条路径分别覆盖了多少条路径。两种都简单的说一下吧。
1.可以发现覆盖路径(a,b)的路径两端必然在以a为根的子树和以b为根的子树即dfs序上连续的一段,否则也可以转化为两端。这样就可以用主席树,分别对每一条路径,在ai对应的线段树中插入bi,然后就在a这一端的线段树上,区间查询b那一端对应的范围有多少个点,再反过来做一次,就得到了答案。这是我口胡的,可能有误,因为博主用的是思路2。
2.还是像1那样做用主席树,分别对每一条路径,在ai对应的线段树中插入bi,但我们这次统计的是a到b路径上分别对应了多少个节点,我们用dfs入栈出栈序,入栈+1,出栈-1,这样对每一颗线段树,它所统计的范围就是根节点到它自己这条链上的节点个数,那我们就可以用lca,答案就是f(a)+f(b)-f(lca)-f(fa_lca),注意答案要减去1(因为统计了自己)。

代码

博主太菜了,写代码时并没有用上面的思路,复杂度要多一个log。


#include<cstdio>
#include<vector>
#include<iostream>
#define N 100005
#define mid ((l+r)>>1)
#define LL long long
using namespace std;
const int __=3e6;
inline int In(){char c=getchar(); int x=0,ft=1;for(;c<'0'||c>'9';c=getchar()) if(c=='-') ft=-1;for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';return x*ft;
}
inline LL gcd(LL a,LL b){return (b==0)?a:gcd(b,a%b);
}
int n,m,s[N],t[N],h[N],e_tot=0;
LL ans=0,qou;
struct E{ int to,nex; }e[N<<1];
inline void add(int u,int v){e[++e_tot]=(E){v,h[u]}; h[u]=e_tot;
}
int d[N],fa[N],sz[N],son[N],top[N];
void dfs1(int u,int pre,int dep){d[u]=dep; fa[u]=pre; sz[u]=1;for(int i=h[u],v;i;i=e[i].nex){v=e[i].to; if(v==fa[u]) continue;dfs1(v,u,dep+1); sz[u]+=sz[v];if(!son[u]||sz[son[u]]<sz[v]) son[u]=v;}
}
int dfn[N],dfs_clock=0;
void dfs2(int u,int pre){top[u]=pre; dfn[u]=++dfs_clock;if(son[u]) dfs2(son[u],pre);for(int i=h[u],v;i;i=e[i].nex){v=e[i].to; if(v!=son[u]&&v!=fa[u]) dfs2(v,v);}
}
inline int LCA(int x,int y){while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);x=fa[top[x]];}return d[x]>d[y]?y:x;
}
int rt[N],T_tot=0;
int c[__][2],sum[__];
inline int newnode(int u){++T_tot;sum[T_tot]=sum[u];c[T_tot][0]=c[u][0];c[T_tot][1]=c[u][1];return T_tot;
}
void Add(int G,int l,int r,int v,int& u){if(u==v) u=newnode(v); ++sum[u];if(l==r) return;if(G<=mid) Add(G,l,mid,c[v][0],c[u][0]);else Add(G,mid+1,r,c[v][1],c[u][1]);
}
vector<int> G[N];
void dfs(int u,int pre){rt[u]=rt[pre];for(int i=0;i<G[u].size();++i)Add(dfn[G[u][i]],1,n,rt[pre],rt[u]);for(int i=h[u],v;i;i=e[i].nex){v=e[i].to; if(v!=fa[u]) dfs(v,u);}
}
int Query(int L,int R,int l,int r,int w,int x,int y,int z){if(L<=l&&r<=R) return sum[y]+sum[z]-sum[w]-sum[x];if(R<=mid) return Query(L,R,l,mid,c[w][0],c[x][0],c[y][0],c[z][0]);if(L>mid) return Query(L,R,mid+1,r,c[w][1],c[x][1],c[y][1],c[z][1]);return Query(L,R,l,mid,c[w][0],c[x][0],c[y][0],c[z][0])+Query(L,R,mid+1,r,c[w][1],c[x][1],c[y][1],c[z][1]);
}
inline int Query(int x,int y){int lca=LCA(x,y),u=x,v=y,res=0;while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);res+=Query(dfn[top[x]],dfn[x],1,n,rt[lca],rt[fa[lca]],rt[u],rt[v]);x=fa[top[x]];}if(d[x]<d[y]) swap(x,y);res+=Query(dfn[y],dfn[x],1,n,rt[lca],rt[fa[lca]],rt[u],rt[v]);return res;
}
int main(){n=In(); m=In(); qou=1ll*m*(m-1)/2;for(int i=1,u,v;i<n;++i){u=In(); v=In();add(u,v); add(v,u);}for(int i=1;i<=m;++i){s[i]=In(); t[i]=In();G[s[i]].push_back(t[i]);}dfs1(1,0,0); dfs2(1,1); dfs(1,0);for(int i=1;i<=m;++i) ans+=Query(s[i],t[i]);ans-=m; LL d=gcd(ans,qou); ans/=d; qou/=d;printf("%lld/%lld\n",ans,qou);return 0;
}

转载于:https://www.cnblogs.com/pkh68/p/10554972.html

BZOJ3772精神污染相关推荐

  1. [BZOJ3772]精神污染

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

  2. 【BZOJ3772】精神污染

    题解: 刚开始把题目看错了 以为没有给出路径 那我们就可以求极长路径为k的分别有多少条 可以上点分治+fft 是nlogn^2的 因为fft的范围和点分治后剩余的节点多少有关 正确的题目意思的话 我们 ...

  3. 主角有智能芯片的种田小说_推荐3本克苏鲁类小说,压抑邪恶与搞笑逗乐并存,看看是你的菜吗...

    有句老话说的真是太对了,人就是越呆越懒越吃越馋,本来只是单纯的找书断了一天更,结果就越来越懒了. <古神的自我修养> 作者 敖夜 状态 连载中 字数 144万字左右 克苏鲁.种田文.幕后黑 ...

  4. 深度有趣 | 22 天马行空的DeepDream

    2019独角兽企业重金招聘Python工程师标准>>> 简介 介绍DeepDream的原理并用TensorFlow实现 效果 先来看一下DeepDream的效果,本来是这样一张图片 ...

  5. 西南民大oj(矩阵快速幂)

    我的名字不可能那么难记 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 16            测试通过 ...

  6. 《地狱之刃:塞娜的献祭》如何通过人物情感营造恐怖氛围?

    市面上多数恐怖游戏传达惊悚氛围的方式都大同小异,或暴力,或血腥,或突袭惊吓,或精神污染.但有那么一部分恐怖游戏,它们着重于刻画人物内心那不可名状的恐惧阴影,深入探索他们荒诞的精神世界,通过另一种视角去 ...

  7. [BZOJ5303] [HAOI2018] 反色游戏

    题目链接 LOJ:https://loj.ac/problem/2524 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5303 洛谷:https ...

  8. 【UOJ574】多线程计算【二元二项式反演】【定积分】【矩阵】【NTT 卷积】

    题意:有 n×mn\times mn×m 的网格,每个结点在 [0,1)[0,1)[0,1) 内的一个随机时刻被点亮.有 hhh 个数对 xi,yix_i,y_ixi​,yi​,对于一个瞬间状态,如果 ...

  9. 【HNOI2016】序列【莫队】【单调栈】【ST表】

    题意:给定序列 aia_iai​,qqq 次询问 [l,r][l,r][l,r] 所有子区间最小值之和. n,q≤105n,q\leq 10^5n,q≤105 这种题一眼看上去是离线线段树,但这题每移 ...

  10. 【SCOI2014】方伯伯的商场之旅【数位dp】【单峰函数】

    题意:给定 l,r,kl,r,kl,r,k ,对于一个 kkk 进制数,将数码看成这个位置的石子个数,每将一个石子移动 111 的距离需要 111 的代价.求 [l,r][l,r][l,r] 中的所有 ...

最新文章

  1. 【面试】足够应付面试的Spring事务源码阅读梳理(建议珍藏)
  2. python大神教程_大神python教程415集全套,拿走不谢
  3. Jquery绑定事件(bind和live的区别)[转]
  4. 可以通过shadowserver来查看开放的mdns(用以反射放大攻击)——中国的在 https://mdns.shadowserver.org/workstation/index.html...
  5. wordpress 独立 php,wordpress怎么把所有文章分类单独在一个页面显示
  6. linux脚本的数据输出到excel,使用shell实现Excel表格导出功能 | 剑花烟雨江南
  7. 佳能2900打印机与win10不兼容_佳能mg3660 3680 系列喷墨打印机更换搓纸轮解决不进纸教程...
  8. binutils工具集之---ar
  9. Spring Security在标准登录表单中添加一个额外的字段
  10. 《大数据》第一届编委会顾问委员会议圆满召开
  11. 阶乘数码(洛谷P1591题题解,Java语言描述)
  12. 计算机2级c 语言题库,计算机2级C语言题库.doc
  13. wifi抓包/苹果电脑mac book抓wifi sniffer packet
  14. 操作系统学习笔记:大容量存储器的结构
  15. 电脑围棋领域的研究概述
  16. 大地高、正高和正常高
  17. java取北京时间_在java中怎么获取北京时间
  18. 银行卡Bin和Logo
  19. COOC+VOSviewer可取代任何文献计量与知识图谱软件
  20. 前端html网页,点击按钮或超链接 弹出 一个登陆的div窗口或者对话框

热门文章

  1. 张飞实战电子硬件工程师90天学习资料及笔记汇总
  2. 根据个人情况以及Java程序员面试宝典总结的需要复习的知识点
  3. 一篇网络流的好blog
  4. 修马达的php源码,无刷电机控制基本原理(示例代码)
  5. fflush()函数
  6. 今天一篇文章告诉你Python 自动化测试 必会模块 Unittest
  7. java deflate_JAVA中的deflate压缩实现方法
  8. mysql启动报错之[ERROR] Found option without preceding group in config file /etc/my.cnf at line
  9. 【GDB】__stack_chk_fail 栈溢出问题定位
  10. 注册登录页面模板 农业集团 金星农业