Submission #1040901
Source Code Expand
#include<bits/stdc++.h>
#define REP(i,m) for(int i=0;i<(m);++i)
#define REPN(i,m,in) for(int i=(in);i<(m);++i)
#define ALL(t) (t).begin(),(t).end()
#define CLR(a) memset((a),0,sizeof(a))
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
using namespace std;
#ifdef DEB
#define dump(x) cerr << #x << " = " << (x) << endl
#define prl cerr<<"called:"<< __LINE__<<endl
#define dumpR(x) cerr<<"\x1b[31m"<<#x<<" = " <<(x)<<"\x1b[39m"<<endl
#define dumpY(x) cerr<<"\x1b[33m"<<#x<<" = " <<(x)<<"\x1b[39m"<<endl
#define dumpG(x) cerr<<"\x1b[32m"<<#x<<" = " <<(x)<<"\x1b[39m"<<endl
template<class T> void debug(T a,T b){ for(;a!=b;++a) cerr<<*a<<' ';cerr<<endl;}
#else
#define dump(x) ;
#define dumpR(x) ;
#define dumpY(x) ;
#define dumpG(x) ;
#define prl ;
template<class T> void debug(T a,T b){ ;}
#endif
template<class T> void chmin(T& a,const T& b) { if(a>b) a=b; }
template<class T> void chmax(T& a,const T& b) { if(a<b) a=b; }
typedef long long int lint;
typedef pair<lint,lint> pi;
namespace std{
template<class S,class T>
ostream &operator <<(ostream& out,const pair<S,T>& a){
out<<'('<<a.fr<<','<<a.sc<<')';
return out;
}
}
//const int INF=5e8;
int n,m;
vector<int> g[100005];
void ng(){
puts("-1");
exit(0);
}
pi dfs(int v,int p){
int cost=0,flip=0;
for(auto to:g[v]){
if(to==p) continue;
pi nxt=dfs(to,v);
cost+=nxt.fr;
flip+=nxt.sc;
}
if(flip==1) return mp(cost,0);
else return mp(cost+abs(flip-1),1-flip);
}
void solve1(){
REP(i,n-1){
int a,b;scanf("%d%d",&a,&b);--a;--b;
g[a].pb(b);
g[b].pb(a);
}
pi res=dfs(0,-1);
if(res.sc) ng();
printf("%lld\n",res.fr);
}
struct uf{
static const int MAXN=100005;
int par[MAXN];
int size[MAXN];
void init(){
memset(par,-1,sizeof(par));
REP(i,MAXN) size[i]=1;
}
int root(int a){
if(par[a]==-1) return a;
return par[a]=root(par[a]);
}
void unite(int a,int b){
a=root(a);b=root(b);
if(a==b) return;
if(size[a]<size[b]) swap(a,b);
par[b]=a;
size[a]+=size[b];
}
bool same(int a,int b){
return root(a)==root(b);
}
};
uf u;
vector<int> path,ever;
bool inCycle[100005];
void findpath(int a,int p,int b){
ever.pb(a);
if(a==b){
path=ever;
}
for(auto to:g[a]){
if(to==p) continue;
findpath(to,a,b);
}
ever.pop_back();
}
pi dfs2(int v,int p){
int cost=0,flip=0;
for(auto to:g[v]){
if(to==p || inCycle[to]) continue;
pi nxt=dfs2(to,v);
cost+=nxt.fr;
flip+=nxt.sc;
}
if(flip==1) return mp(cost,0);
else return mp(cost+abs(flip-1),1-flip);
}
pi es[100005];
void massert(bool a){
if(!a) while(1){};
}
void solve2(){
u.init();
REP(i,m){
int a,b;scanf("%d%d",&a,&b);--a;--b;
es[i]=mp(a,b);
if(u.same(a,b)){
findpath(a,-1,b);
}else{
u.unite(a,b);
g[a].pb(b);
g[b].pb(a);
}
}
debug(ALL(path));
for(auto e:path) inCycle[e]=1;
REP(i,n) g[i].clear();
REP(i,m){
int a=es[i].fr,b=es[i].sc;
if(!inCycle[a] || !inCycle[b]){
g[a].pb(b);
g[b].pb(a);
}
}
lint res=0,sum=0;
vector<lint> ar(path.size());
REP(i,path.size()){
int v=path[i];
pi nxt=dfs2(v,-1);
dump(nxt);
nxt.fr-=abs(nxt.sc);
res+=nxt.fr;
ar[i]=nxt.sc;
sum+=ar[i];
}
if(sum&1) ng();
dump(res);
int n2=ar.size();
vector<lint> prev=ar;
debug(ALL(ar));
REP(i,n2-1){
ar[i+1]-=ar[i];
}
res+=abs(ar[n2-1])/2;
if(ar[n2-1]!=0 && n2%2==0) ng();
if(n2&1){
debug(ALL(ar));
prev[0]-=ar[n2-1]/2;
prev[n2-1]-=ar[n2-1]/2;
ar=prev;
debug(ALL(prev));
REP(i,n2-1){
ar[i+1]-=ar[i];
res+=abs(ar[i]);
dump(res);
}
}else{
ar=prev;
pi val=mp(1,ar[0]);
vector<lint> pivs;pivs.pb(0);
REP(i,n2-1){
dump(val);
pivs.pb(-val.sc*val.fr);
pi nxt=mp(-val.fr,ar[i+1]-val.sc);
val=nxt;
}
dump(val);
sort(ALL(pivs));
debug(ALL(pivs));
lint v=pivs[n2/2];
REP(i,n2) res+=abs(pivs[i]-v);
}
cout<<res<<endl;
}
int main(){
cin>>n>>m;
if(n&1) ng();
if(m==n-1) solve1();
else solve2();
return 0;
}
Submission Info
Submission Time
2016-12-25 17:51:05+0900
Task
F - Namori
User
hogloid
Language
C++14 (GCC 5.4.1)
Score
2200
Code Size
4353 Byte
Status
AC
Exec Time
67 ms
Memory
19448 KB
Compile Error
./Main.cpp: In function ‘void solve1()’:
./Main.cpp:66:32: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int a,b;scanf("%d%d",&a,&b);--a;--b;
^
./Main.cpp: In function ‘void solve2()’:
./Main.cpp:136:32: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int a,b;scanf("%d%d",&a,&b);--a;--b;
^
Judge Result
Set Name
Sample
Subtask1
All
Score / Max Score
0 / 0
1500 / 1500
700 / 700
Status
Set Name
Test Cases
Sample
0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt
Subtask1
0_00.txt, 0_01.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt
All
0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 2_00.txt, 2_01.txt, 2_02.txt, 2_03.txt, 2_04.txt, 2_05.txt, 2_06.txt, 2_07.txt, 2_08.txt, 2_09.txt, 2_10.txt, 2_11.txt, 2_12.txt, 2_13.txt, 2_14.txt, 2_15.txt, 2_16.txt, 2_17.txt, 2_18.txt, 2_19.txt, 2_20.txt, 2_21.txt, 2_22.txt, 2_23.txt, 2_24.txt, 2_25.txt, 2_26.txt, 2_27.txt, 2_28.txt, 2_29.txt, 2_30.txt, 2_31.txt, 2_32.txt, 2_33.txt, 2_34.txt, 2_35.txt, 2_36.txt, 2_37.txt, 2_38.txt, 2_39.txt, 2_40.txt, 2_41.txt, 2_42.txt, 2_43.txt
Case Name
Status
Exec Time
Memory
0_00.txt
AC
5 ms
2560 KB
0_01.txt
AC
5 ms
2560 KB
0_02.txt
AC
6 ms
3328 KB
0_03.txt
AC
6 ms
3328 KB
1_00.txt
AC
5 ms
2560 KB
1_01.txt
AC
51 ms
11776 KB
1_02.txt
AC
40 ms
7680 KB
1_03.txt
AC
33 ms
6136 KB
1_04.txt
AC
45 ms
8576 KB
1_05.txt
AC
45 ms
8320 KB
1_06.txt
AC
46 ms
8320 KB
1_07.txt
AC
44 ms
7680 KB
1_08.txt
AC
46 ms
8832 KB
1_09.txt
AC
39 ms
6016 KB
1_10.txt
AC
40 ms
5888 KB
1_11.txt
AC
42 ms
5888 KB
1_12.txt
AC
44 ms
5760 KB
1_13.txt
AC
5 ms
2560 KB
1_14.txt
AC
43 ms
5888 KB
1_15.txt
AC
43 ms
5760 KB
1_16.txt
AC
5 ms
2560 KB
1_17.txt
AC
43 ms
5760 KB
2_00.txt
AC
6 ms
3328 KB
2_01.txt
AC
66 ms
19448 KB
2_02.txt
AC
54 ms
14076 KB
2_03.txt
AC
39 ms
8440 KB
2_04.txt
AC
62 ms
14076 KB
2_05.txt
AC
62 ms
13948 KB
2_06.txt
AC
62 ms
13948 KB
2_07.txt
AC
61 ms
13948 KB
2_08.txt
AC
62 ms
13948 KB
2_09.txt
AC
51 ms
8320 KB
2_10.txt
AC
51 ms
8192 KB
2_11.txt
AC
53 ms
8192 KB
2_12.txt
AC
54 ms
8064 KB
2_13.txt
AC
5 ms
2560 KB
2_14.txt
AC
58 ms
8704 KB
2_15.txt
AC
60 ms
8320 KB
2_16.txt
AC
5 ms
2560 KB
2_17.txt
AC
53 ms
8192 KB
2_18.txt
AC
5 ms
2560 KB
2_19.txt
AC
54 ms
13436 KB
2_20.txt
AC
40 ms
8440 KB
2_21.txt
AC
67 ms
19448 KB
2_22.txt
AC
58 ms
13568 KB
2_23.txt
AC
61 ms
13564 KB
2_24.txt
AC
60 ms
13436 KB
2_25.txt
AC
57 ms
13692 KB
2_26.txt
AC
59 ms
13440 KB
2_27.txt
AC
53 ms
8448 KB
2_28.txt
AC
52 ms
8192 KB
2_29.txt
AC
51 ms
8320 KB
2_30.txt
AC
53 ms
8192 KB
2_31.txt
AC
5 ms
2560 KB
2_32.txt
AC
58 ms
8576 KB
2_33.txt
AC
57 ms
8192 KB
2_34.txt
AC
5 ms
2560 KB
2_35.txt
AC
54 ms
8192 KB
2_36.txt
AC
39 ms
8440 KB
2_37.txt
AC
39 ms
8440 KB
2_38.txt
AC
38 ms
8440 KB
2_39.txt
AC
39 ms
8440 KB
2_40.txt
AC
39 ms
8440 KB
2_41.txt
AC
39 ms
8440 KB
2_42.txt
AC
39 ms
8440 KB
2_43.txt
AC
38 ms
8440 KB