QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#789548 | #8941. Even or Odd Spanning Tree | BaseAI# | WA | 127ms | 46728kb | C++23 | 3.8kb | 2024-11-27 20:47:38 | 2024-11-27 20:47:49 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define Endl '\n'
#define ll long long
#define int ll
#define ls first
#define rs second
#define pii pair<int,int>
#define pb push_back
const int N=2e5+3;
const int LOGN=19;
const int INF=2e9;
int n,m;
int pre[N];
int dep[N];
int odd[LOGN+1][N],even[LOGN+1][N];
int fa[LOGN+1][N];
vector<array<int,3>> E;
vector<pii> e[N];
map<pii,int> mp;
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
int find(int x)
{
if(pre[x]==x)
{
return x;
}
return pre[x]=find(pre[x]);
}
bool join(int x,int y)
{
int fx=find(x),fy=find(y);
if(fx!=fy)
{
pre[fx]=fy;
return 1;
}
return 0;
}
void dfs(int u,int f)
{
dep[u]=dep[f]+1;
for(auto [v,w]:e[u])
{
if(v==f)continue;
if(w&1)
{
odd[0][v]=w;
even[0][v]=0;
}
else
{
odd[0][v]=0;
even[0][v]=w;
}
fa[0][v]=u;
dfs(v,u);
}
}
pii LCA(int u,int v)
{
int ODD=0,EVEN=0;
if(dep[u]<dep[v])
{
swap(u,v);
}
for(int i=LOGN;i>=0;i--)
{
if(dep[fa[i][u]]>=dep[v])
{
ODD=max(ODD,odd[i][u]);
EVEN=max(EVEN,even[i][u]);
u=fa[i][u];
}
}
if(u==v)
{
return {ODD,EVEN};
}
for(int i=LOGN;i>=0;i--)
{
if(fa[i][u]!=fa[i][v])
{
ODD=max({ODD,odd[i][u],odd[i][v]});
EVEN=max({EVEN,even[i][u],even[i][v]});
u=fa[i][u];
v=fa[i][v];
}
}
ODD=max(ODD,odd[0][u]);
EVEN=max(EVEN,even[0][u]);
return {ODD,EVEN};
}
void solve()
{
cin>>n>>m;
mp.clear();
E.clear();
init(n);
for(int i=0;i<=n;i++)
{
e[i].clear();
dep[i]=0;
}
for(int i=0;i<=LOGN;i++)
{
for(int j=0;j<=n;j++)
{
odd[i][j]=0;
even[i][j]=0;
fa[i][j]=0;
}
}
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
if(u>v)
{
swap(u,v);
}
E.pb({w,u,v});
}
sort(E.begin(),E.end());
ll ans=0;
int cnt=0;
for(auto [w,u,v]:E)
{
if(join(u,v))
{
mp[{u,v}]=w;
ans+=w;
e[u].pb({v,w});
e[v].pb({u,w});
cnt++;
}
}
if(cnt<n-1)
{
cout<<"-1 -1"<<Endl;
return;
}
dfs(1,0);
for(int i=1;i<=LOGN;i++)
{
for(int j=1;j<=n;j++)
{
odd[i][j]=max(odd[i-1][j],odd[i-1][fa[i-1][j]]);
even[i][j]=max(even[i-1][j],even[i-1][fa[i-1][j]]);
fa[i][j]=fa[i-1][fa[i-1][j]];
}
}
ll res=INF;
for(auto [w,u,v]:E)
{
auto now=mp.find({u,v});
if(now!=mp.end())
{
int ww=(*now).rs;
if(ww==w)
{
continue;
}
if(!((w-ww)&1))
{
continue;
}
res=min(res,w-ww);
continue;
}
auto [ODD,EVEN]=LCA(u,v);
if((w&1)&&EVEN)
{
res=min(res,w-EVEN);
}
else if(!(w&1)&&ODD)
{
res=min(res,w-ODD);
}
}
if(res==INF)
{
res=-1;
}
if(ans&1)
{
cout<<(res==-1?res:res+ans)<<" "<<ans<<Endl;
}
else
{
cout<<ans<<" "<<(res==-1?res:res+ans)<<Endl;
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int _=1;
cin>>_;
while(_--)
{
solve();
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 44672kb
input:
3 2 1 1 2 5 3 1 1 3 1 4 4 1 2 1 1 3 1 1 4 1 2 4 2
output:
-1 5 -1 -1 4 3
result:
ok 6 numbers
Test #2:
score: -100
Wrong Answer
time: 127ms
memory: 46728kb
input:
10000 16 50 1 2 649251632 2 3 605963017 3 4 897721528 4 5 82446151 5 6 917109168 6 7 79647183 7 8 278566178 7 9 573504723 3 10 679859251 8 11 563113083 1 12 843328546 10 13 594049160 11 14 997882839 7 15 569431750 2 16 244494799 16 7 960172373 13 4 317888322 13 3 446883598 9 3 678142319 5 8 43208692...
output:
3140067932 3191118501 1262790434 1309454727 1263932600 1307926149 1189242112 1180186165 2248358640 2277656157 3776889482 3738936375 1093500444 1058677117 3433711014 3402127725 1201099898 1187873655 1395482806 1410162043 3456885934 3486092007 3943951826 3988876469 2479987500 2535532661 2909126794 294...
result:
wrong answer 2nd numbers differ - expected: '3159441841', found: '3191118501'