AT2534 港湾設備 (Port Facility)
先膜一下Iscream巨巨
首先我们可以把题目转化为线段覆盖,如果两条线段相交(不算某一条完全在另一条里面的情况),那么这两条线段代表的集装箱就不能放到同一个栈里,我们在它们之间连一条边。如果图里有奇环,那么说明无解。于是黑白染色,可以和食物链那个一样用并查集维护,如果有解,设连通块个数为\(S\),那么答案就是\(2^S\)
然而线段很多,直接连边怕是要T飞。考虑如何维护线段相交,可以用一个栈,如果遇到线段的左端点就把它入栈,遇到右端点时就把左端点到栈顶的所有未出栈的线段都和它连边,然后把左端点弹出
然而要在栈的中间弹出……小栈它可能做不太到……所以可以定义一个\(nxt[i]\)表示\(i\)后面(包括自己)第一个没有出栈的元素,用一个类似并查集的方法乱搞就可以资瓷弹栈了
然而相交的次数还是很多……考虑当前线段左端点和右端点间的这些线段要么颜色相等要么无解,所以可以用一个\(jp[i]\)表示\(i\)后面下一个可能与它颜色不同的位置,每一次从左端点的下一位开始跳\(jp\)并暴力更改即可
//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=2e6+5,P=1e9+7;
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=1ll*x*x%P)if(y&1)res=1ll*res*x%P;
return res;
}
int fa[N],nxt[N],pos[N],st[N],w[N],jp[N];
int n,top,ans,l,r,x,y,z;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int Nxt(int x){return nxt[x]==x?x:nxt[x]=Nxt(nxt[x]);}
int add(R int x,R int y){
R int u=find(x),v=find(y),uu=find(x+n),vv=find(y+n);
if(u==v||uu==vv)return 0;
u<=vv?fa[vv]=u:fa[u]=vv;
v<=uu?fa[uu]=v:fa[v]=uu;
return 1;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)l=read(),r=read(),w[l]=w[r]=i;
fp(i,1,2*n)nxt[i]=fa[i]=i,jp[i]=i+1;
fp(i,1,2*n)if(!pos[w[i]])pos[w[i]]=++top,st[top]=w[i];
else{
x=pos[w[i]],y=Nxt(x+1);
while(y<=top){
if(!add(w[i],st[y]))return puts("0"),0;
z=jp[y],jp[y]=top+1,y=Nxt(z);
}nxt[x]=x+1;
}
fp(i,1,2*n)if(find(i)==i)++ans;
ans>>=1,ans=ksm(2,ans);printf("%d\n",ans);
return 0;
}
AT2534 港湾設備 (Port Facility)的更多相关文章
- 讓TQ2440也用上設備樹(1)
作者:彭東林 郵箱:pengdonglin137@163.com QQ:405728433 開發板 TQ2440 + 64MB 內存 + 256MB Nand 軟件 Linux: Linux-4.9 ...
- UOJ #356. 【JOI2017春季合宿】Port Facility
Description 小M有两个本质不同的栈. 无聊的小M找来了n个玩具.之后小M把这n个玩具随机顺序加入某一个栈或把他们弹出. 现在小M告诉你每个玩具的入栈和出栈时间,现在她想考考小S,有多少种方 ...
- Ubuntu16.04 藍牙連上,但是聲音裏面找不到設備
解決辦法: 1. sudo apt-get install blueman bluez* 2. sudo vim /etc/pulse/default.pa 注釋掉下面的代碼: #.ifexists ...
- UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...
- [JOI2017春季合宿]Port Facility[set、二分图]
题意 你有两个栈,有 \(n\) 个货物,每个货物有一个进栈时间和出栈时间(所有时间的并集是1~2n),问有多少种不同的入栈方案. \(n\le 10^6\) 分析 把每个货物的存在看成区间,相交的区 ...
- UOJ356 【JOI2017春季合宿】Port Facility
暴力就是O(n^2)连边,二分图,这样只有22分. 我们考虑优化建边,我们按照左端点排序,对于一个新加进来的线段,我们向左端点距其最近的和他相交的线段连边,别的相交的我们连同色边,当一个点连了两条同色 ...
- 【JOI2017春季合宿】Port Facility
http://uoj.ac/problem/356 题解 思路和\(NOIP\)双栈排序差不多. 对于两个元素,若\(l_1<l_2<r_1<r_2\)那么它们不能在一个栈里,我们连 ...
- iPhone的設置——FaceTime頁面
這裏說的是蘋果的Hand off功能,系統升級後,蘋果的多部設備可以更好的“連續互通”.有電話打進來,iPhone.iPad和Mac都能收到,用戶可以任意選擇一款設備接電 話.同樣,iMessage也 ...
- 高效率dc升壓轉換器 應用技巧談 功率設計
為便攜式電子設備開發電源電路要求設計工程師通過最大程度地提高功率和降低整個系統的功耗來延長電池使用壽命,這推動器件本身的尺寸變得更小,從而有益于在設計終端產品時獲得更高靈活性.這種設計的最重要元器件之 ...
随机推荐
- row and col
1.行 <Row gutter={{ md: 6, lg: 12, xl: 12 }}></Row> gutter: md: 中等屏幕 桌面显示器 (≥992px) lg: 大 ...
- 如何正确地在React中处理事件
1.构造器内绑定this class MyComponent extends React.Component { constructor(props) { super(props); this.sta ...
- JAVA 保留两位小数
package com.oracle.pojo; import java.math.BigDecimal; import java.text.DecimalFormat; import java.te ...
- Eureka vs Zookeeper
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡.在此Zookeeper保证 ...
- EasyBCD在windows7基础上安装Ubuntu 14.04双系统详
把下载好的ubuntu安装包放在C盘根文件夹下,利用Daemon Tools 将安装包下casper文件夹的vmlinuz.efi和initrd.lz复制到C盘根文件夹下,紧接着打开easybcd,在 ...
- 2016/05/25 抽象类与API(接口)差别
简单来说, 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的 ...
- HDU 6044 Limited Permutation 读入挂+组合数学
Limited Permutation Problem Description As to a permutation p1,p2,⋯,pn from 1 to n, it is uncomplica ...
- debian var目录
1 /usr和/var /usr,只读数据. /var,可变数据. 2 /var/lib和/var/cache /var/lib,保存应用或者系统可变的状态信息,真的只是状态信息,比如/var/lib ...
- strong and weak 强引用和弱引用的差别
(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它. 一旦最后一个strong型指针离去 .这个对象将被释放,全部剩余 ...
- uptime详解,最通俗的说明了cpu平均负载
今天又个网友问uptime的三个平均负载值具体要怎么理解,发现要自己解释还真不知道怎么表达~~~~,下面到网上找了篇文章给大家分享: uptime命令,有两大用处,一个是看您的机器的运行时间,另一 ...