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

4

HINT

对于10%的数据,N<=20
对于30%的数据,N<=2000
对于100%的数据,
1<=N<=10^5
1<=Ai<Bi<=2N
A1,A2,...,AN,B1,B2,...,BN构成1...2N的一个排列。
题解:
如果两个物品i,j不能放在一个卸货区上(即 a[i]<a[j]<b[i]<b[j] or a[j]<a[i]<b[j]<b[i]),则记为i与j冲突,在i与j之间连一条边。
这样建出了一个无向图,若其能二分图染色,则存在方案,为2^(连通块个数)。
如果暴力建图,则复杂度为O(n^2),不可行。
考虑用带权并查集,每个点支持查询祖先以及其与祖先染色是否相同,就可以维护连通块了。
现在的问题是如何去掉重复意义的边。
我们可以用线段树套vector来维护右端点在[l,r]之间的物品。这些物品代表的是其所属的并查集以及其在并查集中的染色。若某个vector中的两个物品代表的意义相同,则可以只留一个。
我们把物品按照左端点排序,按顺序插入线段树,则前i-1个物品中,右端点在[a[i]+1,b[i]-1]的物品都与物品i冲突。
这些物品可以在线段树区间[a[i]+1,b[i]-1]中查询得到。我们把这些物品以及物品i所代表的并查集合在一起。
若有两个物品代表的并查集相同,但是染色不同,则发生冲突,不可二分图染色,输出0。
然后,我们清空区间[a[i]+1,b[i]-1]所用到的线段树节点的vector(这些物品现在都代表同一个并查集),根据清空前其中的物品代表的染色,最多重新放入两个。
最后,我们在包含b[i]的线段树节点的vector中放入物品i。
最后,输出ans=2^(并查集个数)。
代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 vector <int> v[400005];
 4 int t[400005][4],n,fa[200005][2],bo[100005][2],cnt,nn,tot,now;
 5 pair <int,int> a[100005],b[200005];
 6 void build(int l,int r,int fa)
 7 {
 8     cnt++; int x=cnt; t[x][0]=l; t[x][1]=r;
 9     if(t[x][0]==t[fa][0])t[fa][2]=x;else t[fa][3]=x;
10     if(l==r)return;
11     build(l,(l+r)/2,x); build((l+r)/2+1,r,x);
12 }
13 int get2(int x);
14 int get1(int x)
15 {
16     if(fa[x][0]!=x){ int a=fa[x][0]; fa[x][0]=get1(a); fa[x][1]^=get2(a); }
17     return fa[x][0];
18 }
19 int get2(int x)
20 {
21     if(fa[x][0]!=x){ int a=fa[x][0]; fa[x][0]=get1(a); fa[x][1]^=get2(a); }
22     return fa[x][1];
23 }
24 void ss(int x,int l,int r)
25 {
26     if(l>r)return;
27     int ll=t[x][0],rr=t[x][1]; int mid=(ll+rr)/2;
28     if((ll==l)and(rr==r))
29     {
30         int mm=v[x].size();
31         for(int i=0;i<mm;i++)
32         {
33             int aa=get1(v[x][i]),bb=get2(v[x][i]); int xxx=v[x][i];
34             if(bo[aa][bb]==0){ bo[aa][bb]=1; nn++; b[nn]=make_pair(aa,bb); }
35         }
36         return;
37     }
38     if(r<=mid)ss(t[x][2],l,r);else
39     if(l>mid)ss(t[x][3],l,r);else
40     { ss(t[x][2],l,mid); ss(t[x][3],mid+1,r); }
41 }
42 void ss2(int x,int l,int r)
43 {
44     if(l>r)return;
45     int ll=t[x][0],rr=t[x][1]; int mid=(ll+rr)/2;
46     if((ll==l)and(rr==r))
47     {
48         int mm=v[x].size(),q[2]; q[0]=0; q[1]=0;
49         for(int i=0;i<mm;i++)
50         {
51             int bb=get2(v[x][i]);
52             if(q[bb]==0)q[bb]=v[x][i];
53         }
54         v[x].clear();
55         if(q[0]>0)v[x].push_back(q[0]);
56         if(q[1]>0)v[x].push_back(q[1]);
57         return;
58     }
59     if(r<=mid)ss2(t[x][2],l,r);else
60     if(l>mid)ss2(t[x][3],l,r);else
61     { ss2(t[x][2],l,mid); ss2(t[x][3],mid+1,r); }
62 }
63 void ss3(int x,int l,int y)
64 {
65     int ll=t[x][0],rr=t[x][1]; int mid=(ll+rr)/2;
66     v[x].push_back(y); if(ll==rr)return;
67     if(l<=mid)ss3(t[x][2],l,y);
68     if(l>mid)ss3(t[x][3],l,y);
69 }
70 void hb(int x,int y,int z)
71 {
72     int a=get1(x); if(a==y)return;
73     fa[a][0]=y; fa[a][1]^=z; tot--;
74 }
75 int main()
76 {
77     freopen("port.in","r",stdin);
78     freopen("port.out","w",stdout);
79     scanf("%d",&n); tot=n;
80     for(int i=1;i<=n;i++)scanf("%d%d",&a[i].first,&a[i].second),fa[i][0]=i;
81     sort(a+1,a+n+1); build(1,2*n,0);
82     for(int i=1;i<=n;i++)
83     {
84         nn=0; now=i;
85         ss(1,a[i].first+1,a[i].second-1);
86         sort(b+1,b+nn+1);
87         for(int j=1;j<=nn;j++)
88         {
89             if((j>1)and(b[j].first==b[j-1].first)){ printf("0\n"); return 0; }
90             hb(b[j].first,i,b[j].second^1); bo[b[j].first][b[j].second]=0;
91         }
92         ss2(1,a[i].first+1,a[i].second-1);
93         ss3(1,a[i].second,i);
94     }
95     long long ans=1;
96     for(int i=1;i<=tot;i++)ans=(ans*2)%1000000007;
97     printf("%lld\n",ans);
98 }

View Code

转载于:https://www.cnblogs.com/GhostReach/p/7015761.html

JZOJ5146:港湾相关推荐

  1. 港湾命令行 配管理IP

    港湾命令行提供两种模式:一种是只读模式,另一种是配置模式. telnet<A.B.C.D>(远程登录) hostname<hostname>(设置系统的网络名称) enable ...

  2. 有BRT,为啥还建公交港湾

    原来快速公交和普通公交要一块儿跑历山路 公交港湾示意图(制图:赵国陆) "历山路上既然跑快速公交车,有BRT站台,还要公交港湾干吗?"21日,本报报道了新公交港湾将在历山路亮相的消 ...

  3. 华为收购港湾核心业务 6年恩怨尘埃落定

    华为收购港湾核心业务 6年恩怨尘埃落定 6月6日下午15时,搜狐IT从华为和港湾方面获悉,华为.港湾已经就港湾网络转让部分资产.业务及部分人员给华为达成意向协议书并签署MOU(谅解备忘录).根据MOU ...

  4. oracle无法减小列长度,中国港湾扩展表单分配时调整字段后保存时报错,无法正常维护表单定义...

    版本号: 7.0.4 业务场景(如下):中国港湾扩展表单分配时调整字段后保存时报错,无法正常维护表单定义 异常提示: 异常信息:添加业务实体的时候出错. 导致错误的应用程序或对象的名称:Generso ...

  5. 幸福的港湾—1040出局证的真伪

    对于对异地连锁经营行业的认识来说,首先让人想到的应该是"幸福的港湾"这部纪录片.然而其内容展现的模式是不是传销推荐阅读幸福的港湾是传销吗,在这里笔者就不在重复讲述.今天谈论的是关于 ...

  6. 港湾公园 Haven Park for Mac(好玩的探索建造冒险游戏)

    今天带来一款好玩的探索建造冒险游戏! Haven Park [港湾公园]是一款Mac上好玩的探索建造冒险游戏,化身弗林特,竭尽全力让奶奶的公园维持正常运转,使其成为露营者享受欢乐时光的好地方.了解露营 ...

  7. 李一男/任正非,港湾/华为

    一家高科技创业新星的抛物线.李一男为何未能重复牛根生的成功? 他是一个从华为高调出走的叛逆天才,他在创业伊始就获得了国际上最具实力的风险资本的鼎力支持,他曾经不顾一切向老东家 挖角开战并因此遭到了更猛 ...

  8. 任正非非常理出牌:港湾、3COM、Juniper三角戏

    任正非非常理出牌:港湾.3COM.Juniper三角戏 经历了五年的江湖纷争,港湾网络又回到了当年"出走"的母体华为. 故事即将以出入意料的结果收场:6月6日,华为公开发布一份简明 ...

  9. 任正非回忆华为港湾“战争与和平”

    任正非回忆华为港湾"战争与和平" 6月7日,一份谈话记录出现在华为公司的电子公告栏上.这份2200字的谈话记录更像是一封公开信,一封给港湾网络员工的公开信. "我代表华为 ...

最新文章

  1. 玩转运维编排服务的权限:Assume Role+Pass Role
  2. strtotime 获取一个月的开始 或者一个月的结束
  3. 计算机二级office函数日期,Excel函数-日期和文本函数-计算机二级Office
  4. pytorch dataset
  5. Linux 之CentOS7-VSFTP搭建
  6. 根据关键词获取多平台的商品列表接口解析
  7. qt使用QZxing生成二维码
  8. 偏光太阳镜测试图片软件,[专题]真假偏光太阳镜简单、实用辨别方法!
  9. Python 树表查找_千树万树梨花开,忽如一夜春风来(二叉排序树、平衡二叉树)
  10. 界面设计基础之基本窗口
  11. Android Room 数据库最佳入门教程
  12. emmx文件用什么软件打开电脑_我告诉你emmx文件怎么打开
  13. 工业级氯化锂2022年全球行业分析报告
  14. Push rejected Push to origin/master was rejected
  15. Sed 流文本编辑器
  16. 微信气泡主题设置_微信主题! 米老鼠微信主题气泡设置教程方法
  17. Centos7.5- Linux网络管理技术
  18. 微信公众号模板消息申请开通流程
  19. 摩托车E 绕桩技巧 半坡起步技巧 过单边桥技巧
  20. 三层架构之我见 —— 不同于您见过的三层架构。 -阳光男孩 - 京华志

热门文章

  1. 洛谷P1080 国王游戏
  2. [转]Windows Shell编程 第十五章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988016】...
  3. jsp中el表达式创建一个list
  4. js动态添加的元素,动作绑定
  5. 并发库之CountDownLatch
  6. (44)生成时钟场景
  7. (64)Verilog HDL多模块重复例化
  8. (10)System Verilog 关联数组
  9. (10)verilog语言编写SPI发送
  10. oracle+技术面试,Oracle面试问题 技术篇