Submission #2125987
Source Code Expand
#include<iostream>
#include<cstring>
#include<cstdio>
#define MN 100000
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,head[MN+5],cnt=1,ans=0,f[MN+5],g[MN+5][2],Fa[MN+5],dep[MN+5],A,B,C,c[MN+5],num,mn=1e9;
struct edge{int to,next;}e[MN*2+5];
inline void ins(int f,int t)
{
e[++cnt]=(edge){t,head[f]};head[f]=cnt;
e[++cnt]=(edge){f,head[t]};head[t]=cnt;
}
inline int Abs(int x){return x<0?-x:x;}
void dfs(int x,int fa=0)
{
++g[x][f[x]];
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa)
{
if(x==A&&e[i].to==B) continue;
if(x==B&&e[i].to==A) continue;
f[e[i].to]=f[x]^1;dfs(e[i].to,x);
g[x][0]+=g[e[i].to][0];
g[x][1]+=g[e[i].to][1];
}
ans+=Abs(g[x][0]-g[x][1]);
}
void FindCircle(int x,int fa)
{
Fa[x]=fa;
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa)
{
if(dep[e[i].to]) A=x,B=e[i].to;
else dep[e[i].to]=dep[x]+1,FindCircle(e[i].to,x);
}
}
int Solve(int x)
{
int res=Abs(x);
for(int s=A;s!=C;s=Fa[s]) g[s][0]+=x;
for(int s=B;s!=C;s=Fa[s]) g[s][1]+=x;
for(int i=1;i<=n;++i) res+=Abs(g[i][0]-g[i][1]);
for(int s=A;s!=C;s=Fa[s]) g[s][0]-=x;
for(int s=B;s!=C;s=Fa[s]) g[s][1]-=x;
return mn=min(mn,res),res;
}
int main()
{
n=read();m=read();if(n&1) return 0*puts("-1");
if(m<n)
{
for(int i=1;i<n;++i) ins(read(),read());
dfs(1);
printf("%d\n",g[1][0]==g[1][1]?ans:-1);
}
else
{
for(int i=1;i<=n;++i) ins(read(),read());
FindCircle(dep[1]=1,0);
for(int x=A,y=B;x!=y;C=x=Fa[x])
if(dep[x]<dep[y]) swap(x,y);
for(int i=A;i!=C;i=Fa[i]) c[++num]=i;
c[++num]=C;int len=dep[A]+dep[B]-2*dep[C]+1;num=len;
for(int i=B;i!=C;i=Fa[i]) c[len--]=i;
dfs(1);
if(num&1) printf("%d\n",ans+Abs(g[1][0]-g[1][1])/2);
else
{
if(g[1][0]!=g[1][1]) return 0*puts("-1");
int l=-n,r=n;
while(r-l+1>2)
{
int m1=l+(r-l+1)/3,m2=m1+(r-l+1)/3;
int res1=Solve(m1),res2=Solve(m2);
if(res1<res2) r=m2-1;
else l=m1+1;
}
while(l<=r) Solve(l++);
printf("%d\n",mn);
}
}
return 0;
}
Submission Info
Submission Time |
|
Task |
A - Divide a Cuboid |
User |
FallDream |
Language |
C++14 (GCC 5.4.1) |
Score |
0 |
Code Size |
2588 Byte |
Status |
WA |
Exec Time |
2103 ms |
Memory |
256 KB |
Judge Result
Set Name |
Sample |
All |
Score / Max Score |
0 / 0 |
0 / 200 |
Status |
|
|
Set Name |
Test Cases |
Sample |
0_00.txt, 0_01.txt, 0_02.txt |
All |
0_00.txt, 0_01.txt, 0_02.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt |
Case Name |
Status |
Exec Time |
Memory |
0_00.txt |
WA |
1 ms |
256 KB |
0_01.txt |
TLE |
2103 ms |
256 KB |
0_02.txt |
WA |
1 ms |
256 KB |
1_00.txt |
TLE |
2103 ms |
256 KB |
1_01.txt |
WA |
1 ms |
256 KB |
1_02.txt |
WA |
1 ms |
256 KB |
1_03.txt |
WA |
1 ms |
256 KB |
1_04.txt |
WA |
1 ms |
256 KB |
1_05.txt |
WA |
1 ms |
256 KB |