QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#554327 | #9241. Sphinx | lgvc | 0 | 0ms | 0kb | C++23 | 4.2kb | 2024-09-09 10:19:26 | 2024-09-09 10:19:27 |
answer
#include<bits/stdc++.h>
using namespace std;
#include "sphinx.h"
int n,m;
vector<int>C,G;
int fa[255],u[100005],v[100005];
int findfather(int x){
return x==fa[x]?x:fa[x]=findfather(fa[x]);
}
int aa[255];
int findaa(int x){
return x==aa[x]?x:aa[x]=findaa(aa[x]);
}
bool fff=0;int ct=0;
int qqq(std::vector<int> x) {
ct++;
if(ct>=27501) {
fff=1;
return 0;
}
int tx=perform_experiment(x);
return tx;
}
vector<int>gg[255];
int ss[255],vist[255],tt,I;
int query(int l,int r){
for(int i=0;i<n;++i)vist[i]=0,aa[i]=i,C[i]=n;
for(int i=l;i<=r;++i)for(auto cu:gg[ss[i]])vist[cu]=1,C[cu]=-1;
vist[I]=1,C[I]=-1;
for(int i=0;i<m;++i)if(!vist[u[i]]&&!vist[v[i]]){
int fu=findaa(u[i]),fv=findaa(v[i]);
if(fu!=fv)aa[fu]=fv;
}
int cnt=0;
for(int i=0;i<n;++i)if(!vist[i]&&aa[i]==i)++cnt;
return r-l+1+1+cnt-qqq(C);
}
double ef=0.382;
void solve(int l,int r,int k){
if(!k)return;
if(l==r){
fa[ss[l]]=I;
return;
}
int mid=(l+r)>>1;
mid=min(r+0.0,l+ef*(r-l));
int k1=query(l,mid);
solve(l,mid,k1);
solve(mid+1,r,k-k1);
}
int s1[255],s2[255];
vector<int>g[255];
int dep[255];
void dfs(int x){
vist[x]=1;
for(auto cu:g[x])if(!vist[cu]){
dep[cu]=dep[x]+1;
dfs(cu);
}
}
int p[255],v1[255],v2[255],ss1[255],ss2[255];
int query1(int l,int r,int d){
for(int i=0;i<n;++i)vist[i]=0,aa[i]=i,C[i]=d;
for(int i=l;i<=r;++i)for(auto cu:gg[ss1[i]])vist[cu]=1,C[cu]=-1;
for(int i=0;i<m;++i)if(!vist[u[i]]&&!vist[v[i]]){
int fu=findaa(u[i]),fv=findaa(v[i]);
if(fu!=fv)aa[fu]=fv;
}
int cnt=0;
for(int i=0;i<n;++i)if(!vist[i]&&aa[i]==i)++cnt;
return r-l+1+cnt-qqq(C);
}
int query2(int l,int r,int d){
for(int i=0;i<n;++i)vist[i]=0,aa[i]=i,C[i]=d;
for(int i=l;i<=r;++i)for(auto cu:gg[ss2[i]])vist[cu]=1,C[cu]=-1;
for(int i=0;i<m;++i)if(!vist[u[i]]&&!vist[v[i]]){
int fu=findaa(u[i]),fv=findaa(v[i]);
if(fu!=fv)aa[fu]=fv;
}
int cnt=0;
for(int i=0;i<n;++i)if(!vist[i]&&aa[i]==i)++cnt;
return r-l+1+cnt-qqq(C);
}
void solve1(int l,int r,int d){
if(l==r){
G[ss1[l]]=d;v1[ss1[l]]=1;
return;
}
int mid=min(r+0.0,l+(r-l)*ef);
int f1=query1(l,mid,d);
if(!f1){
solve1(mid+1,r,d);
}else{
solve1(l,mid,d);
if(query1(mid+1,r,d))solve1(mid+1,r,d);
}
}
void solve2(int l,int r,int d){
if(l==r){
G[ss2[l]]=d;v2[ss2[l]]=1;
return;
}
int mid=min(r+0.0,l+(r-l)*ef);
int f1=query2(l,mid,d);
if(!f1){
solve2(mid+1,r,d);
}else{
solve2(l,mid,d);
if(query2(mid+1,r,d))solve2(mid+1,r,d);
}
}
vector<int>find_colours(int N,vector<int>X,vector<int>Y){
n=N;m=X.size();
C.resize(n);G.resize(n);
for(int i=0;i<m;++i){
u[i]=X[i],v[i]=Y[i];
}
for(int i=0;i<n;++i)fa[i]=i;
for(int i=0;i<n;++i)p[i]=i;
mt19937 mt(1725848345);
if(m>n-1) {
shuffle(p,p+n,mt);
for(int x=1;x<n;++x){
int i=p[x];
I=i;
for(int j=0;j<x;++j)gg[p[j]].clear();
for(int j=0;j<x;++j){
gg[findfather(p[j])].emplace_back(p[j]);
}
tt=0;
for(int j=0;j<x;++j)if(gg[p[j]].size())ss[++tt]=p[j];
solve(1,tt,query(1,tt));
}
}
for(int j=0;j<n;++j)gg[j].clear();
for(int j=0;j<n;++j){
gg[findfather(j)].emplace_back(j);
}
for(int i=0;i<n;++i)g[i].clear();
for(int i=0;i<m;++i)if(findfather(u[i])!=findfather(v[i])){
int fu=fa[u[i]],fv=fa[v[i]];
g[fu].emplace_back(fv);
g[fv].emplace_back(fu);
}
int r=findfather(0);
for(int i=0;i<n;++i)vist[i]=0;
dep[r]=0;dfs(r);
int t1=0,t2=0;
for(int i=0;i<n;++i)if(fa[i]==i){
if(dep[i]%2)s1[++t1]=i;
else s2[++t2]=i;
}
if(t1+t2==1){
for(int i=0;i<n;++i){
for(int j=0;j<n;++j)G[j]=(j==0?-1:i);
if(qqq(G)==1){
for(int j=0;j<n;++j)G[j]=i;
break;
}
}
return G;
}
for(int i=0;i<n;++i)v1[i]=v2[i]=0;
for(int i=0;i<n;++i)p[i]=i;
shuffle(p,p+n,mt);
printf("%d %d\n",t1,t2);
for(int dd=0;dd<n;++dd){
int d=p[dd];
int tt1=0,tt2=0;
for(int i=1;i<=t1;++i)if(!v1[s1[i]]){
ss1[++tt1]=s1[i];
}
for(int i=1;i<=t2;++i)if(!v2[s2[i]]){
ss2[++tt2]=s2[i];
}
shuffle(ss1+1,ss1+tt1+1,mt);
shuffle(ss2+1,ss2+tt2+1,mt);
if(tt1&&query1(1,tt1,d))solve1(1,tt1,d);
if(tt2&&query2(1,tt2,d))solve2(1,tt2,d);
}
if(fff) for(int i=0;i<n;i++) G[i]=fa[i];
else for(int i=0;i<n;++i)G[i]=G[fa[i]];
return G;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Runtime Error
Test #1:
score: 0
Runtime Error
input:
1978433568 2 1 0 1
output:
1 1 877694080 0 -1
result:
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Runtime Error
Test #34:
score: 0
Runtime Error
input:
1978433568 250 249 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 ...
output:
125 125 877694080 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 90 -1 ...
result:
Subtask #4:
score: 0
Runtime Error
Test #43:
score: 0
Runtime Error
input:
1978433568 250 31125 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 20 0 21 0 22 0 23 0 24 0 25 0 26 0 27 0 28 0 29 0 30 0 31 0 32 0 33 0 34 0 35 0 36 0 37 0 38 0 39 0 40 0 41 0 42 0 43 0 44 0 45 0 46 0 47 0 48 0 49 0 50 0 51 0 52 0 53 0 54 0 55 0 56 0 57 0 5...
output:
877694080 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 -1 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250...
result:
Subtask #5:
score: 0
Skipped
Dependency #1:
0%