QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#846661 | #9771. Guessing Game | lunchbox | WA | 73ms | 37272kb | C++17 | 2.8kb | 2025-01-07 11:38:01 | 2025-01-07 11:38:01 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
using ar3=array<int,3>;
const int N=1e5,Q=1e6,S=N*2,L=18;
int q;
int a[Q],b[Q];
int p[S];
vector<int>g[S];
int jj[S][L],dd[S];
int c[S],f[S];
ar3 di[S];
int ans[2];
int find(int i){
return p[i]==i?i:p[i]=find(p[i]);
}
int lca(int i,int j){
if(dd[i]<dd[j])swap(i,j);
int d=dd[i]-dd[j];
for(int l=0;l<L;l++)if(l>>d&1)i=jj[i][l];
if(i==j)return i;
for(int l=L-1;l>=0;l--)if(jj[i][l]!=jj[j][l])i=jj[i][l],j=jj[j][l];
assert(jj[i][0]==jj[j][0]);
return jj[i][0];
}
int dis(int i,int j){
return dd[i]+dd[j]-2*dd[lca(i,j)];
}
ar3 operator+(ar3 a,ar3 b){
ar3 c=a[2]>b[2]?a:b;
for(int i=0;i<2;i++)for(int j=0;j<2;j++){
int u=a[i],v=b[j],d=dis(u,v);
if(d>c[2])c={u,v,d};
}
return c;
}
bool bad(ar3 a){
return ((a[2]&1)||a[0]>=N)^bool(a[2]&2);
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>q;
for(int i=0;i<q;i++)cin>>a[i]>>b[i],a[i]--,b[i]--;
iota(p,p+S,0);
for(int i=0;i<q;i++)if(find(a[i])!=find(N+b[i])){
g[a[i]].push_back(N+b[i]);
g[N+b[i]].push_back(a[i]);
int u=find(a[i]),v=find(N+b[i]);
p[u]=p[v]=u;
}
for(int i=0;i<S;i++){
static bool v[S];
if(!v[i]){
auto dfs=[&](auto dfs,int i)->void{
v[i]=1;
for(int l=1;l<L;l++)jj[i][l]=jj[jj[i][l-1]][l-1];
for(int j:g[i])if(jj[i][0]^j){
dd[j]=dd[i]+1;
jj[j][0]=i;
dfs(dfs,j);
}
};
jj[i][0]=i;
dd[i]=0;
dfs(dfs,i);
}
}
for(int i=0;i<S;i++)g[i].clear();
iota(p,p+S,0);
for(int i=0;i<q;i++){
int u=a[i],v=N+b[i];
if(!c[u])c[u]=1,di[u]={u,u,0};
if(!c[v])c[v]=1,di[v]={v,v,0};
auto dfs=[&](auto dfs,int i)->void{
c[i]=2;
for(int j:g[i])if(f[i]^j){
f[j]=i;
dfs(dfs,j);
}
};
if(c[u]==1&&c[v]==1){
int x=find(u),y=find(v);
if(x==y){
ans[bad(di[x])]++;
f[u]=-1,dfs(dfs,u);
while(~v)c[v]=3,ans[v>=N]--,v=f[v];
}else{
g[u].push_back(v);
g[v].push_back(u);
ans[bad(di[x])]++;
ans[bad(di[y])]++;
p[x]=p[y]=x;
di[x]=di[x]+di[y];
ans[bad(di[x])]--;
}
}else if(c[u]!=1&&c[v]!=1){
for(int x:{u,v})
while(c[x]!=3)c[x]=3,ans[x>=N]--,x=f[x];
}else{
if(c[u]!=1)swap(u,v);
ans[bad(di[find(u)])]++;
f[u]=v,dfs(dfs,u);
}
cout<<ans[0]<<' '<<ans[1]<<'\n';
}
}
详细
Test #1:
score: 100
Accepted
time: 5ms
memory: 30396kb
input:
4 1 1 1 2 2 1 2 2
output:
1 0 0 2 1 2 0 0
result:
ok 8 numbers
Test #2:
score: -100
Wrong Answer
time: 73ms
memory: 37272kb
input:
250000 49324 49323 44443 44445 92513 92513 69591 69591 52085 52082 95024 95025 21004 21005 34373 34371 60771 60772 17131 17134 34885 34882 6011 6015 56103 56105 21055 21054 71592 71593 14894 14895 25774 25771 96225 96224 16444 16442 48432 48432 86954 86952 7202 7202 38661 38665 20063 20063 85383 853...
output:
0 1 0 2 0 3 1 3 2 3 3 3 4 3 4 4 5 4 6 4 7 4 8 4 9 4 10 4 10 5 11 5 12 5 12 6 12 7 13 7 13 8 13 9 14 9 14 10 14 11 14 12 14 13 15 13 16 13 16 14 16 15 17 15 17 16 17 17 18 17 19 17 20 17 21 17 22 17 22 18 23 18 24 18 25 18 25 19 25 20 25 21 26 21 27 21 28 21 28 22 29 22 29 23 29 24 29 25 29 26 30 26 ...
result:
wrong answer 1st numbers differ - expected: '1', found: '0'