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 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区, ...
随机推荐
- CentOS 关闭蜂鸣器声音
也许你会遇到像我这样的情况,每次使用Linux终端,当听到发出“嘀嘀”的声音时候,我都有种把我的机箱拆掉把那个内置的蜂鸣装置拽下来的冲动.按 Tab时候“嘀嘀”,按空格时候“嘀嘀”,每个在vi中错误的 ...
- 【云计算】开源的Docker Registry WebUI
kwk/docker-registry-frontend Code Issues 9 Pull requests 6 Wiki ...
- 【转】Spring Quartz的原理
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便. 一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job 表示 ...
- HDU1003MAX SUM
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- MySQL 查询最大最小值优化
1. 假设你使用了Innodb存储引擎2. 假设你在innodb设定了主键(聚集索引) 3. 因为聚集索引页面之间是通过双向链表链接,页按照主键的顺序排序 每个页中的记录也是通过双向链表维护.聚集索引 ...
- javascript十六进制数字和ASCII字符之间转换
var hex="0x29";//十六进制 var charValue = String.fromCharCode(hex);//生成Unicode字符 var charCode ...
- jquery easy ui 1.3.4 内容组件(2)
2.1.panel(面板) panel面板是easyui里面非常基础的一个内容组件,在我们后期学的tabs (选项卡).accordion(手风琴)这两种内容组件都依赖于panel组件.构建一个pan ...
- rabbitMq使用(mac平台)
1.下载 wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.3/rabbitmq-server-mac-standalone-3.5 ...
- WPF控件委托
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate { //要执行的代码 });
- hdu 1166 线段树单点更新
等线段树复习完再做个总结 1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Case 1:633 ...