QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#746278#7906. Almost ConvexmobbbTL 531ms3940kbC++205.8kb2024-11-14 14:05:352024-11-14 14:05:35

Judging History

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

  • [2024-11-14 14:05:35]
  • 评测
  • 测评结果:TL
  • 用时:531ms
  • 内存:3940kb
  • [2024-11-14 14:05:35]
  • 提交

answer

#include <bits/stdc++.h>

#define ll long long 

#define db ll
constexpr db EPS = 0;
int sign(db a){ return a < -EPS ? -1 : a > EPS; }
int cmp(db a,db b) {return sign(a - b);}
struct P {
	db x,y;
	P() {}
	P(db _x,db _y) : x(_x),y(_y){}
	P operator+(P p) {return {x + p.x,y + p.y};}
	P operator-(P p) {return {x - p.x,y - p.y};}
	P operator*(db d) {return {x * d,y * d};}
	P operator/(db d) {return {x / d,y / d};}
	
	bool operator < (P p) const{
		int c = cmp(x,p.x);
		if (c) return c == -1;
		return cmp(y , p.y) == -1;
	}

	bool operator == (P o) const{
		return cmp(x,o.x) == 0 && cmp(y,o.y) == 0;
	}
	db dot(P p){return x * p.x + y * p.y;}
	// a * b == |a| * |b| * cos<a,b>  ,大于0为锐角小于0为钝角等于0为直角
	db det(P p){return {x * p.y - y * p.x};} 
	// a * b == |a| * |b| * sin<a,b> == - (b * a) ,a逆时针转多少度可以转到b
	// 大于0 b在a的逆时针方向,等于0共线,小于0 b在a的顺时针方向
	void read(){std::cin >> x >> y;}
	void print(){std::cout << x << " " << y  << "\n";}
	db distTo(P p) {return (*this - p).abs();}
	db alpha() {return atan2l(y,x);}
	db abs() {return sqrtl(abs2());}
	db abs2() {return x * x + y * y;}
	P rot90() {return P(-y,x);} // 逆时针旋转90度
	int quad(){return sign(y) == 1 || (sign(y) == 0 && sign(x) == 1);}
	P unit() {return *this / abs();}
	P rot(db an){return {x * cosl(an) - y * sinl(an),x * sinl(an) + y * cosl(an)};}
};
#define cross(p1,p2,p3) ((p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x))
#define crossOp(p1,p2,p3) sign(cross(p1,p2,p3)) // 以p1为起点去考虑<p1,p2> <p1,p3> 
// 大于0 p3在p2的逆时针方向,小于0在顺时针,等于0共线

// 两个直线是否相交
bool chkLL(P p1,P p2,P q1,P q2){
	db a1 = cross(q1,q2,p1),a2 = -cross(q1,q2,p2);
	return sign(a1 + a2) != 0;
}
// 求两直线交点
P isLL(P p1,P p2,P q1,P q2){
	db a1 = cross(q1,q2,p1),a2 = -cross(q1,q2,p2);
	return (p1 * a2 + p2 * a1) / (a1 + a2);
}
// 判断区间 [l1,r1] ,[l2,r2] 是否相交
bool intersect(db l1,db r1,db l2,db r2){
	if (l1 > r1) std::swap(l1,r1);if (l2 > r2) std::swap(l2,r2);
	return !(cmp(r1,l2) == -1 || cmp(r2,l1) == -1);
}
// 两线段是否相交
bool isSS(P p1,P p2,P q1,P q2){
	return intersect(p1.x,p2.x,q1.x,q2.x) && intersect(p1.y,p2.y,q1.y,q2.y) && 
	crossOp(p1,p2,q1) * crossOp(p1,p2,q2) <= 0 && crossOp(q1,q2,p1) * crossOp(q1,q2,p2) <= 0;
}
// 两线段是否严格相交
bool isSS_strict(P p1,P p2,P q1,P q2){
	return crossOp(p1,p2,q1) * crossOp(p1,p2,q2) < 0 && crossOp(q1,q2,p1) * crossOp(q1,q2,p2) < 0;
}
// m 在不在a和b之间
bool isMiddle(db a,db m,db b){
	return sign(a - m) == 0 || sign(b - m) == 0 || (a < m != b < m);
}
// 点m 在不在a和b之间
bool isMiddle(P a,P m,P b){
	return isMiddle(a.x,m.x,b.x) && isMiddle(a.y,m.y,b.y);
}
// 点q在线段上
bool onSeg(P p1,P p2, P q){
	return crossOp(p1,p2,q) == 0 && isMiddle(p1,q,p2);
}
// 点q严格在线段上
bool onSeg_strict(P p1,P p2,P q){
	return crossOp(p1,p2,q) == 0 && sign((q - p1).dot(p1 - p2)) * sign((q - p2).dot(p1 - p2));
}
// 求 q 到 p1p2的投影
P proj(P p1,P p2,P q){
	P dir = p2 - p1;
	return p1 + dir * (dir.dot(q - p1) / dir.abs2());
}
// 求 q以直线p1p2为轴的反射
P refect(P p1,P p2,P q){
	return proj(p1,p2,q) * 2 - q;
}
// 求q到线段p1p2的最短距离
db nearest(P p1,P p2,P q){
	if (p1 == p2) return p1.distTo(q);
	P h = proj(p1,p2,q);
	if (isMiddle(p1,h,p2)){
		return q.distTo(h);
	}
	return std::min(p1.distTo(q),p2.distTo(q));
}
// 求线段p1p2 与线段q1q2的距离
db disSS(P p1,P p2,P q1,P q2){
	if(isSS(p1,p2,q2,q2)) return 0;
	return std::min({nearest(p1,p2,q1),nearest(p1,p2,q2),nearest(q1,q2,p1),nearest(q1,q2,p2)});
}
// 极角排序
// sort(p.begin(), p.end(), [&](P a, P b){
// 	int qa = a.quad(),qb = b.quad();
// 	if (qa != qb) return qa < qb;
// 	return sign(a.det(b)) > 0;
// })
std::vector<P> convexHull(std::vector<P> ps){ // need unique , <= strict , < strict
	int n = ps.size();
	if (n <= 1) return ps;
	std::sort(ps.begin(), ps.end());
	std::vector<P> qs(n * 2);
	int k = 0;
	for (int i = 0;i < n;qs[k++] = ps[i++]){
		while (k > 1 && crossOp(qs[k - 2],qs[k - 1],ps[i]) <= 0){
			k--;
		}
	}
	for (int i = n - 2,t = k;i >= 0;qs[k++] = ps[i--]){
		while (k > t && crossOp(qs[k - 2],qs[k - 1],ps[i]) <= 0){
			k--;
		}
	}
	qs.resize(k - 1);
	return qs;
}

db area(std::vector<P> ps){
	db ans = 0;
	for (int i = 0;i < ps.size();i++){
		ans += ps[i].det(ps[(i + 1) % (ps.size())]);
	}
	ans /= 2;
	return ans;
}

bool check(std::vector<P> p){
	int n = p.size();
	bool ok = true;
	double angle = 0;
	for (int i = 0; i < n; i++){
		P L = p[i] - p[(i - 1 + n) % n];
		P R = p[(i + 1) % n] - p[i];
		if (L.det(R) <= 0 || L == P(0, 0) || R == P(0, 0)){
			ok = false;
		}
	}
	return ok;
}

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);

	int n;

	std::cin >> n;
	std::vector<P> p(n);

	for (int i = 0; i < n; i++){
		p[i].read();
	}
	auto Hull = convexHull(p);
	std::map<P, int> cnt;
	for (int i = 0; i < Hull.size(); i++){
		cnt[Hull[i]] = 1;
	}
	assert(check(Hull));
	std::vector<P> inside;
	for (int i = 0; i < n; i++){
		if (cnt.find(p[i]) == cnt.end()){
			inside.push_back(p[i]);
		}	
	}
	auto select = inside;

	int m = Hull.size(), k = inside.size();
	int ans = 1;
	for (int i = 0; i < m; i++){
		P p1 = Hull[i], p2 = Hull[(i + 1) % m];
		std::vector<P> cur(2 * k);
		int begin = 0, end = -1;
		for (int j = 0; j < k; j++){
			P l = p1 - select[j], r = p2 - select[j];
			bool ok = true;
			for (int x = 0; x < k; x++){
				P tmp = select[x] - select[j];
				if (l.det(tmp) > 0 && r.det(tmp) < 0){
					ok = false;
					break;
				}
			}
			if (ok){
				ans++;
			}
		}
	}
	std::cout << ans << '\n';

	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 3708kb

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: 3620kb

input:

3
0 0
3 0
0 3

output:

1

result:

ok 1 number(s): "1"

Test #4:

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

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: 3632kb

input:

4
0 0
0 3
3 0
3 3

output:

1

result:

ok 1 number(s): "1"

Test #6:

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

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: 19ms
memory: 3664kb

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: 11ms
memory: 3688kb

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: 8ms
memory: 3688kb

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: 15ms
memory: 3940kb

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: 3ms
memory: 3696kb

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: 1ms
memory: 3608kb

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: 0ms
memory: 3876kb

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: 2ms
memory: 3868kb

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: 3ms
memory: 3636kb

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: 12ms
memory: 3688kb

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: 35ms
memory: 3744kb

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: 0
Accepted
time: 155ms
memory: 3728kb

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:

14445

result:

ok 1 number(s): "14445"

Test #19:

score: 0
Accepted
time: 531ms
memory: 3704kb

input:

2000
-587991 -165467
-530325 -5525
-574943 180654
-496535 -748102
-436469 -160646
110285 237070
-822862 -141480
-177189 327799
-424868 331309
-999274 38095
-745710 192605
-234174 -804258
586432 -176239
-626756 499109
-562606 826724
890245 455480
-32262 -298900
550800 516690
-588632 -368654
405331 -3...

output:

64358

result:

ok 1 number(s): "64358"

Test #20:

score: -100
Time Limit Exceeded

input:

2000
441575 -414673
651578 -449237
287355 -489950
606811 -30288
-733692 679481
-652568 89883
-360110 616801
190405 -368787
-352383 935855
118240 73038
-374899 -927065
-22183 -491455
-146229 638417
998825 -48442
-374469 243261
988830 149043
-778607 -291542
-277026 -167975
372912 -405043
535321 425727...

output:


result: