http://uoj.ac/problem/356

题解

思路和\(NOIP\)双栈排序差不多。

对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连一条边。

若最后的这张图是二分图,那么答案就是\(2^{联通块个数}\)。

这道题就是要我们优化连边。

我们把所有线段按照左端点排序,然后我们用平衡树按照右端点为关键字维护已经扫描过去的线段。

发现要和当前扫描到的线段连边的是平衡树上\(dfs\)序连续的一段区间。

考虑这个边怎么连。

我们只需要在这个区间的右端点处和这个点连上1的边,中间连0边就行了。

所以我们可以用并查集的思想,只和右端点连边,在维护一个连0边的\(set\),如果一个点和两边都连上0边就删掉它。

代码

#include<bits/stdc++.h>
#define N 2000009
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int inf=1e9;
int pre[N],nxt[N],head[N],tot;
int top,st[N];
int n;
int vis[N];
inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
inline void MOD(int &x){x=x>=mod?x-mod:x;}
inline ll power(ll x,ll y){ll ans=1;while(y){if(y&1)ans=ans*x%mod;x=x*x%mod;y>>=1;}return ans;
}
struct edge{int n,to,l;
}e[N*6];
inline void add(int u,int v,int l){if(!u||!v)return;// cout<<u<<" "<<v<<" "<<l<<endl;e[++tot].n=head[u];e[tot].to=v;head[u]=tot;e[tot].l=l;e[++tot].n=head[v];e[tot].to=u;head[v]=tot;e[tot].l=l;
}
struct node{int l,r;inline bool operator <(const node &b)const{if(l!=b.l)return l<b.l;return r<b.r;}
}a[N];
struct nd{int pos,id;inline bool operator <(const nd &b)const{return pos<b.pos;}
};
set<nd>s1,s2;
set<nd>::iterator it;
void dfs(int u){for(int i=head[u];i;i=e[i].n){int v=e[i].to;if(vis[v]&&(vis[u]^e[i].l)!=vis[v]){puts("0");exit(0);}if(!vis[v]){vis[v]=vis[u]^e[i].l;dfs(v);}}
}
int main(){n=rd();for(int i=1;i<=n;++i)a[i].l=rd(),a[i].r=rd();sort(a+1,a+n+1);s1.insert(nd{-inf,0});s1.insert(nd{inf,0});s2.insert(nd{-inf,0});s2.insert(nd{inf,0});for(int i=1;i<=n;++i){it=s1.lower_bound(nd{a[i].r,i});nxt[i]=it->id;pre[it->id]=0;it--;pre[i]=it->id;nxt[it->id]=0;if(it->pos>a[i].l)add(i,it->id,1);it=s2.lower_bound(nd{a[i].r,i});--it;while(1){if(it->pos<a[i].l)break;if(pre[it->id]&&a[pre[it->id]].r>a[i].l){add(it->id,pre[it->id],0);pre[it->id]=0;}if(nxt[it->id]&&a[nxt[it->id]].r<a[i].r){add(it->id,nxt[it->id],0);nxt[it->id]=0;}if(!pre[it->id]&&!nxt[it->id])st[++top]=it->id;it--;}for(int j=1;j<=top;++j)s2.erase(nd{a[st[j]].r,st[j]});top=0;    s1.insert(nd{a[i].r,i});s2.insert(nd{a[i].r,i});}int ans=1;for(int i=1;i<=n;++i)if(!vis[i]){vis[i]=2;dfs(i);MOD(ans=ans+ans);}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/11125508.html

【JOI2017春季合宿】Port Facility相关推荐

  1. JOI2017 春季合宿:Railway Trip

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

  2. JOI-2016/17 春季合宿 切题记

    17年的合宿好难啊...感觉是我做过的最难的一套题(没有之一)了...但是可能也是价值最高的? Day1: T1 Cultivation:给你一个H*W的网格,有N<=300棵仙人掌.每一年可以 ...

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

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

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

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

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

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

  6. LOJ #2733 [JOI2016春季合宿]Sandwiches (DP)

    题目链接 https://loj.ac/problem/2733 题解 神仙题-- 首先可以观察到一个结论: 目标块的两块小三明治一定分别是最后和倒数第二个被吃的. 由此我们可以考虑这两块谁先被吃.这 ...

  7. LOJ #2734 Luogu P3615 [JOI2016春季合宿]Toilets (结论、贪心)

    题目链接 (loj) https://loj.ac/problem/2734 (luogu) https://www.luogu.org/problem/P3615 题解 嗯,考场上肝了\(3h\)然 ...

  8. [JOI2012春季合宿]Rotate (链表)

    题意 题解 又是一道神仙题-- 显然的做法是大力splay,时间复杂度\(O((N+Q)N\log N)\), 可以卡掉. 正解: 使用十字链表维护矩阵,在周围增加第\(0\)行/列和第\((n+1) ...

  9. [JOI2012春季合宿]Constellation (凸包)

    题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...

最新文章

  1. RMAN duplicate database到新主机
  2. tableView下沉
  3. 关于电脑的几十个单词及其缩写
  4. 科大星云诗社动态20210307
  5. 利用IE8开发人员工具调试JavaScript脚本
  6. redis sds的申请扩容源码
  7. oracle基本的查询语句,Oracle中的基本查询语句总结
  8. h5 宽度全屏自适应
  9. html5 dom api,HTML5 DOM File API
  10. java后端概述_java后端开发知识点
  11. Qt获取本机硬盘序列号,不受IDE硬盘与SCSI硬盘类型影响
  12. 2021-06-18
  13. 爱心打印函数(基于EasyX图形库)
  14. 推荐一些经典的学习书籍
  15. Python基础 Zero to Hero面向对象编程(一)
  16. 不交智商税,如何判断一场知乎live的质量?
  17. poi导出excel文件加密处理
  18. 新鲜出炉2010笑话集锦,我竟然一个都没听过
  19. 绿布抠像怎么抠干净_AE如何抠取绿幕视频 干净抠像教程
  20. 英孚教育全面上云与Serverless构建之路

热门文章

  1. MySql笔记之数据表
  2. 设置本地用户帐户的过期日期
  3. 【转载】Unix编程艺术——Unix哲学
  4. AMD:浏览器中的模块规范
  5. 如何设置iframe高度自适应,在跨域的情况下能做到吗?
  6. 海量数据处理的思路和方法
  7. kali-linux 完美解决sublime输入 中文
  8. 2019/5/12 查漏补缺
  9. LeetCode39.组合总和 JavaScript
  10. (最简单)小米MIX 2S的usb调试模式在哪里开启的流程