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

Submission Time
Task A - 国際道迷いオリンピック(International Michimayoi Olympic)
User latte0119
Language IOI-Style C++ (GCC 5.4.1)
Score 100
Code Size 2848 Byte
Status AC
Exec Time 360 ms
Memory 20916 KB

Judge Result

Set Name Subtask1 Subtask2 Subtask3
Score / Max Score 10 / 10 44 / 44 46 / 46
Status
AC × 7
AC × 13
AC × 22
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