QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#322714#7906. Almost ConvexposviiTL 694ms4088kbC++143.1kb2024-02-07 16:06:082024-02-07 16:06:10

Judging History

你现在查看的是最新测评结果

  • [2024-02-07 16:06:10]
  • 评测
  • 测评结果:TL
  • 用时:694ms
  • 内存:4088kb
  • [2024-02-07 16:06:08]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
template<typename G> inline void read(G &x) {x=0;G f=1;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();if(ch=='-') f=-1,ch=getchar();while(ch>='0'&&ch<='9') {x=x*10+(ch^48);ch=getchar();}if(ch=='.') ch=getchar();while(ch>='0'&&ch<='9') {x=x*10+(ch^48),f=f/10;ch=getchar();}x*=f;}
const int MAXN=2e3+5;
const double pi=acos(-1),eps=1e-8;
struct Point {
	double x,y;
	Point operator+(const Point &B)const {return (Point){x+B.x,y+B.y};}
	Point operator-(const Point &B)const {return (Point){x-B.x,y-B.y};}
	Point operator*(const double &B)const {return (Point){x*B,y*B};}
	Point operator/(const double &B)const {return (Point){x/B,y/B};}
	double operator|(const Point &B)const {return x*B.x+y*B.y;}
	double operator^(const Point &B)const {return x*B.y-y*B.x;}
	bool operator<(const Point &B)const {return fabs(x-B.x)<eps?y+eps<B.y:x+eps<B.x;}
}p[MAXN];
int sign(double x) {return x>eps?1:(x<-eps?-1:0);}
struct Line {
	Point a,b;
	double slope() {if(a.x==b.x) return 1e9;return (a.y-b.y)/(a.x-b.x);}
	friend bool operator<(Line L1,Line L2) {
		return (L1.b-L1.a)<(L2.b-L2.a);
	}
}L[MAXN];int num;
bool onl(Point A,Line L) {
	if(A.x==1e9) return 0;
  	return (min(L.a.x,L.b.x)<=A.x&&A.x<=max(L.a.x,L.b.x));
}
Point inter(Line a,Line b) {
	if(a.slope()==b.slope()) return {1e9,0};
	Point res=a.a+(a.b-a.a)*(((b.b-b.a)^(b.a-a.a))/((b.b-b.a)^(a.b-a.a)));
	if(a.a.x==a.b.x) {
		if(a.a.y<a.b.y) {
			if(res.y>a.a.y) return res;
		}
		else {
			if(res.y<a.a.y) return res;
		}
	}
	else {
		if(a.a.x<a.b.x) {
			if(res.x>a.a.x) return res;
		}
		else {
			if(res.x<a.a.x) return res;
		}
	}return {1e9,0};
}
double dis(Point A,Point B) {return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));}
bool f(Point A,Point B,Point C) {return ((A-B)^(C-B))>eps;}
int n,s[MAXN],tot;
bool vis[MAXN],imp[MAXN];
Line li[MAXN];int cnt;
double ans;
bool rec;
signed main() {
	read(n);
	for(int i=1;i<=n;++i) read(p[i].x),read(p[i].y);
	if(p[1].x==-718158) rec=1;
	sort(p+1,p+1+n);
	for(int i=1;i<=n;++i) {
		while(tot>=2&&!f(p[s[tot-1]],p[s[tot]],p[i])) --tot;
		s[++tot]=i;
	}
	for(int i=1;i<=tot;++i) vis[s[i]]=1;
	for(int i=2;i<=tot;++i) {
		++cnt;
		li[cnt]={p[s[i-1]],p[s[i]]};
	}
	tot=0;
	for(int i=n;i>=1;--i) {
		while(tot>=2&&f(p[i],p[s[tot]],p[s[tot-1]])) --tot;
		s[++tot]=i;
	}
	for(int i=1;i<=tot;++i) vis[s[i]]=1;
	for(int i=2;i<=tot;++i) {
		++cnt;
		li[cnt]={p[s[i-1]],p[s[i]]};
	}
	int ans=1;
	for(int i=1;i<=n;++i) {
		if(!vis[i]) {
//			assert(!rec||i<=1650);
			num=0;
			for(int j=1;j<=n;++j) {
				if(!vis[j]&&j!=i) {
					L[++num]={p[i],p[j]};
				}
			}
			sort(L+1,L+num+1);
			int now=-1;ans+=cnt;
			for(int j=1;j<=cnt;++j) {
				imp[j]=0;
				if(onl(inter(L[1],li[j]),li[j])) now=j;
			}
			for(int j=1;j<=num;++j) {
				if(rec&&i>=1650) {
					bool flag=0;
					for(int k=1;k<=cnt;++k) {
						if(onl(inter(L[j],li[k]),li[k])) {
							flag=1;
							break;
						}
					}
					assert(flag);
				}
				while(!onl(inter(L[j],li[now]),li[now])) now=now%cnt+1;
				if(!imp[now]) imp[now]=1,--ans;
			}
		}
	}
	printf("%d",ans);
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3804kb

input:

7
1 4
4 0
2 3
3 1
3 5
0 0
2 4

output:

9

result:

ok 1 number(s): "9"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3856kb

input:

5
4 0
0 0
2 1
3 3
3 1

output:

5

result:

ok 1 number(s): "5"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3880kb

input:

3
0 0
3 0
0 3

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3808kb

input:

6
0 0
3 0
3 2
0 2
1 1
2 1

output:

7

result:

ok 1 number(s): "7"

Test #5:

score: 0
Accepted
time: 0ms
memory: 3984kb

input:

4
0 0
0 3
3 0
3 3

output:

1

result:

ok 1 number(s): "1"

Test #6:

score: 0
Accepted
time: 657ms
memory: 3964kb

input:

2000
86166 617851
383354 -277127
844986 386868
-577988 453392
-341125 -386775
-543914 -210860
-429613 606701
-343534 893727
841399 339305
446761 -327040
-218558 -907983
787284 361823
950395 287044
-351577 -843823
-198755 138512
-306560 -483261
-487474 -857400
885637 -240518
-297576 603522
-748283 33...

output:

718

result:

ok 1 number(s): "718"

Test #7:

score: 0
Accepted
time: 568ms
memory: 3892kb

input:

2000
571314 -128802
-57762 485216
-713276 485201
-385009 -844644
371507 403789
338703 -272265
-913641 438001
-792118 -481524
709494 213762
-913577 432978
-397111 709021
840950 328210
-843628 452653
-20721 126607
-107804 -338102
930109 -89787
-949115 -76479
-862141 455623
991761 94852
-635475 625573
...

output:

658

result:

ok 1 number(s): "658"

Test #8:

score: 0
Accepted
time: 415ms
memory: 3904kb

input:

2000
-510540 -289561
-602648 -189950
-403224 944455
-369582 -41334
358122 -598933
-817147 470207
-440180 -735160
-705634 61719
319062 897001
-905089 -755682
-408371 -520115
-423336 548115
-590242 835990
208155 883477
-202087 142035
-71545 411206
570690 -673204
-228451 -903435
-732876 -570271
-246755...

output:

309

result:

ok 1 number(s): "309"

Test #9:

score: 0
Accepted
time: 334ms
memory: 4088kb

input:

2000
-532115 566389
138405 49337
398814 -97324
116833 113216
381728 877609
222402 641022
109920 952381
-113880 395181
13780 -572931
-676608 605202
-74328 -503839
-207767 926500
-663270 -146303
197877 280349
275865 -663892
-630214 3286
973786 304855
-493735 841584
394901 -505975
757960 204724
-373328...

output:

239

result:

ok 1 number(s): "239"

Test #10:

score: 0
Accepted
time: 360ms
memory: 4012kb

input:

2000
512636 509804
-661126 -592269
755566 -721837
-878213 441853
-236050 -89069
-181220 155656
203391 691764
940154 260513
747075 373881
620423 840991
-409624 335472
270937 -710659
-751290 -673585
250341 -193243
-250535 618887
-739996 543936
-547741 -213681
-82920 -364319
-611672 737719
930798 46731...

output:

1025

result:

ok 1 number(s): "1025"

Test #11:

score: 0
Accepted
time: 330ms
memory: 4012kb

input:

2000
943353 817289
237151 899722
682851 -464873
854225 205354
834550 257948
-260874 298196
-224572 -269157
-667301 881130
-45920 -696359
-634337 792620
-408527 -947513
582880 172669
921645 839423
833813 721080
-836662 -287230
-55783 -408594
108996 -122012
365647 -789544
313812 833502
970009 -737736
...

output:

218

result:

ok 1 number(s): "218"

Test #12:

score: 0
Accepted
time: 105ms
memory: 3964kb

input:

2000
619248 227987
-252490 -553032
148050 -479727
-333707 -591482
-40488 -503144
561909 255624
-402541 -798967
-245811 -610006
-146584 -517935
226433 -92580
-81939 -828480
72540 -845547
502613 220323
66708 -573015
601886 258752
406443 257854
232970 -671600
-37023 -683767
602339 456757
-440096 -71899...

output:

7

result:

ok 1 number(s): "7"

Test #13:

score: 0
Accepted
time: 132ms
memory: 3976kb

input:

2000
-602451 2956
85982 141739
-185932 -208897
-716095 58215
-468047 155612
-791626 -3105
75700 -484098
609608 -304849
689485 -106857
533177 -285261
-659400 -241162
-369302 165482
406663 265940
-353843 -788313
805885 -75440
-571955 -60471
351360 -81373
-510926 -59456
591713 179588
534794 -118
201630...

output:

66

result:

ok 1 number(s): "66"

Test #14:

score: 0
Accepted
time: 166ms
memory: 3904kb

input:

2000
41203 -675424
-158994 366628
-133859 -595680
435466 687630
687811 -35017
314337 133049
-384711 444777
54850 -760922
526166 282618
572292 94793
-324003 621393
-30308 242225
612969 -231837
-56628 -892609
-492077 58749
29597 -349591
198510 219502
380955 -59845
839171 -40068
88185 -820614
-572977 -...

output:

43

result:

ok 1 number(s): "43"

Test #15:

score: 0
Accepted
time: 218ms
memory: 3904kb

input:

2000
-814040 46114
-324077 -522697
388552 -604274
-252898 43028
-757069 141507
413462 -649779
-281915 -316285
-498931 -573214
-408766 670792
-271435 -393170
87187 731739
89312 -853584
-768680 -307261
-185324 234729
-70493 -354866
16452 164338
-650791 -518077
851196 -259322
-85395 -509349
241593 5074...

output:

129

result:

ok 1 number(s): "129"

Test #16:

score: 0
Accepted
time: 341ms
memory: 3960kb

input:

2000
23103 -796677
-148322 67634
-525131 -446626
2672 584671
-712789 -69579
-91150 -429393
-375635 -487235
-680553 -370975
793181 -383683
-234131 -462420
-734705 -171834
322671 -355011
760005 224249
700248 -352775
416862 -125857
-497951 717254
677084 -451876
-220123 616240
525973 -144881
-300828 553...

output:

1466

result:

ok 1 number(s): "1466"

Test #17:

score: 0
Accepted
time: 694ms
memory: 3916kb

input:

2000
-185174 470373
-772343 -70370
-182314 851727
661615 -250979
-581175 527646
332025 141502
-659052 -506788
-378459 -553180
11233 162287
469975 -572356
679074 217029
-137967 727723
581696 140544
452574 -319370
120895 129820
772655 -330960
122860 823902
-786221 147543
-206152 -373647
-212943 4820
6...

output:

2801

result:

ok 1 number(s): "2801"

Test #18:

score: -100
Time Limit Exceeded

input:

2000
-718158 695879
655921 595312
-509080 -860718
540612 244159
-83221 -865654
-460513 -542465
102321 -775593
328552 799263
-284269 -725108
152140 549502
-108610 465054
-97837 -449762
-772869 -171472
293831 -711723
508617 -157976
170737 323070
544222 385453
-633043 -233165
-620164 -459706
507218 338...

output:


result: