JZOJ5146:港湾
Description
小林和康娜来到了港口,看到有货船正在卸货。
港口十分狭窄,只有两个卸货区可以使用。每个卸货区上面可以堆积任意多个箱子。
每卸下来一个箱子,工作人员都会把这个箱子放在某个卸货区的顶端。之后,当车辆来运走这个箱子的时候,也必须保证这个箱子在某个卸货区的顶端。
港口今天一共运来了N个箱子,第i个箱子在时刻Ai被卸货,在时刻Bi被取走。康娜发现,每个箱子被取走时,都恰好位于所在卸货区的顶端。
康娜觉得很有意思,她想要知道,有多少种卸货方案,使得每个箱子在被取走时都位于所在卸货区的顶端呢?
两种方案不同,当且仅当存在一个箱子,使得在两个方案中这个箱子被放在了不同的卸货区。
Input
第一行一个正整数N,表示箱子的数量。
接下来N行,每行两个空格分割的正整数Ai和Bi,表示第i个箱子在时刻Ai被卸货,在时刻Bi被取走。
Output
输出一行一个非负整数,表示合法的卸货方案。由于这个数字可能过大,你只需要输出方案数对1,000,000,007的模数即可。
Sample Input
4
1 3
2 5
4 8
6 7
Sample Output
HINT
对于30%的数据,N<=2000
对于100%的数据,
1<=N<=10^5
1<=Ai<Bi<=2N
A1,A2,...,AN,B1,B2,...,BN构成1...2N的一个排列。
#include<bits/stdc++.h>
using namespace std;
vector <int> v[];
int t[][],n,fa[][],bo[][],cnt,nn,tot,now;
pair <int,int> a[],b[];
void build(int l,int r,int fa)
{
cnt++; int x=cnt; t[x][]=l; t[x][]=r;
if(t[x][]==t[fa][])t[fa][]=x;else t[fa][]=x;
if(l==r)return;
build(l,(l+r)/,x); build((l+r)/+,r,x);
}
int get2(int x);
int get1(int x)
{
if(fa[x][]!=x){ int a=fa[x][]; fa[x][]=get1(a); fa[x][]^=get2(a); }
return fa[x][];
}
int get2(int x)
{
if(fa[x][]!=x){ int a=fa[x][]; fa[x][]=get1(a); fa[x][]^=get2(a); }
return fa[x][];
}
void ss(int x,int l,int r)
{
if(l>r)return;
int ll=t[x][],rr=t[x][]; int mid=(ll+rr)/;
if((ll==l)and(rr==r))
{
int mm=v[x].size();
for(int i=;i<mm;i++)
{
int aa=get1(v[x][i]),bb=get2(v[x][i]); int xxx=v[x][i];
if(bo[aa][bb]==){ bo[aa][bb]=; nn++; b[nn]=make_pair(aa,bb); }
}
return;
}
if(r<=mid)ss(t[x][],l,r);else
if(l>mid)ss(t[x][],l,r);else
{ ss(t[x][],l,mid); ss(t[x][],mid+,r); }
}
void ss2(int x,int l,int r)
{
if(l>r)return;
int ll=t[x][],rr=t[x][]; int mid=(ll+rr)/;
if((ll==l)and(rr==r))
{
int mm=v[x].size(),q[]; q[]=; q[]=;
for(int i=;i<mm;i++)
{
int bb=get2(v[x][i]);
if(q[bb]==)q[bb]=v[x][i];
}
v[x].clear();
if(q[]>)v[x].push_back(q[]);
if(q[]>)v[x].push_back(q[]);
return;
}
if(r<=mid)ss2(t[x][],l,r);else
if(l>mid)ss2(t[x][],l,r);else
{ ss2(t[x][],l,mid); ss2(t[x][],mid+,r); }
}
void ss3(int x,int l,int y)
{
int ll=t[x][],rr=t[x][]; int mid=(ll+rr)/;
v[x].push_back(y); if(ll==rr)return;
if(l<=mid)ss3(t[x][],l,y);
if(l>mid)ss3(t[x][],l,y);
}
void hb(int x,int y,int z)
{
int a=get1(x); if(a==y)return;
fa[a][]=y; fa[a][]^=z; tot--;
}
int main()
{
freopen("port.in","r",stdin);
freopen("port.out","w",stdout);
scanf("%d",&n); tot=n;
for(int i=;i<=n;i++)scanf("%d%d",&a[i].first,&a[i].second),fa[i][]=i;
sort(a+,a+n+); build(,*n,);
for(int i=;i<=n;i++)
{
nn=; now=i;
ss(,a[i].first+,a[i].second-);
sort(b+,b+nn+);
for(int j=;j<=nn;j++)
{
if((j>)and(b[j].first==b[j-].first)){ printf("0\n"); return ; }
hb(b[j].first,i,b[j].second^); bo[b[j].first][b[j].second]=;
}
ss2(,a[i].first+,a[i].second-);
ss3(,a[i].second,i);
}
long long ans=;
for(int i=;i<=tot;i++)ans=(ans*)%;
printf("%lld\n",ans);
}
JZOJ5146:港湾的更多相关文章
- 网络基础 港湾FlexHammer5010交换机镜像端口配置
港湾FlexHammer5010交换机镜像端口配置 by:授客 QQ:1033553122 1.登陆港湾交换机FlexHammer5010交换机 方法: telent 交换机ip 输入用户名 输入用户 ...
- AT2534 港湾設備 (Port Facility)
洛谷 先膜一下Iscream巨巨 首先我们可以把题目转化为线段覆盖,如果两条线段相交(不算某一条完全在另一条里面的情况),那么这两条线段代表的集装箱就不能放到同一个栈里,我们在它们之间连一条边.如果图 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- “风投云涌”:那些被资本看中的IT企业的风光与辛酸
进入七月份以来,纷享销客获得D轮融资1亿美元,撼动业界,资本与IT联姻令一部分创业者眼红的同时,没有人注意到背后的风险. 科技与资本的结合,是当今经济社会前行的宏大主题.相关统计显示,软件行 ...
- 优化MySchool数据库设计之【巅峰对决】
优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...
- 微冷的雨Java基础学习手记(一)
使用Java理解程序逻辑 之凌波微步 船舶停靠在港湾是很安全的,但这不是造船的目的 北大青鸟五道口原玉明老师出品 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要 ...
- 微冷的雨ASP.NET MVC之葵花宝典(MVC)
微冷的雨ASP.NET MVC之葵花宝典 By:微冷的雨 第一章 ASP.NET MVC的请求和处理机制. 在MVC中: 01.所有的请求都要归结到控制器(Controller)上. 02.约定优于配 ...
- css样式加载顺序及覆盖顺序深入理解
注:内容转载 很多的新手朋友们对css样式加载顺序和覆盖顺序的理解有所偏差,下面用示例为大家详细的介绍下,感兴趣的朋友不要错过 { height: 100%; width: 200; position ...
- IP地址数据库-ISP运营商列表(2017年1月)
IP地址数据库 微信号:qqzeng-ip [全球旗舰版][国内精华版][国外拓展版][英文版][掩码版] http://qqzeng.com 中国大陆:三大基础运营商 中国电信中国联通中国 ...
随机推荐
- vue 表单输入绑定 checkbox
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- spring boot 四大组件之Actuator
执行器(Actuator)的定义 执行器是一个制造业术语,指的是用于移动或控制东西的一个机械装置,一个很小的改变就能让执行器产生大量的运动.An actuator is a manufacturing ...
- NOIP2019模拟2019.9.20】膜拜大会(外向树容斥,分类讨论)
传送门. 题解: 我果然是不擅长分类讨论,心态被搞崩了. 注意到\(m<=n-2\),意味着除了1以外的位置不可能被加到a[1]两遍. 先考虑个大概: 考虑若存在\(x,x-1,-,2\)(有序 ...
- XCode文件状态为 ? 解决办法(git)
XCode文件状态为 ?,意思为不识别的文件类型. 解决办法:
- python bs4解析网页时 bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to inst(转)
Python小白,学习时候用到bs4解析网站,报错 bs4.FeatureNotFound: Couldn't find a tree builder with the features you re ...
- tomcat源码分析一之getCanonicalFile和getAbsolutePath的区别
最近在看tomcat源码 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理“.”和“..”的情况 ...
- (转)OpenFire源码学习之十二:HttpBind&Script Syntax
转:http://blog.csdn.net/huwenfeng_2011/article/details/43417343 HttpSessionManager 该类管理所有通过httpbing连接 ...
- (转)OpenFire源码学习之九:OF的缓存机制
转:http://blog.csdn.net/huwenfeng_2011/article/details/43415023 关于缓存,openfire存储到了本地JVM中.本人认为这样并不是很好.以 ...
- 深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么)
深入理解PHP原理之Opcodes(PHP执行代码会经过的4个步骤是什么) 一.总结 一句话总结: 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) 2.Parsin ...
- sublime 文件无法拖放
sublime 文件无法拖放解决方法 https://github.com/emetio/pyv8-binaries 解决: 1. 去gihub下载 PyV8,连接地址:https://github. ...