Description

小M有两个本质不同的栈。

无聊的小M找来了n个玩具。之后小M把这n个玩具随机顺序加入某一个栈或把他们弹出。

现在小M告诉你每个玩具的入栈和出栈时间,现在她想考考小S,有多少种方案,把每个玩具分配给两个栈之一,并且存在一种满足小M告诉你的入栈和出栈时间的入栈序列。

可怜的小S当然不知道啦,所以他求助于你。

Solution

考虑把存在矛盾的玩具连边,设 \(k\) 是最后的连通块数,如果这个图是二分图,那么答案就是 \(2^{k}\)

这样连边是 \(O(n^2)\) 的,考虑优化连边

按找 \(l\) 排序之后,前面访问过的区间的 \(r\) 丢入一个 \(set\) 里面,那么与这个区间相交的区间是 \(set\) 中的一个区间

我们要把这个区间内的边都向这个点连边,我们加一个优化:

我们把区间内的点向两边的点连 \(0\) 边

区间的两个端点向这个区间连 \(1\) 边

如果一个点被两边都连了 \(0\) 边,那么可以把这个点删去

最后二分图染色一下,顺便算一下连通块个数就好了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template<class T>void gi(T &x){
  4. int f;char c;
  5. for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
  6. for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
  7. }
  8. const int N=2e5+10,mod=1e9+7;
  9. struct data{
  10. int l,r;
  11. inline bool operator <(const data &p)const{return l<p.l;}
  12. }e[N];
  13. set<int>S,V;
  14. set<int>::iterator it,st[N];
  15. int n,L[N],R[N],head[N],nxt[N*4],to[N*4],num=0,dis[N*4],b[N],top=0,vis[N];
  16. inline void link(int x,int y,int z){
  17. x=b[x];y=b[y];
  18. nxt[++num]=head[x];to[num]=y;head[x]=num;dis[num]=z;
  19. nxt[++num]=head[y];to[num]=x;head[y]=num;dis[num]=z;
  20. }
  21. inline void dfs(int x){
  22. for(int i=head[x];i;i=nxt[i]){
  23. int u=to[i];
  24. if(vis[u]){
  25. if(vis[u]!=(vis[x]^dis[i]))puts("0"),exit(0);
  26. continue;
  27. }
  28. else vis[u]=vis[x]^dis[i],dfs(u);
  29. }
  30. }
  31. int main(){
  32. freopen("port.in","r",stdin);
  33. freopen("port.out","w",stdout);
  34. cin>>n;
  35. for(int i=1;i<=n;i++)gi(e[i].l),gi(e[i].r),b[e[i].r]=i;
  36. sort(e+1,e+n+1);
  37. S.insert(mod);S.insert(-mod);
  38. V.insert(mod);V.insert(-mod);
  39. for(int i=1;i<=n;i++){
  40. int x=e[i].l,y=e[i].r;
  41. it=S.upper_bound(y);
  42. R[y]=*it;L[y]=*(--it);
  43. if(*it>x)link(y,*it,3);
  44. for(it=--V.upper_bound(y);*it>x;--it){
  45. if(L[*it]>x)link(*it,L[*it],0),L[*it]=-mod;
  46. if(R[*it]<y)link(*it,R[*it],0),R[*it]=mod;
  47. if(L[*it]==-mod && R[*it]==mod)st[++top]=it;
  48. }
  49. while(top)V.erase(st[top--]);
  50. S.insert(y);V.insert(y);
  51. }
  52. int ans=1;
  53. for(int i=1;i<=n;i++)
  54. if(!vis[i])vis[i]=1,dfs(i),ans=ans*2%mod;
  55. cout<<ans<<endl;
  56. return 0;
  57. }

UOJ #356. 【JOI2017春季合宿】Port Facility的更多相关文章

  1. UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】

    题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...

  2. [JOI2017春季合宿]Port Facility[set、二分图]

    题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...

  3. 【JOI2017春季合宿】Port Facility

    http://uoj.ac/problem/356 题解 思路和\(NOIP\)双栈排序差不多. 对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连 ...

  4. UOJ356 【JOI2017春季合宿】Port Facility

    暴力就是O(n^2)连边,二分图,这样只有22分. 我们考虑优化建边,我们按照左端点排序,对于一个新加进来的线段,我们向左端点距其最近的和他相交的线段连边,别的相交的我们连同色边,当一个点连了两条同色 ...

  5. UOJ #357. 【JOI2017春季合宿】Sparklers

    Description 小S和小M去看花火大会. 一共有 n 个人按顺序排成一排,每个人手上有一个仅能被点燃一次的烟花.最开始时第 K 个人手上的烟花是点燃的. 烟花最多能燃烧 T 时间.每当两个人的 ...

  6. JOI2017 春季合宿:Railway Trip

    自己的AC做法似乎离正解偏了十万八千里而且复杂了不少--不管怎样还是记录下来吧. 题意: 题目链接: JOISC2017 F - AtCoder JOISC2017 F - LOJ \(N\)个车站排 ...

  7. BZOJ 4388 [JOI2012春季合宿]Invitation (线段树、二叉堆、最小生成树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4388 题解 模拟Prim算法? 原题所述的过程就是Prim算法求最大生成树的过程.于是我 ...

  8. BZOJ 4221 [JOI2012春季合宿]Kangaroo (DP)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4221 题解 orz WYC 爆切神仙DP 首先将所有袋鼠按大小排序.考虑从前往后DP, ...

  9. LOJ #2731 [JOI2016春季合宿]Solitaire (DP、组合计数)

    题目链接 https://loj.ac/problem/2731 题解 首先一个很自然的思路是,设\(dp[i][j]\)表示选了前\(i\)列,第\(2\)行第\(i\)列的格子是第\(j\)个被填 ...

随机推荐

  1. Git提取两次提交的差异文件

    1. 创建清单文件 获取两次提交之间的文件差异,并将文件清单保存到diff.txt文件中 Git diff --name-only 173d3010 18586360 > diff.txt 2. ...

  2. 如何使用linq读取DataTable集合?AsQueryable() 和 AsEnumerable()区别?

    一.准备工作 引入linq和data 相关的using命名空间 DataTable dt=new DataTable();//dt的来源可以是多个地方,比如:数据库,Excel等等.我这里使用Exce ...

  3. Effective Java(1)-创建和销毁对象

    Effective Java(1)-创建和销毁对象

  4. ASP.NET中数据绑定表达式

    今天谈下.NET中的数据绑定表达式.数据绑定表达式必须包含在<%#和%>字符之间.格式如下: <tagprefix:tagname property='<%# data-bin ...

  5. JQuery Mobile - 需要注意问题!

    一,JQuery Mobile 和 JQuery 版本对接,一定要选用和当前JQuery Mobile 对应版本的JQuery . 二,在台式机的模拟器和真机中的显示结果可能不一样.我在台式机中使用的 ...

  6. RabbitMQ实现的RPC

    1.主要思路 1.生产者发布任务时,指定properties,告知消费者处理任务完毕之后,将结果存储到reply_to指定的Queue中,本次任务的id是correlation_id 2.消费者消费完 ...

  7. 分布式ehcache缓存

    今天在这里了记录一下学习ehcache分布式集群的过程. ehcache的三种最为常用集群方式,分别是 RMI.JGroups 以及 EhCache Server . 这里主要讲一下rmi方式. 1. ...

  8. iOS开发总结——协议代理的认识

    1.前言 自今年5月底正式转iOS之后,天天get新技能,很多技能在脑子里回旋不吐不快,所以,写点东西整理一下.先从协议代理开始. 2.协议方法的声明 @protocol EventMenuBarDe ...

  9. 【BZOJ2127】happiness 最小割

    题目大意:有一个$n\times m$的矩阵,矩阵的每个位置上有一个同学,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦 ...

  10. MySQL命令行导入sql文件时出现乱码解决方案

    Note: sql> source F:weibo.sql(执行相关sql文件) sql> select * from sina into outfile "/weibo.txt ...