QOJ.ac
QOJ
ID | Submission ID | Problem | Hacker | Owner | Result | Submit time | Judge time |
---|---|---|---|---|---|---|---|
#970 | #639316 | #9458. Triangulation | hos_lyric | 275307894a | Failed. | 2024-10-13 20:24:21 | 2024-10-13 20:24:21 |
Details
Extra Test:
Accepted
time: 488ms
memory: 64880kb
input:
70 18 0 999919 58823 999936 117646 999951 176469 999964 235292 999975 294115 999984 352938 999991 411761 999996 470584 999999 529407 1000000 588230 999999 647053 999996 705876 999991 764699 999984 823522 999975 882345 999964 941168 999951 999991 999936 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0...
output:
0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 35357670 0 3...
result:
ok 70 lines
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#639316 | #9458. Triangulation | 275307894a | AC ✓ | 89ms | 101664kb | C++14 | 3.7kb | 2024-10-13 18:56:46 | 2024-10-13 18:56:50 |
answer
#include<bits/stdc++.h>
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define eb emplace_back
#define all(x) x.begin(),x.end()
using namespace std;using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned long long;using pii=pair<int,int>;
const int N=18+5,M=(1<<18)+5,K=1000+5,mod=1e9+7,Mod=mod-1;const db eps=1e-9;const int INF=1e9+7;mt19937 rnd(263082);
#define Tp template<typename T>
#define Ts template<typename T,typename... Ar>
namespace Debug{
Tp void _debug(char* f,T t){cerr<<f<<'='<<t<<endl;}
Ts void _debug(char* f,T x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);}
#ifdef LOCAL
#define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__)
#else
#define gdb(...) void()
#endif
}using namespace Debug;
int n;
using cp=complex<db>;
cp A[N];
db cross(cp x,cp y){return x.real()*y.imag()-x.imag()*y.real();}
bool above(cp x,cp y,cp z){return cross(y-x,z-y)>0;}
int st[N],sh;
int p[N];
struct info{
int x;ll w;
info operator +(const info &B){
if(x^B.x) return x<B.x?(info){x,w}:B;
return (info){x,w+B.w};
}
}f[M][19];
int S,T;
vector<int> p1[N][N],w1[N][N];
int p2[N][N][N],w2[N][N][N];
int B[N][N];
int vis[M][19];
bool check(int x,int y,int z){
for(int a=1;a<=n;a++) if(a^x&&a^y&&a^z&&above(A[x],A[y],A[a])&&above(A[y],A[z],A[a])&&above(A[z],A[x],A[a])) return 0;
return 1;
}
info dfs(int msk,int x){
if(msk==T) return (info){0,1};
if(x==n) return (info){INF,0};
if(vis[msk][x]) return f[msk][x];
int y=x+__builtin_ctz(msk>>x)+1;
f[msk][x]=dfs(msk,y);
for(int i=0;i<p1[x][y].size();i++){
auto w=dfs(msk|(1<<p1[x][y][i]-1),x);
w.x+=w1[x][y][i];
f[msk][x]=f[msk][x]+w;
}
if(x^1){
int z=__lg(msk&((1<<x-1)-1))+1;
if(p2[z][x][y]==1){
auto w=dfs(msk^(1<<x-1),z);
w.x+=w2[z][x][y];
f[msk][x]=f[msk][x]+w;
}
}
vis[msk][x]=1;
gdb(msk,x,f[msk][x].x);
return f[msk][x];
}
void Solve(){
scanf("%d",&n);
db ap=rnd();
for(int i=1;i<=n;i++){
int x,y;scanf("%d%d",&x,&y);
A[i]=cp(x*cos(ap)+y*sin(ap),y*cos(ap)-x*sin(ap));
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&B[i][j]);
map<db,int> f;
for(int i=1;i<=n;i++) f[A[i].real()]=i;
sort(A+1,A+n+1,[](cp x,cp y){return x.real()<y.real();});
for(int i=1;i<=n;i++) p[i]=f[A[i].real()];
st[sh=1]=1;
for(int i=2;i<=n;i++){
while(sh>1&&!above(A[st[sh-1]],A[st[sh]],A[i])) sh--;
st[++sh]=i;
}
for(int i=1;i<=n;i++) cerr<<A[i].real()<<' '<<A[i].imag()<<'\n';
S=0,T=0;
for(int i=1;i<=sh;i++) S|=1ll<<st[i]-1;
int tot=0;
for(int i=1;i<sh;i++) tot+=B[p[st[i]]][p[st[i+1]]];
st[sh=1]=n;
for(int i=n-1;i;i--){
while(sh>1&&!above(A[st[sh-1]],A[st[sh]],A[i])) sh--;
st[++sh]=i;
}
for(int i=1;i<=sh;i++) T|=1ll<<st[i]-1;
gdb(above(A[2],A[4],A[3]));
for(int x=1;x<=n;x++) for(int y=x+1;y<=n;y++){
p1[x][y].clear();w1[x][y].clear();
for(int z=x+1;z<y;z++) if(above(A[x],A[y],A[z])&&check(x,y,z)){
p1[x][y].push_back(z);
w1[x][y].push_back(B[p[x]][p[z]]+B[p[z]][p[y]]);
gdb(x,y,z);
}
}
gdb(S,T);
for(int x=1;x<=n;x++) for(int y=x+1;y<=n;y++){
for(int z=y+1;z<=n;z++){
if(above(A[x],A[y],A[z])){
if(check(x,y,z)) p2[x][y][z]=1,w2[x][y][z]=B[p[x]][p[z]];
else p2[x][y][z]=-1;
}
else p2[x][y][z]=-1;
}
}
Me(vis,0);
info w=dfs(S,1);
w.x+=tot;
printf("%d %lld\n",w.x,w.w);
}
int main(){
int t=1;
scanf("%d",&t);
while(t--) Solve();
cerr<<clock()*1.0/CLOCKS_PER_SEC<<'\n';
}