BZOJ3772: 精神污染
Description
Input
Output
Sample Input
1 2
2 3
3 4
2 5
3 5
2 5
1 4
Sample Output
样例解释
可以选择的路径对有(1,2),(1,3),(2,3),只有路径1完全覆盖路径2。
HINT
考虑一条路径A被另一条路径B包含的条件是:
当x=y时,u和v有一个应在x的子树中,另一个应在x的子树外或等于x。
当x、y构成了祖先关系时,设y为祖先、z为x到y路径上倒数第二个点,则u和v有一个应在x的子树中,另一个不在z的子树中。
当x、y不构成祖先关系时,则u和v有一个应在x的子树中,另一个在y的子树中。
那么一条路径可以变成至多2个矩形和一个点。
扫描线+树状数组计算一下有多少点在矩形中就可以了。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=<<;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=,f=;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-;
for(;isdigit(c);c=Getchar()) x=x*+c-'';
return x*f;
}
typedef long long ll;
const int maxn=;
int n,m,e,first[maxn],next[maxn<<],to[maxn<<];
void AddEdge(int u,int v) {
to[++e]=v;next[e]=first[u];first[u]=e;
to[++e]=u;next[e]=first[v];first[v]=e;
}
int anc[maxn][],dep[maxn],st[maxn],en[maxn],ToT;
void dfs(int x,int fa) {
anc[x][]=fa;rep(i,,) anc[x][i]=anc[anc[x][i-]][i-];
dep[x]=dep[fa]+;st[x]=++ToT;
ren if(to[i]!=fa) dfs(to[i],x);
en[x]=ToT;
}
int swim(int x,int k) {
rep(i,,) if(k>>i&) x=anc[x][i];
return x;
}
struct Rect {
int x,l,r,val;
bool operator < (const Rect& ths) const {return x<ths.x;}
}A[maxn<<];
struct Point {
int x,y;
bool operator < (const Point& ths) const {return x<ths.x||(x==ths.x&&y<ths.y);}
}B[maxn];
int N,M;
void AddRect(int x,int y,int l,int r) {
if(x>y||l>r) return;
if(x<l) swap(x,l),swap(y,r);
A[++N]=(Rect){x,l,r,};A[++N]=(Rect){y+,l,r,-};
}
void AddPoint(int x,int y) {
if(x<y) swap(x,y);
B[++M]=(Point){x,y};
}
int sumv[maxn];
int query(int x) {int res=;for(;x;x-=x&-x) res+=sumv[x];return res;}
void add(int x,int v) {for(;x<=n;x+=x&-x) sumv[x]+=v;}
ll ans;
ll gcd(ll a,ll b) {return !b?a:gcd(b,a%b);}
int main() {
n=read();m=read();
rep(i,,n) AddEdge(read(),read());
dfs(,);
rep(i,,m) {
int u=read(),v=read();AddPoint(st[u],st[v]);
if(dep[u]<dep[v]) swap(u,v);
if(u==v) AddRect(st[u],en[u],,st[u]),AddRect(st[u],en[u],en[u]+,n);
else if(st[u]>=st[v]&&st[u]<=en[v]) {
v=swim(u,dep[u]-dep[v]-);
AddRect(st[u],en[u],,st[v]-);
AddRect(st[u],en[u],en[v]+,n);
}
else AddRect(st[u],en[u],st[v],en[v]);
}
sort(A+,A+N+);sort(B+,B+M+);int j=;
rep(i,,M) {
while(j<=N&&A[j].x<=B[i].x) add(A[j].l,A[j].val),add(A[j].r+,-A[j].val),j++;
ans+=query(B[i].y);
}
rep(i,,M) {
int j=i;
while(j<=M&&B[j].x==B[i].x&&B[j].y==B[i].y) j++;j--;
ans-=(ll)(j-i+)*(j-i)/;
i=j;
}
ans-=m;ll ans2=(ll)m*(m-)/,c=gcd(ans,ans2);
printf("%lld/%lld\n",ans/c,ans2/c);
return ;
}
BZOJ3772: 精神污染的更多相关文章
- BZOJ3772精神污染——可持久化线段树+出栈入栈序
题目描述 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户 ...
- [BZOJ3772]精神污染 主席树上树+欧拉序
3772: 精神污染 Time Limit: 10 Sec Memory Limit: 64 MB Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位 ...
- BZOJ3772 精神污染 【主席树 + dfs序】
题目 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海 ...
- BZOJ3772精神污染&BZOJ3488&luogu3242接水果
LINK1:精神污染 LINK2:[ONTAK2010Highways](http://www.lydsy.com/JudgeOnline/problem.php?id=3488) LINK3:[接水 ...
- BZOJ3772 精神污染 主席树 dfs序
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3772 题意概括 给出一个树,共n个节点. 有m条互不相同的树上路径. 现在让你随机选择2条路径,问 ...
- BZOJ3772精神污染
参见http://blog.csdn.net/popoqqq/article/details/43122821 #include<bits/stdc++.h> using namespac ...
- bzoj3772 精神污染 dfs 序+主席树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3772 题解 很简单的一道题目. 上午研究一个题目的时候发现了这个题目是一个弱化版,所以来写了一 ...
- 【BZOJ3772】精神污染 DFS序+主席树
[BZOJ3772]精神污染 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
- 【bzoj3772】精神污染
Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...
随机推荐
- Javascript样例之文档章节滚动全版(DOM)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABBMAAAC5CAIAAAD1bOCRAAAMEUlEQVR4nO3d4XEbyREGUGRCZQDGcG
- 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树
冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ). 先是打了一下想学好久的替罪羊树. 替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树. 调试小结: 1.删除操作分两类情况:如果某 ...
- 序列GCD和问题(题目)
序列GCD和 题目描述 Massacc有一个序列$A_1,A_2,A_3,\dots ,A_n$. Popbab说:我要知道这个序列的和$\pmod{1\times10^9+7}$. Massacc在 ...
- Linux 之 最常用的20条命令
玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...
- MVC3和MVC4相关问题
从TFS获取的MVC项目生成一直提示这个错误,我的VS中MVC3和MVC4都有,TFS项目中的MVC版本应该是MVC3的,现在我要用这个项目,但是一直是这个错误,请高手指点,积分不多了,见谅 程序集“ ...
- C++ traits
[本文链接] http://www.cnblogs.com/hellogiser/p/cplusplus-traits.html [分析] 什么是traits?其实它并不是一个新的概念,上个世纪90年 ...
- 3.子数组的最大和[MaximumContinuousSubArray]
[题目]: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值,要求时间复杂度为O(n). 例如输入的数组为1, -2, ...
- windows 说“我爱你”
CreateObject("SAPI.SpVoice").Speak "I love YOU" 保存vbs
- MVC准备前基础知识
一.自动属性C#自动属性可以避免原来这样我们手工声明一个私有成员变量以及编写get/set逻辑public class Product{ public int Id { get; set; } pub ...
- ASP.Net和新对象之context.Server
描述 Server是一个HttpServerUtility类型的对象,不是一个类名 1.获取服务器上的绝对路径文件名tring ss = context.Server.MapPath("~/ ...