提出 #44454043
ソースコード 拡げる
#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;
}
提出情報
コンパイルエラー
./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};
| ^
ジャッジ結果
| セット名 |
Set01 |
Set02 |
Set03 |
Set04 |
Set05 |
Set06 |
Set07 |
Set08 |
Set09 |
Set10 |
| 得点 / 配点 |
10 / 10 |
10 / 10 |
10 / 10 |
10 / 10 |
10 / 10 |
10 / 10 |
10 / 10 |
10 / 10 |
10 / 10 |
10 / 10 |
| 結果 |
|
|
|
|
|
|
|
|
|
|
| セット名 |
テストケース |
| 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 |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 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 |