QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#806374#4515. TrianglesqwqUwU_50 ✓2354ms3928kbC++203.5kb2024-12-09 09:11:112024-12-09 09:11:13

Judging History

This is the latest submission verdict.

  • [2024-12-09 09:11:13]
  • Judged
  • Verdict: 50
  • Time: 2354ms
  • Memory: 3928kb
  • [2024-12-09 09:11:11]
  • Submitted

answer

#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define bit(s,x) (((s)>>(x))&1)
#define pnp(s) __builtin_popcountll(s)
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
using namespace std;
typedef long long ll; 
typedef unsigned long long ull;
typedef pair<int,int> pii;
inline ll read(){
	ll x=0,f=1,c=getchar();
	while(c<'0'||c>'9')f=(c=='-'?-1:1),c=getchar();
	while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
const int N=3003;
int n;
struct P{ int x,y,id; };
struct tr{ P a[3];};
inline bool operator <(P A,P B){return A.x==B.x?A.y<B.y:A.x<B.x;}
vector<P>a;
vector<tr>b;
inline ll cr(P A,P B,P C){return 1ll*(B.x-A.x)*(C.y-A.y)-1ll*(B.y-A.y)*(C.x-A.x);}
inline ll dist(P A,P B){return 1ll*(B.x-A.x)*(B.x-A.x)+1ll*(B.y-A.y)*(B.y-A.y);}
int testid;
inline void get(vector<P>&A,vector<P>&B){
	P x=A[0],y=A[1];
	auto w1=min_element(B.begin(),B.end(),[&](P A,P B){return cr(y,A,B)?cr(y,A,B)>0:dist(y,A)<dist(y,B);});
	auto w2=min_element(B.begin(),B.end(),[&](P A,P B){return cr(y,A,B)?cr(y,A,B)<0:dist(y,A)<dist(y,B);});
	auto w=cr(x,y,*w1)<0?w1:w2;
	b.pb({x,y,*w});
	A.erase(A.begin()),A.erase(A.begin()),B.erase(w);
}
inline bool cross(P a1,P b1,P a2,P b2){
	if(!cr(a1,b1,a2)||!cr(a1,b1,b2)||!cr(a2,b2,a1)||!cr(a2,b2,b1)){
		return !cr(a1,b1,a2)&&!cr(a1,b1,b2)&&min(a2,b2)<max(a1,b1)&&min(a1,b1)<max(a2,b2);
	}
	return ((cr(a1,b1,a2)>0)^(cr(a1,b1,b2)>0))&&((cr(a2,b2,a1)>0)^(cr(a2,b2,b1)>0));
}
inline bool ck(tr A,tr B){
	rep(i,0,2)rep(j,i+1,2)rep(k,0,2)rep(l,k+1,2){
		bool fl=cross(A.a[i],A.a[j],B.a[k],B.a[l]);
		if(fl)return 1;
	}
	return 0;
}
inline void print(){
	printf("Case #%d: %ld\n",testid,b.size());
	for(tr A:b)printf("%d %d %d\n",A.a[0].id,A.a[1].id,A.a[2].id);
	//rep(i,0,(int)b.size()-1)rep(j,0,i-1) assert(!ck(b[i],b[j]));
	a.clear(),b.clear();
}
inline void solve(){
	++testid;
	n=read();
	rep(i,1,n){
		int x=read(),y=read();
		a.pb({x,y,i});
	}
	sort(a.begin(),a.end());
	while(a.size()>=3){
		P x=a[0],y=a[1];
		auto w1=min_element(a.begin()+2,a.end(),[&](P A,P B){return cr(y,A,B)?cr(y,A,B)>0:dist(y,A)<dist(y,B);});
		auto w2=min_element(a.begin()+2,a.end(),[&](P A,P B){return cr(y,A,B)?cr(y,A,B)<0:dist(y,A)<dist(y,B);});
		auto w=a.end();
		if(cr(x,y,*w1)<0)w=w1;
		else if(cr(x,y,*w2)>0)w=w2;
		else break;
		b.pb({x,y,*w});
		a.erase(w);a.erase(a.begin());a.erase(a.begin());
	}
	if(a.size()<3){print();return;}
	P x=a[0],y=a[1];
	vector<P>A=a,B,C;
	while(A.size()%3)A.pop_back();
	while(b.size()&&A.size()>2*(B.size()+C.size())){
		tr res=b.back();b.pop_back();
		rep(d,0,2){
			P p=res.a[d];
			if(cr(x,y,p)==0)A.pb(p);
			else if(cr(x,y,p)>0)B.pb(p);
			else C.pb(p);
		}
	}
	while(A.size()>2*(B.size()+C.size()))A.pop_back();
	sort(A.begin(),A.end());
	if(B.size()>C.size())swap(B,C);
	if(A.size()==2*(B.size()+C.size())){
		while(B.size())get(A,B);
		while(C.size())get(A,C);
	}
	else{
		while(A.size()>3&&B.size())get(A,B);
		while(A.size()>3&&C.size())get(A,C);
		for(P x:B)A.pb(x);
		for(P x:C)A.pb(x);
		assert(A.size()==6);
		rep(i,0,5)rep(j,i+1,5)rep(k,j+1,5){
			bool vis[6]={0};vis[i]=vis[j]=vis[k]=1;
			int x=0;while(vis[x])++x;
			int y=x+1;while(vis[y])++y;
			int z=y+1;while(vis[z])++z;
			if(cr(A[i],A[j],A[k])&&cr(A[x],A[y],A[z])&&!ck({A[i],A[j],A[k]},{A[x],A[y],A[z]})){
				b.pb({A[i],A[j],A[k]});
				b.pb({A[x],A[y],A[z]});
				print();return ;
			}
		}
	}
	print();
}
int main() {
    //freopen("data.in", "r", stdin);
    //freopen("myans.out","w",stdout);
	int T=read();while(T--)solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Pretests


Final Tests

Test #1:

score: 8
Accepted
time: 0ms
memory: 3820kb

input:

100
10
220238472 224691753
770968360 1070897
222060078 225731229
213423928 -699125511
571809960 -531790999
-29325160 82281481
523892900 397968241
134123366 175551277
-48116654 71558357
79192162 144205493
6
-800120306 681957950
-800120120 681958048
-800120239 681957972
-800120068 681958102
-800120280...

output:

Case #1: 3
9 6 4
10 8 5
1 3 2
Case #2: 2
1 5 3
6 2 4
Case #3: 4
11 7 12
4 8 3
6 10 9
1 2 5
Case #4: 0
Case #5: 2
6 1 4
2 3 5
Case #6: 3
1 7 4
9 5 2
8 3 6
Case #7: 2
7 3 1
5 2 4
Case #8: 3
2 7 1
10 6 9
3 4 8
Case #9: 4
11 3 9
4 5 2
12 6 10
8 7 1
Case #10: 2
4 5 1
3 6 2
Case #11: 4
11 8 5
9 10 12
1 4 ...

result:

ok  (100 test cases)

Test #2:

score: 42
Accepted
time: 2354ms
memory: 3928kb

input:

100
3000
-92089322 -224238223
-92147554 -225776486
-91601000 -225100640
-92024176 -225644144
-90703509 -224917680
-89202055 -225283952
-92681755 -224149407
-92347180 -225441739
-92259568 -225588653
-91979455 -224254694
-92673281 -224244242
-92527577 -224172521
-90804449 -224883170
-92641474 -2249482...

output:

Case #1: 1000
2743 436 1593
169 2938 1759
2812 2792 2457
46 624 2409
2863 424 999
1335 2697 238
311 2919 1095
1332 787 1523
1515 1042 534
1830 2114 1336
2496 916 275
2666 2023 1297
1693 2685 2234
589 2755 1087
1182 533 2173
2993 2386 2184
1185 1958 2878
2232 2584 764
235 1570 2911
747 2850 1713
57 2...

result:

ok  (100 test cases)