답안 #345180

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
345180 2021-01-07T06:04:17 Z limabeans Džumbus (COCI19_dzumbus) C++17
0 / 110
72 ms 24684 KB
#include <bits/stdc++.h>
using namespace std;

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl





using ll = long long;


const int maxn = 1e6 + 5;



int n,m,q;
ll a[maxn];
vector<int> g[maxn];

bool act[maxn];

struct dat {
    vector<int> inds;
    dat(vector<int> w) {
	inds = w;
    }

    ll sum() {
	ll res = 0;
	for (ll i: inds) {
	    res += a[i];
	}
	return res;
    }

    ll size() {
	return inds.size();
    }

    pair<ll,ll> val() const {
	ll cnt = inds.size();
	ll sum = 0;
	for (ll i: inds) {
	    sum += a[i];
	}
	return {sum, cnt};
    }

    bool operator<(const dat& o) const {
	auto cur = val();
	auto them = o.val();
	//return cur.first/cur.second < them.first/them.second;
	if (cur.first*them.second != them.first*cur.second) {
	    return cur.first*them.second < them.first*cur.second;
	}

	return inds < o.inds;
    }

    bool active() {
	for (int i: inds) {
	    if (!act[i]) return false;
	}
	return true;
    }

    void print() {
	for (int i: inds) cout<<i<<",";
	cout<<": ";
	cout<<sum()<<endl;
    }
};

set<dat> st;


bool viz[maxn];

void dfs(int at, int p) {
    viz[at] = true;
    if (p) {
	dat cur({at,p});
	st.insert(cur);
    }
	
    for (int to: g[at]) {
	if (to == p) continue;
	dfs(to, at);
    }
}



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

    cin>>n>>m;
    for (int i=1; i<=n; i++) {
	cin>>a[i];
    }

    for (int i=0; i<m; i++) {
	int u,v; cin>>u>>v;
	g[u].push_back(v);
	g[v].push_back(u);
    }


    for (int i=1; i<=n; i++) {
	act[i] = true;
    }



    for (int i=1; i<=n; i++) {
	if (!viz[i]) {
	    dfs(i,0);
	}
    }



    map<ll,ll> mp;
    mp[0] = 0; //money->cnt

    ll count = 0;
    ll sum = 0;

    while (st.size()) {
	auto cur = *st.begin();
	st.erase(st.begin());
	if (!cur.active()) {
	    continue;
	}
	sum += cur.sum();
	count += cur.size();
	mp[sum] = count;

	for (int x: cur.inds) {
	    act[x] = false;
	}

	//add neighbors
	for (int x: cur.inds) {
	    for (int y: g[x]) {
		dat cur({y});
		st.insert(cur);
	    }
	}
    }


    cin>>q;

    while (q--) {
	ll x;
	cin>>x;
	auto iter = std::prev(mp.upper_bound(x));
	ll count = iter->second;
	cout<<count<<"\n";
    }
    
    
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 22 ms 24044 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 22 ms 24044 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 72 ms 24684 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 22 ms 24044 KB Output isn't correct
2 Halted 0 ms 0 KB -