Submission #44454043


Source Code Expand

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int mod=1e9+7;
struct node{
	double x;
	double y;
	int id;
	int col; 
}dot[500005];
const double eps=1e-12;
bool online[500005];
const double pi = acos(-1), pi_2 = 2 * acos(-1);
double check(node a1,node a2,node b1,node b2){
	node A=(node){a2.x-a1.x,a2.y-a1.y,0};
	node B=(node){b2.x-b1.x,b2.y-b1.y,0};
	double tmp=A.x*B.y-A.y*B.x;
	if(fabs(tmp)<eps){
		return 0;
	}
	else{
		return tmp;
	}
}
double dis(node x,node y){
	return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
bool cmp(node p1,node p2)//排序函数,这个函数别写错了,要不然功亏一篑 
{
    double tmp=check(dot[1],p1,dot[1],p2);
    if(tmp>0) 
		return 1;
    if(tmp==0&&dis(dot[1],p1)<dis(dot[1],p2)) 
		return 1;
    return 0;
}

node s[500005];//模拟栈
int top=0; 
bool pan(node x,node y,node k){//栈头点/栈次点/将要加入的点 ,返回是否要弹出栈头 
	if(check(y,x,x,k)>0){
		return 0;
	}
	else{
		return 1;//在一条线上的暂时视为删除 
	}
}
long long res=0;
queue<int>Q;
void solve() {
    while (Q.size()) Q.pop();//清空 
    int y = 2 * top + 1;//首/尾两端点 
    for (int i = 2 * top; i >= 1; i--) {
        if (s[i].col == 1)
            Q.push(i);
        if (s[i].col == 2)
            y = i;
        while (Q.size() && Q.front() >= i + top) Q.pop();//确定区间在top范围内 
        if (i <= top) {
        	//tx/ty能选就选,否则就只能选左右两个端点 
            int tx = (Q.size()) ? Q.front() : i;
			int ty = (y >= i + top) ? i+top-1 : y;
            if (tx > ty)//不合法选取排除 
                continue;
            res=res+(ty-tx)%mod;//相当于左端点确定颜色后,只要右端点颜色确定,那么整个颜色都可以确定 
        }
    }
}
bool ok1,ok2;
int main(){
//	freopen("constellation.in","r",stdin);
//	freopen("constellation.out","w",stdout);
	ios::sync_with_stdio(false);
	cin >> n;
	double minx=1e10;
	double miny=1e10;
	int minid=1;
	ok1=1;
	ok2=1;
	for(int i=1;i<=n;i++){
		cin >> dot[i].x >> dot[i].y >> dot[i].col;
		if(dot[i].col==1)
            ok2 =0;
        if (dot[i].col==2)
            ok1 =0;
		if(dot[i].y<miny){
			miny=dot[i].y;
			minx=dot[i].x;
			minid=i;
		}
		else if(dot[i].y==miny&&dot[i].x<minx){
			minx=dot[i].x;
			minid=i;
		}
		dot[i].id=i;
	}	
	if(n==1){
		if(dot[1].col!=0){
			cout<<2;
			return 0;
		}
		else{
			cout<<1;
			return 0;
		}
	}
	swap(dot[1],dot[minid]);
	sort(dot+2,dot+1+n,cmp);
	s[1]=dot[1];
	s[2]=dot[2];
	online[dot[1].id]=online[dot[2].id]=1;
	top=2;
	for(int i=3;i<=n;i++){
		while(top>=2&&pan(s[top],s[top-1],dot[i])==1){
			online[s[top].id]=0;
			top--;
		}
		top++;
		s[top]=dot[i];
		online[s[top].id]=1;
	} 
	s[0]=s[top];//先找到整个图的凸包 
	
	for(int i=1;i<=top;i++){//破环成链 
		s[top+i]=s[i];
	}
	solve();
	int tot=0;
	int tot2=0;
	for(int i=1;i<=top;i++){
		tot+=(s[i].col!=1);
		tot2+=(s[i].col!=2);
	}
	if(tot==top){
		res=(res+1)%mod;
	}
	if(tot2==top){
		res=(res+1)%mod;
	}
	for(int i=1;i<=n;i++){
		int id=dot[i].id;
		if(online[id]==0&&dot[i].col==0){
			res=res*2%mod;
		}
	}
	if(ok1){
		res=(res-1)%mod;
	}
	if(ok2){
		res=(res-1)%mod;
	}
	cout<<(res+mod)%mod<<endl;
	
}

Submission Info

Submission Time
Task constellation - 星座
User bushigeshizhenpi
Language C++ (GCC 9.2.1)
Score 100
Code Size 3368 Byte
Status AC
Exec Time 76 ms
Memory 10660 KiB

Compile Error

./Main.cpp: In function ‘double check(node, node, node, node)’:
./Main.cpp:15:37: warning: missing initializer for member ‘node::col’ [-Wmissing-field-initializers]
   15 |  node A=(node){a2.x-a1.x,a2.y-a1.y,0};
      |                                     ^
./Main.cpp:16:37: warning: missing initializer for member ‘node::col’ [-Wmissing-field-initializers]
   16 |  node B=(node){b2.x-b1.x,b2.y-b1.y,0};
      |                                     ^

Judge Result

Set Name Set01 Set02 Set03 Set04 Set05 Set06 Set07 Set08 Set09 Set10
Score / Max Score 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10 10 / 10
Status
AC × 8
AC × 6
AC × 6
AC × 6
AC × 6
AC × 9
AC × 10
AC × 10
AC × 11
AC × 10
Set Name Test Cases
Set01 01-01, 01-02, 01-03, 01-04, 01-05, 01-06, 01-07, 01-08
Set02 02-01, 02-02, 02-03, 02-04, 02-05, 02-06
Set03 03-01, 03-02, 03-03, 03-04, 03-05, 03-06
Set04 04-01, 04-02, 04-03, 04-04, 04-05, 04-06
Set05 05-01, 05-02, 05-03, 05-04, 05-05, 05-06
Set06 06-01, 06-02, 06-03, 06-04, 06-05, 06-06, 06-07, 06-08, 06-09
Set07 07-01, 07-02, 07-03, 07-04, 07-05, 07-06, 07-07, 07-08, 07-09, 07-10
Set08 08-01, 08-02, 08-03, 08-04, 08-05, 08-06, 08-07, 08-08, 08-09, 08-10
Set09 09-01, 09-02, 09-03, 09-04, 09-05, 09-06, 09-07, 09-08, 09-09, 09-10, 09-11
Set10 10-01, 10-02, 10-03, 10-04, 10-05, 10-06, 10-07, 10-08, 10-09, 10-10
Case Name Status Exec Time Memory
01-01 AC 8 ms 3588 KiB
01-02 AC 2 ms 3688 KiB
01-03 AC 2 ms 3652 KiB
01-04 AC 2 ms 3740 KiB
01-05 AC 2 ms 3704 KiB
01-06 AC 5 ms 3596 KiB
01-07 AC 2 ms 3696 KiB
01-08 AC 2 ms 3704 KiB
02-01 AC 3 ms 3612 KiB
02-02 AC 3 ms 3716 KiB
02-03 AC 2 ms 3708 KiB
02-04 AC 2 ms 3664 KiB
02-05 AC 3 ms 3596 KiB
02-06 AC 3 ms 3616 KiB
03-01 AC 3 ms 3612 KiB
03-02 AC 3 ms 3732 KiB
03-03 AC 3 ms 3612 KiB
03-04 AC 3 ms 3652 KiB
03-05 AC 2 ms 3636 KiB
03-06 AC 2 ms 3728 KiB
04-01 AC 2 ms 3732 KiB
04-02 AC 2 ms 3724 KiB
04-03 AC 2 ms 3732 KiB
04-04 AC 2 ms 3600 KiB
04-05 AC 6 ms 3604 KiB
04-06 AC 3 ms 3596 KiB
05-01 AC 3 ms 3608 KiB
05-02 AC 2 ms 3612 KiB
05-03 AC 2 ms 3708 KiB
05-04 AC 2 ms 3632 KiB
05-05 AC 4 ms 3596 KiB
05-06 AC 3 ms 3676 KiB
06-01 AC 4 ms 3736 KiB
06-02 AC 14 ms 4064 KiB
06-03 AC 12 ms 4004 KiB
06-04 AC 9 ms 4016 KiB
06-05 AC 13 ms 3832 KiB
06-06 AC 4 ms 3720 KiB
06-07 AC 8 ms 3836 KiB
06-08 AC 9 ms 3744 KiB
06-09 AC 9 ms 4060 KiB
07-01 AC 5 ms 3660 KiB
07-02 AC 74 ms 6116 KiB
07-03 AC 5 ms 3652 KiB
07-04 AC 75 ms 6132 KiB
07-05 AC 75 ms 10640 KiB
07-06 AC 7 ms 3696 KiB
07-07 AC 11 ms 4068 KiB
07-08 AC 9 ms 3984 KiB
07-09 AC 8 ms 4016 KiB
07-10 AC 75 ms 10564 KiB
08-01 AC 8 ms 3656 KiB
08-02 AC 73 ms 6116 KiB
08-03 AC 8 ms 3748 KiB
08-04 AC 73 ms 6112 KiB
08-05 AC 74 ms 10564 KiB
08-06 AC 8 ms 3628 KiB
08-07 AC 11 ms 3944 KiB
08-08 AC 14 ms 4060 KiB
08-09 AC 10 ms 4000 KiB
08-10 AC 75 ms 10552 KiB
09-01 AC 9 ms 3684 KiB
09-02 AC 74 ms 6168 KiB
09-03 AC 74 ms 10484 KiB
09-04 AC 76 ms 10648 KiB
09-05 AC 74 ms 10604 KiB
09-06 AC 6 ms 3624 KiB
09-07 AC 11 ms 4076 KiB
09-08 AC 13 ms 4064 KiB
09-09 AC 8 ms 4016 KiB
09-10 AC 73 ms 10452 KiB
09-11 AC 73 ms 10568 KiB
10-01 AC 9 ms 3688 KiB
10-02 AC 76 ms 6144 KiB
10-03 AC 73 ms 6088 KiB
10-04 AC 74 ms 10444 KiB
10-05 AC 75 ms 10660 KiB
10-06 AC 75 ms 10568 KiB
10-07 AC 10 ms 4016 KiB
10-08 AC 12 ms 4008 KiB
10-09 AC 11 ms 4060 KiB
10-10 AC 43 ms 6988 KiB