Submission #527784


Source Code Expand

#include<bits/stdc++.h>
#define int long long
using namespace std;

struct BIT{
    int n;
    vector<int>dat;
    void init(int _n){
        n=_n;
        dat.clear();
        dat.resize(n+1,0);
    }
    void add(int k,int x){
        for(k++;k<=n;k+=k&-k)dat[k]+=x;
    }
    int sum(int k){
        int ret=0;
        for(k++;k;k-=k&-k)ret+=dat[k];
        return ret;
    }
};

struct UF{
    int n;
    vector<int>par,sz;
    void init(int _n){
        n=_n;
        par.clear();
        sz.clear();
        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];

set<pair<int,int> >S;


int solve(vector<int>vec){
    vector<int>xs;
    for(int i=0;i<vec.size();i++)xs.push_back(vec[i]);
    sort(xs.begin(),xs.end());
    for(int i=0;i<vec.size();i++){
        vec[i]=lower_bound(xs.begin(),xs.end(),vec[i])-xs.begin();
    }

    BIT bit;

    int ret=LLONG_MAX/100;
    for(int Latte=0;Latte<2;Latte++){
        bit.init(xs.size());
        int val=0;
        for(int i=0;i<vec.size();i++){
            int v=bit.sum(vec[i]-1);
            val+=i-v;
            //cout<<"**"<<i-v<<endl;
            bit.add(vec[i],1);
        }
        ret=min(ret,val);
        for(int i=0;i<vec.size();i++){
            vec[i]=xs.size()-1-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))))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;

    for(int i=0;i<N;i++){
        if(used[i]||G[i].size()!=1)continue;
        used[i]=true;
        vector<int>vec;
        vec.push_back(i);
        int v=G[i][0];
        int prev=i;
        while(G[v].size()!=1){
            int a=G[v][0],b=G[v][1];
            if(a==prev){
                vec.push_back(b);
                v=b;
            }
            else{
                vec.push_back(a);
                v=a;
            }
            used[v]=true;
        }
        vec.push_back(v);
        ans+=solve(vec);
    }

    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

Submission Time
Task A - 国際道迷いオリンピック(International Michimayoi Olympic)
User latte0119
Language IOI-Style C++ (GCC 5.4.1)
Score 0
Code Size 3209 Byte
Status CE

Compile Error

./Main.cpp: In function ‘long long int best_swap(int, int, int (*)[2])’:
./Main.cpp:98: error: could not convert ‘S.std::set<_Key, _Compare, _Alloc>::find [with _Key = std::pair<long long int, long long int>, _Compare = std::less<std::pair<long long int, long long int> >, _Alloc = std::allocator<std::pair<long long int, long long int> >](((const std::pair<long long int, long long int>&)((const std::pair<long long int, long long int>*)(& std::pair<long long int, long long int>(((const long long int&)((const long long int*)std::min [with _Tp = long long int](((const long long int&)((const long long int*)(& a))), ((const long long int&)((const long long int*)(& b)))))), ((const long long int&)((const long long int*)std::max [with _Tp = long long int](((const long long int&)((const long long int*)(& a))), ((const long long int&)((const long long int*)(& b)))))))))))’ to ‘bool’