Submission #1319932

#TimeUsernameProblemLanguageResultExecution timeMemory
1319932PieArmy별자리 (JOI12_constellation)C++20
100 / 100
46 ms6596 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
#define int ll

int mod=1e9+7;

int sum(int x,int y){
	if(x+y<mod)return x+y;
	return x+y-mod;
}

int sub(int x,int y){
	if(y)y=mod-y;
	return sum(x,y);
}

int mul(ll x,ll y){
	return (x*y)%mod;
}

int fpow(int x,int y=mod-2){
	int res=1;
	while(y>0){
		if(y&1)res=mul(res,x);
		x=mul(x,x);
		y>>=1;
	}
	return res;
}

int f(pair<int,int>x,pair<int,int>y){
	return x.fr*y.sc-x.sc*y.fr;
}

int n;
pair<pair<int,int>,int>arr[100023];
int var[100023],sira[100023],pref[2][100023];
vector<int>v;
int m=0;
int ans=1;

int32_t main(){
	ios_base::sync_with_stdio(23^23);cin.tie(NULL);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>arr[i].fr.fr>>arr[i].fr.sc>>arr[i].sc;
		arr[i].sc--;
	}
	sort(arr+1,arr+n+1);
	for(int i=1;i<=n;i++){
		if(var[i])continue;
		while(v.size()>1){
			if(f({arr[i].fr.fr-arr[v[m-2]].fr.fr,arr[i].fr.sc-arr[v[m-2]].fr.sc},
				{arr[v[m-1]].fr.fr-arr[i].fr.fr,arr[v[m-1]].fr.sc-arr[i].fr.sc})>=0){
				break;
			}
			var[v.back()]=0;
			v.pop_back();
			m--;
		}
		v.pb(i);
		m++;
		var[i]=1;
	}
	for(int i=n;i>=1;i--){
		if(var[i]&&i!=1)continue;
		while(v.size()>1){
			if(f({arr[i].fr.fr-arr[v[m-2]].fr.fr,arr[i].fr.sc-arr[v[m-2]].fr.sc},
				{arr[v[m-1]].fr.fr-arr[i].fr.fr,arr[v[m-1]].fr.sc-arr[i].fr.sc})>=0){
				break;
			}
			var[v.back()]=0;
			v.pop_back();
			m--;
		}
		v.pb(i);
		m++;
		var[i]=1;
	}
	v.pop_back();
	m--;
	int halve=fpow(2);
	for(int i=1;i<=m;i++){
		sira[i]=v[i-1];
		pref[0][i]=pref[0][i-1];
		pref[1][i]=pref[1][i-1];
		if(arr[sira[i]].sc!=-1){
			pref[arr[sira[i]].sc][i]++;
		}
	}
	if(pref[0][m]==0&&pref[1][m]==0){
		ans=sum(2,mul(m,m-1));
	}
	else if(pref[0][m]==0||pref[1][m]==0){
		ans=1;
		int i=1;
		while(arr[sira[i]].sc==-1)i++;
		int bas=i-1,cnt=0;
		for(;i<=m;i++){
			if(arr[sira[i]].sc==-1){
				cnt++;
				continue;
			}
			else if(cnt){
				ans=sum(ans,mul(mul(cnt+1,cnt),halve));
				cnt=0;
			}
		}
		cnt+=bas;
		ans=sum(ans,mul(mul(cnt+1,cnt),halve));
	}
	else{
		ans=0;
		int mn[2]={n+1,n+1},mx[2]={0,0};
		for(int i=1;i<=m;i++){
			if(arr[sira[i]].sc==-1)continue;
			mn[arr[sira[i]].sc]=min(i,mn[arr[sira[i]].sc]);
			mx[arr[sira[i]].sc]=i;
		}
		int a=0,b=0;
		if(pref[1][mn[0]]!=pref[1][mx[0]]&&pref[0][mn[1]]!=pref[0][mx[1]]){
			cout<<0<<endl;
			return 0;
		}
		else if(pref[1][mn[0]]!=pref[1][mx[0]]){
			for(int i=mx[1];i<=m;i++){
				if(arr[sira[i]].sc==0){
					mn[0]=i;
					break;
				}
			}
			for(int i=1;i<=mn[1];i++){
				if(arr[sira[i]].sc==0){
					mx[0]=i;
				}
			}
			a=mn[0]-mx[1];
			b=mn[1]-mx[0];
		}
		else if(pref[0][mn[1]]!=pref[0][mx[1]]){
			for(int i=mx[0];i<=m;i++){
				if(arr[sira[i]].sc==1){
					mn[1]=i;
					break;
				}
			}
			for(int i=1;i<=mn[0];i++){
				if(arr[sira[i]].sc==1){
					mx[1]=i;
				}
			}
			a=mn[0]-mx[1];
			b=mn[1]-mx[0];
		}
		else{
			a=max(mn[0],mn[1])-min(mx[0],mx[1]);
			b=m-max(mx[0],mx[1])+min(mn[0],mn[1]);
		}
		ans=sum(ans,mul(a,b));
	}
	int cnt[2]={0,0};
	for(int i=1;i<=n;i++){
		if(arr[i].sc==-1){
			if(var[i])continue;
			ans=mul(ans,2);
		}
		else cnt[arr[i].sc]++;
	}
	ans=sub(ans,sum(!cnt[0],!cnt[1]));
	cout<<ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...