제출 #1336774

#제출 시각아이디문제언어결과실행 시간메모리
1336774boclobanchatPort Facility (JOI17_port_facility)C++20
0 / 100
6091 ms344 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e6+5;
const int mod=1e9+7;
const int inv=5e8+4;
struct fenwicktree
{
	int fen[MAXN];
	int getlog(long long n) { return 63-__builtin_clzll(n); }
	void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
	int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
	int walk(int n,int val) { if(val<0) return 1;int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>=fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; }
};
fenwicktree fa,fb;
int dsu[MAXN],pos[MAXN],nex[MAXN];
bool ck[MAXN],cc[MAXN];
vector<int> vi[MAXN];
int root(int i)
{
	if(!dsu[i]) return i;
	return dsu[i]=root(dsu[i]);
}
bool merge(int i,int j)
{
	bool c=(cc[i]==cc[j]);
	if((i=root(i))==(j=root(j)))
	{
		if(c)
		{
			cout<<0;
			exit(0);
		}
		return false;
	}
	if(vi[i].size()<vi[j].size()) swap(i,j);
	if(c) for(auto v:vi[j]) cc[v]=1-cc[v];
	for(auto v:vi[j]) vi[i].push_back(v);
	vi[j].clear(),dsu[j]=i;
	return true;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,ans=1;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int l,r;
		cin>>l>>r;
		nex[l]=r;
	}
	for(int i=1;i<=n*2;i++) if(nex[i])
	{
		int j=nex[i];
		ans=ans*2%mod,pos[i]=pos[j]=i,vi[i].push_back(i);
		int c=fb.get(i),res=fa.walk(n*2,fa.get(i));
		if(res<=j&&merge(pos[res],i)) ans=1LL*ans*inv%mod;
		while((res=fb.walk(n*2,c))<=j)
		{
			int nex=fa.walk(n*2,fa.get(res));
			if(nex<=j)
			{
				if(merge(pos[res],i)) ans=1LL*ans*inv%mod;
				if(merge(pos[nex],i)) ans=1LL*ans*inv%mod;
				fb.update(res,n*2,-1),ck[res]=false;
			}
		}
		fa.update(j,n*2,1),fb.update(j,n*2,1),ck[j]=true;
		int pre=fa.walk(n*2,fa.get(j)-2);
		if(fa.get(j)>1&&!ck[pre]) fb.update(j,n*2,1),ck[pre]=true; 
	}
	cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...