Submission #1551022


Source Code Expand

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

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

#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 each(itr,v) for(auto itr:v)
#define pb push_back
#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_popcount

#define INF 1e16

vector<P> g[2020];

struct UnionFind{
  vector<int> v;
  UnionFind(int n) : v(n, -1) {}
  void init(){ for(int i = 0;i < 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 UnionFind2{
  vector<int> v;
  vector<ll> vs[2020];
  set<PPI> es[2020];
  UnionFind2(int n) : v(n, -1) {}
  void init(){
    for(int i = 0;i < v.size();i++){
      vs[i].clear();
      es[i].clear();
      vs[i].push_back(i);
    }
    for(int i = 0;i < 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;

    //dbg(x); dbg(y);

    if(es[x].size()<es[y].size())swap(es[x],es[y]);

    for(PPI tmp : es[y]){
      es[x].insert(tmp);
    }

    for(ll b : vs[y])for(P tmp : g[b]){
      if(find(tmp.fi)!=find(x))continue;
      es[x].insert(PPI(tmp.se,P(min(b,tmp.fi),max(b,tmp.fi))));
    }

    for(ll tmp : vs[y]){
      vs[x].push_back(tmp);
      //dbg(tmp);
    }

    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)]; }
  ll query(ll x){
    set<PPI> tmp;
    x=(ll)find(x);
    ll siz=size(x);
    UnionFind uf(v.size());
    ll res=0;
    for(PPI e : es[x]){
      if(uf.same(e.se.fi,e.se.se)||uf.size(x)==siz){
        tmp.insert(e);
        continue;
      }
      res+=e.fi;
      uf.unite(e.se.fi,e.se.se);
    }
    for(PPI e : tmp)es[x].erase(e);
    if(uf.size(x)<siz)return INF;
    else return res;
  }
};

ll n,m;

int main(){
  scanf("%lld%lld",&n,&m);
  rep(i,m){
    ll a,b,c;
    scanf("%lld%lld%lld",&a,&b,&c);
    g[a].push_back(P(b,c));
    g[b].push_back(P(a,c));
  }
  UnionFind2 uf(n);
  uf.init();
  ll q;
  scanf("%lld",&q);
  while(q--){
    ll a,b;
    scanf("%lld%lld",&a,&b);
    uf.unite(a,b);
    ll res=uf.query(a);
    if(res==INF)printf("IMPOSSIBLE\n");
    else printf("%lld\n", res);
  }
	return 0;
}

Submission Info

Submission Time
Task F - 魔法の糸
User yamad
Language C++14 (GCC 5.4.1)
Score 200
Code Size 3157 Byte
Status AC
Exec Time 180 ms
Memory 10496 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:112:26: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld",&n,&m);
                          ^
./Main.cpp:115:35: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld%lld%lld",&a,&b,&c);
                                   ^
./Main.cpp:122:19: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld",&q);
                   ^
./Main.cpp:125:28: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld%lld",&a,&b);
                            ^

Judge Result

Set Name All
Score / Max Score 200 / 200
Status
AC × 31
Set Name Test Cases
All 00-sample1, 00-sample2, 01-random-small-tree01, 01-random-small-tree02, 02-random-small-sparse01, 02-random-small-sparse02, 02-random-small-sparse03, 03-random-small-dense01, 03-random-small-dense02, 03-random-small-dense03, 03-random-small-dense04, 03-random-small-dense05, 11-random-large-tree01, 11-random-large-tree02, 11-random-large-tree03, 12-random-large-sparse01, 12-random-large-sparse02, 12-random-large-sparse03, 13-random-large-denseA01, 13-random-large-denseA02, 13-random-large-denseA03, 13-random-large-denseA04, 14-random-large-denseB01, 14-random-large-denseB02, 14-random-large-denseB03, 14-random-large-denseB04, 15-random-large-denseC01, 15-random-large-denseC02, 20-kill-naive, 21-kill-loop, 23-min
Case Name Status Exec Time Memory
00-sample1 AC 1 ms 384 KB
00-sample2 AC 1 ms 384 KB
01-random-small-tree01 AC 1 ms 384 KB
01-random-small-tree02 AC 1 ms 512 KB
02-random-small-sparse01 AC 2 ms 512 KB
02-random-small-sparse02 AC 2 ms 512 KB
02-random-small-sparse03 AC 2 ms 512 KB
03-random-small-dense01 AC 3 ms 640 KB
03-random-small-dense02 AC 3 ms 640 KB
03-random-small-dense03 AC 3 ms 640 KB
03-random-small-dense04 AC 3 ms 640 KB
03-random-small-dense05 AC 3 ms 512 KB
11-random-large-tree01 AC 25 ms 768 KB
11-random-large-tree02 AC 25 ms 768 KB
11-random-large-tree03 AC 25 ms 768 KB
12-random-large-sparse01 AC 50 ms 1664 KB
12-random-large-sparse02 AC 49 ms 1664 KB
12-random-large-sparse03 AC 50 ms 1664 KB
13-random-large-denseA01 AC 170 ms 9472 KB
13-random-large-denseA02 AC 175 ms 9728 KB
13-random-large-denseA03 AC 173 ms 9472 KB
13-random-large-denseA04 AC 178 ms 10496 KB
14-random-large-denseB01 AC 180 ms 9472 KB
14-random-large-denseB02 AC 171 ms 9472 KB
14-random-large-denseB03 AC 173 ms 9600 KB
14-random-large-denseB04 AC 171 ms 9472 KB
15-random-large-denseC01 AC 159 ms 9472 KB
15-random-large-denseC02 AC 160 ms 9472 KB
20-kill-naive AC 138 ms 10112 KB
21-kill-loop AC 166 ms 9472 KB
23-min AC 1 ms 384 KB