QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#806374 | #4515. Triangles | qwqUwU_ | 50 ✓ | 2354ms | 3928kb | C++20 | 3.5kb | 2024-12-09 09:11:11 | 2024-12-09 09:11:13 |
Judging History
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;
}
详细
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)