Submission #527836
Source Code Expand
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct BIT{
int N;
vector<int>bit;
void init(int n){
N=n;
bit.resize(N,0);
}
void inc(int k){
for(k++;k<=N;k+=k&-k)bit[k]++;
}
void dec(int k){
for(k++;k<=N;k+=k&-k)bit[k]--;
}
int sum(int k){
int ret=0;
for(k++;k;k-=k&-k)ret+=bit[k];
return ret;
}
};
struct UF{
int N;
vector<int>par,sz;
void init(int n){
N=n;
par.resize(N);
sz.resize(N,1);
for(int i=0;i<N;i++)par[i]=i;
}
int find(int x){
return x==par[x]?x:par[x]=find(par[x]);
}
void unite(int x,int y){
x=find(x);y=find(y);
if(x==y)return;
if(sz[x]<sz[y])swap(x,y);
par[y]=x;
sz[x]+=sz[y];
}
bool same(int x,int y){
return find(x)==find(y);
}
};
vector<int>G[100000];
bool used[100000];
BIT bit;
set<pair<int,int> >S;
int solve(vector<int>&vec){
int ret=0;
for(int i=0;i<vec.size();i++){
ret+=i-bit.sum(vec[i]-1);
bit.inc(vec[i]);
}
for(int i=0;i<vec.size();i++){
bit.dec(vec[i]);
}
return ret;
}
int best_swap(signed N, signed M,signed E[][2]){
for(int i=0;i<M;i++){
int a=E[i][0],b=E[i][1];
G[a].push_back(b);
G[b].push_back(a);
}
for(int i=0;i<N;i++){
sort(G[i].begin(),G[i].end());
G[i].erase(unique(G[i].begin(),G[i].end()),G[i].end());
}
UF uf;uf.init(N);
for(int i=0;i<M;i++){
int a=E[i][0],b=E[i][1];
if(S.find(pair<int,int>(min(a,b),max(a,b)))!=S.end())continue;
if(uf.same(a,b))return -1;
uf.unite(a,b);
S.insert(pair<int,int>(min(a,b),max(a,b)));
}
for(int i=0;i<N;i++){
if(G[i].size()>2)return -1;
}
int ans=0;
bit.init(N);
vector<int>vec;
for(int i=0;i<N;i++){
if(used[i]||G[i].size()>1)continue;
vec.clear();
int x=i;
while(true){
vec.push_back(x);
used[x]=true;
int y=-1;
for(int i=0;i<G[x].size();i++){
int tmp=G[x][i];
if(!used[tmp]){
y=tmp;
break;
}
}
if(y==-1)break;
x=y;
}
int val1=solve(vec);
reverse(vec.begin(),vec.end());
int val2=solve(vec);
ans+=min(val1,val2);
}
return ans;
}
/*
int N,M,E[100000][2];
signed main(){
cin>>N>>M;
for(int i=0;i<M;i++){
int a,b;
cin>>a>>b;
E[i][0]=a;E[i][1]=b;
}
cout<<best_swap(N,M,E)<<endl;
return 0;
}
*/
Submission Info
Judge Result
Set Name |
Subtask1 |
Subtask2 |
Subtask3 |
Score / Max Score |
10 / 10 |
44 / 44 |
46 / 46 |
Status |
|
|
|
Set Name |
Test Cases |
Subtask1 |
subtask1/1, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7 |
Subtask2 |
subtask1/1, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7, subtask2/1, subtask2/2, subtask2/3, subtask2/4, subtask2/5, subtask2/6 |
Subtask3 |
subtask1/1, subtask1/2, subtask1/3, subtask1/4, subtask1/5, subtask1/6, subtask1/7, subtask2/1, subtask2/2, subtask2/3, subtask2/4, subtask2/5, subtask2/6, subtask3/1, subtask3/2, subtask3/3, subtask3/4, subtask3/5, subtask3/6, subtask3/7, subtask3/8, subtask3/9 |
Case Name |
Status |
Exec Time |
Memory |
subtask1/1 |
AC |
38 ms |
3396 KB |
subtask1/2 |
AC |
35 ms |
3404 KB |
subtask1/3 |
AC |
33 ms |
3452 KB |
subtask1/4 |
AC |
33 ms |
3448 KB |
subtask1/5 |
AC |
34 ms |
3592 KB |
subtask1/6 |
AC |
37 ms |
3608 KB |
subtask1/7 |
AC |
34 ms |
3392 KB |
subtask2/1 |
AC |
43 ms |
4152 KB |
subtask2/2 |
AC |
68 ms |
6332 KB |
subtask2/3 |
AC |
178 ms |
13972 KB |
subtask2/4 |
AC |
222 ms |
17208 KB |
subtask2/5 |
AC |
238 ms |
17204 KB |
subtask2/6 |
AC |
228 ms |
17172 KB |
subtask3/1 |
AC |
64 ms |
5384 KB |
subtask3/2 |
AC |
94 ms |
8376 KB |
subtask3/3 |
AC |
91 ms |
8344 KB |
subtask3/4 |
AC |
124 ms |
10012 KB |
subtask3/5 |
AC |
197 ms |
15160 KB |
subtask3/6 |
AC |
277 ms |
16700 KB |
subtask3/7 |
AC |
342 ms |
18748 KB |
subtask3/8 |
AC |
360 ms |
20916 KB |
subtask3/9 |
AC |
60 ms |
5912 KB |