CODE FESTIVAL 2016 Final

Submission #6878281

Source codeソースコード

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

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;

#define fi first
#define se second
#define repl(i,a,b) for(ll i=(ll)(a);i<(ll)(b);i++)
#define rep(i,n) repl(i,0,n)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout<<#x"="<<x<<endl
#define mmax(x,y) (x>y?x:y)
#define mmin(x,y) (x<y?x:y)
#define maxch(x,y) x=mmax(x,y)
#define minch(x,y) x=mmin(x,y)
#define uni(x) x.erase(unique(all(x)),x.end())
#define exist(x,y) (find(all(x),y)!=x.end())
#define bcnt __builtin_popcountll

#define INF 1e16
#define mod 1000000007

struct UnionFind{
  vector<int> v;
  UnionFind(int n) : v(n, -1) {}
  void init(){ for(int i = 0;i < (int)v.size();i++)v[i]=-1; }
  int find(int x) { return v[x] < 0 ? x : v[x] = find(v[x]); }
  bool unite(int x, int y) {
    x = find(x); y = find(y);
    if (x == y) return false;
    if (-v[x] < -v[y]) swap(x, y);
    v[x] += v[y]; v[y] = x;
    return true;
  }
  bool root(int x) { return v[x] < 0; }
  bool same(int x, int y) { return find(x) == find(y); }
  int size(int x) { return -v[find(x)]; }
};

struct edge{
  ll u,v,cost;
};

ll n,q;
vector<ll> a,b,c;
vector<edge> es;
vector<vector<ll>> bs;

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin>>n>>q;
  a.resize(q); b.resize(q); c.resize(q);
  bs.resize(2*n);
  rep(i,q){
    cin>>a[i]>>b[i]>>c[i];
    es.push_back((edge){a[i],b[i],c[i]});
    bs[a[i]].push_back(c[i]+1);
    if(a[i]+n<2*n) bs[a[i]+n].push_back(c[i]+1);
    bs[b[i]].push_back(c[i]+2);
    if(b[i]+n<2*n) bs[b[i]+n].push_back(c[i]+2);
  }

  ll mn=INF;
  rep(i,2*n-1){
    for(ll bb : bs[i]){
      minch(mn,bb);
    }
    es.push_back((edge){i%n,(i+1)%n,mn});
    mn+=2;
  }

  sort(all(es),[](const edge& a,const edge& b){
    return a.cost < b.cost;
  });

  ll res=0;
  UnionFind uf(n);
  rep(i,es.size()){
    if(uf.unite(es[i].u,es[i].v)){
      res+=es[i].cost;
    }
  }

  cout<<res<<endl;

  return 0;
}

Submission

Task問題 G - Zigzag MST
User nameユーザ名 yamad
Created time投稿日時
Language言語 C++14 (GCC 5.4.1)
Status状態 AC
Score得点 1300
Source lengthソースコード長 2052 Byte
File nameファイル名
Exec time実行時間 265 ms
Memory usageメモリ使用量 54696 KB

Test case

Set

Set name Score得点 / Max score Cases
sample - sample-01.txt,sample-02.txt,sample-03.txt
all 1300 / 1300 sample-01.txt,sample-02.txt,sample-03.txt,01-01.txt,01-02.txt,01-03.txt,01-04.txt,01-05.txt,01-06.txt,01-07.txt,01-08.txt,01-09.txt,01-10.txt,01-11.txt,01-12.txt,01-13.txt,01-14.txt,01-15.txt,01-16.txt,01-17.txt,01-18.txt,01-19.txt,01-20.txt,01-21.txt,01-22.txt,01-23.txt,01-24.txt,01-25.txt,01-26.txt,01-27.txt,01-28.txt,01-29.txt,01-30.txt,sample-01.txt,sample-02.txt,sample-03.txt

Test case

Case name Status状態 Exec time実行時間 Memory usageメモリ使用量
01-01.txt AC 1 ms 256 KB
01-02.txt AC 75 ms 18580 KB
01-03.txt AC 239 ms 54312 KB
01-04.txt AC 46 ms 23276 KB
01-05.txt AC 51 ms 23916 KB
01-06.txt AC 43 ms 24044 KB
01-07.txt AC 40 ms 22644 KB
01-08.txt AC 43 ms 24220 KB
01-09.txt AC 52 ms 25260 KB
01-10.txt AC 142 ms 33452 KB
01-11.txt AC 206 ms 35372 KB
01-12.txt AC 250 ms 53928 KB
01-13.txt AC 259 ms 54184 KB
01-14.txt AC 259 ms 54440 KB
01-15.txt AC 265 ms 54440 KB
01-16.txt AC 254 ms 54568 KB
01-17.txt AC 265 ms 53544 KB
01-18.txt AC 122 ms 46476 KB
01-19.txt AC 42 ms 23148 KB
01-20.txt AC 42 ms 23212 KB
01-21.txt AC 92 ms 28972 KB
01-22.txt AC 237 ms 54440 KB
01-23.txt AC 229 ms 54696 KB
01-24.txt AC 62 ms 24108 KB
01-25.txt AC 154 ms 52008 KB
01-26.txt AC 46 ms 23788 KB
01-27.txt AC 57 ms 23468 KB
01-28.txt AC 146 ms 34220 KB
01-29.txt AC 193 ms 35628 KB
01-30.txt AC 230 ms 52008 KB
sample-01.txt AC 1 ms 256 KB
sample-02.txt AC 1 ms 256 KB
sample-03.txt AC 1 ms 256 KB