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 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...
随机推荐
- tar: Removing leading `/’ from member names
tar: Removing leading `/’ from member names+2 分类:Web服务器 标签:tar 3,910人浏览 这并不是一个错误,而是一个警告,原因很简单,就是你在 ...
- makefile中的自动化变量$@,$%,$
转自:http://www.2cto.com/os/201302/191344.html makefile中的自动化变量$@,$%,$ 自动化变量 模式规则中,规则的目标和依赖文件名代表了一 ...
- 在Android上使用fontAwesome
再也不用做那些讨厌的小图标了! 从网上找了些资料,总结下在android上使用fontAwesome的方法. 1.到官网上下载资源包,找到其中的字体文件fontawesome-webfont.ttf, ...
- java获取tomcat路径
获取tomcat路径 String savePath3 = System.getProperty("catalina.home"); E:\apache-tomcat-7.0.63 ...
- 【USACO】calfflac
关键:以回文中心位置为变量进行遍历 //必须把纯字母先提出来 否则肯能会出现错误 比如: lvlv= 在检查长度4时 lvlv认为不是回文 vlv=认为是回文 但实际上 lvl 出现的要更早一些 // ...
- Android之智能问答机器人
本文主要利用图灵机器人的接口,所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView,所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml vers ...
- eclipse 向HDFS中创建文件夹报错 permission denied
环境:win7 eclipse hadoop 1.1.2 当执行创建文件的的时候, 即: String Path = "hdfs://host2:9000"; FileSy ...
- 【Ubuntu日常技巧】VirtualBox多网卡路由配置,保障虚拟机连接上外网
[背景]: 配置Ubuntu 虚拟机双网卡,一个是Host-Only网络,一个是桥接网络.当在虚拟机中同时连接到两个网络后,虚拟机能够ping通内部网络,不能ping通外部网络,如www.baidu. ...
- CI批量更新$this->db->update_batch();
$this->db->update_batch(); 生成一条update命令是以你提供的数据为基础的,并执行查询.你可以传递一个数组或对象的参数给update_batch()函数.下面是 ...
- [译] Web API 之 简介
事实上,MVC 框架本身已经提供了构建REST风格服务的基础,而Web API 只是让你可以更加容易和快捷的构建REST服务. 特性 基于约定的 CRUD Actions: 自动按照HTTP的acto ...