Submission #1294031

#TimeUsernameProblemLanguageResultExecution timeMemory
1294031heyder_7Paprike (COI18_paprike)C++20
0 / 100
1095 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
//#define int unsigned long long
//#define vector deque
#define int long long
#define tt true
#define ff false
#define F first
#define S second
#define endl '\n'
#define ins insert
#define pb push_back
#define pf push_front
#define lb lower_bound
#define ub upper_bound
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
#define srt(p) sort(p.begin() , p.end())
#define rvr(p) reverse(p.begin() , p.end())

const int MAX = 3e5, MOD = 1e9 + 7;
int G[MAX + 1];
vector<int> vts1;
vector<bool> vts(MAX);

/*

int pw(int a, int b) {
	int ans = 1;
	while(b > 0) {
		if(b % 2 == 1) {
			ans *= a;
		}
		a *= a;
		b /= 2;
	}
	return ans;
}

/*

int factorial(int n) {
	if(n == 0 || n == 1) return 1;
	return n * factorial(n - 1);
}

bool is_prime(int n) {
	if(n == 1 or n == 0) return false;
	if(n == 2) return true;
	if(n % 2 == 0) return false;
	for(int i = 3; i <= sqrt(n); i+=2) {
		if(n % i == 0) return false;
	}
	return true;
}

void sieve() {
	vts[0] = tt;
	vts[1] = tt;
	for(int i = 2; i <= sqrt(MAX); i++) {
		if(vts[i] == ff) {
			for(int j = i * i; j <= MAX; j += i) {
				vts[j] = tt;
			}
		}
	}
	for(int i = 0; i < MAX; i++) {
		if(!vts[i]) {
			vts1.push_back(i);
		}
	}
}

vector<int> sieve_massiv() {
	int n = MAX;
	vector<int> ans;
	vector<bool> ans2(MAX, true);
	ans2[0] = false;
	ans2[1] = false;
	for(int i = 2; i <= n; i++) {
		if(ans2[i]) {
			ans.push_back(i);
			for(int j = i * i; j <= n; j += i) {
				ans2[j] = false;
			}
		}
	}
	return ans;
}

vector<int> divisors(int n) {
	vector<int> divi;
	for(int i = 1; i <= sqrt(n); i++) {
		if(n % i == 0) {
			divi.push_back(i);
			if(i != n / i) divi.push_back(n / i);
		}
	}
	sort(divi.begin(), divi.end());
	return divi;
}


int phi(int n) {
	int ans = n;
	for(int i = 2; i * i <= n; i++) {
		if(n % i == 0) {
			while(n % i == 0) {
				n /= i;
			}
			ans -= ans / i;
		}
	}
	if(n > 1) {
		ans -= ans / n;
	}
	return ans;
}


string binaryaplsub(string a, string b) {
	int n = a.size(), m = b.size();
	int maxi = max(n, m);
	string ans = "";
	int yadda = 0;
	while(a.size() < maxi) {
		a = "0" + a;
	}
	while(b.size() < maxi) {
		b = "0" + b;
	}
	for(int i = maxi - 1; i >= 0; i--) {
		int A = a[i] - '0';
		int B = b[i] - '0';
		int sum = A + B + yadda;
		if(sum == 0) {
			ans = "0" + ans;
			yadda = 0;
		}
		else if(sum == 1) {
			ans = "1" + ans;
			yadda = 0;
		}
		else if(sum == 2) {
			ans = "0" + ans;
			yadda = 1;
		}
		else if(sum == 3) {
			ans = "1" + ans;
			yadda = 1;
		}
	}
	if(yadda != 0) ans = "1" + ans;
	return ans;
}

int pfc(int n) {
	int cnt = 0;
	for(int i = 2; i <= sqrt(n); i++) {
		if((int64_t)i * i > n) break;
		if(n % i == 0) {
			while(n % i == 0) {
				n /= i;
				cnt++;
			}
		}
	}
	if(n > 1) cnt++;
	return cnt;
}

int primecntInterval(int a, int b) {
	int n = b - a + 1;
	int n1 = sqrt(b) + 1;
	vector<bool> isPrime(n, true);
	if(a == 0) {
		isPrime[0] = false;
		if(n > 1) isPrime[1] = false;
	}
	else if(a == 1) {
		isPrime[0] = false;
	}
	vector<bool> vtt(n1 + 1, false);
	vector<int> vt;
	for(int i = 2; i <= n1; i++) {
		if(!vtt[i]) {
			vt.push_back(i);
			for(int j = i * i; j <= n1; j += i) {
				vtt[j] = true;
			}
		}
	}
	for(int i = 0; i < vt.size(); i++) {
		int start = max(vt[i] * vt[i], ((a + vt[i] - 1) / vt[i]) * vt[i]);
		for(int j = start; j <= b; j += vt[i]) {
			isPrime[j - a] = false;
		}
	}
	int smd = 0;
	for(int i = 0; i < n; i++) {
		if(isPrime[i]) {
			smd++;
		}
	}
	return smd;
}

void pppp() {
	vector<int> phi_arr(MAX + 1);
	for(int i = 0; i <= MAX; i++) phi_arr[i] = i;
	for(int i = 2; i <= MAX; i++) {
		if(phi_arr[i] == i) {
			for(int j = i; j <= MAX; j += i) {
				phi_arr[j] -= phi_arr[j] / i;
			}
		}
	}
	for(int i = 1; i <= MAX; i++) {
		for(int j = i; j <= MAX; j += i) {
			G[j] += i * phi_arr[j / i];
		}
	}
	for(int i = 1; i <= MAX; i++) {
		G[i] += G[i - 1] - i;
	}
}

string bitwise(int n) {
	string s = "";
	while(n > 0) {
		int qaliq = n % 2;
		if(qaliq == 1) s += '1';
		else s += '0';
		n /= 2;
	}
	reverse(s.begin(), s.end());
	return s;
}

bool is_palindrome(string s) {
    string t = s;
    reverse(t.begin(), t.end());
    return t == s;
}

//vector<int> vts1 = sieve_massiv();



/* ------------FOR DP----------
int n;
vector<int> vt;
int dp[MAX];

int dpp(int i){
    if(dp[i] != 0) return dp[i];
    int best = 1;
    for(int j = 0; j < i; ++j){
        if(vt[j] <= vt[i]){
            best = max(best , dpp(j) + 1);
        }
    }
    return dp[i] = best;
}
*/

bool ok1(vector<int> wreath , int k) {
    for(int i = 0; i < wreath.size(); ++ i) {
        if(wreath[i] > k) {
            return false;
        }
    }
    return true;
}

bool ok2(vector<pair<int , int>> edges , int x , int y) {
    for(int i = 0; i < edges.size(); ++ i) {
        if((edges[i].F == x && edges[i].S == y) || (edges[i].F == y && edges[i].S == x)) {
            return true;
        }
    }
    return false;
}

void solve() {
    int n , k , SAY = 0;
    cin >> n >> k;
    vector<int> vt(n);
    int cem = 0;
    for(int i = 0; i < n; ++ i) {
        cin >> vt[i];
        cem += vt[i];
    }
    vector<pair<int , int>> edges(n - 1);
    for(int i = 0; i < n - 1; ++ i) {
        int x , y;
        cin >> x >> y;
        edges[i].F = x;
        edges[i].S = y;
    }
    vector<int> wreath;
    wreath.pb(cem);
    while(!ok1(wreath , k)) {
        int mini = INT_MAX;
        int a;
        for(int i = 0; i < n; ++ i) {
            int x = edges[i].F;
            int y = edges[i].S;
            int sum = 0 , sum1 = 0;
            int say = 0 , say1 = 0;
            vector<int> vt1 , vt2;
            //////////////////////
            int A = -1;
            bool ok = false;
            for(int j = 0; j < n; ++ j) {
                if(i == j) {
                    continue;
                }
                if(ok2(edges , x , j + 1)) {
                    say++;
                    sum += vt[j];
                    if(A == -1) A = j + 1;
                }
            }
            for(int j = 0; j < n; ++ j) {
                if(i == j) {
                    continue;
                }
                if(ok2(edges , y , j + 1)) {
                    say1++;
                    sum1 += vt[j];
                    if(j + 1 == A) {
                        ok = true;
                        break;
                    }
                }
            }
            //////////////////////
            if(mini > abs(sum - sum1)) {
                mini = abs(sum - sum1);
                a = i;
            }
        }
        edges.erase(edges.begin() + a);
        SAY++;
        wreath.clear();
        vector<bool> vis(n + 1 , false);
        for(int i = 1; i <= n; ++ i) {
            if(vis[i] == true) {
                continue;
            }
            vis[i] = true;
            int sum = vt[i - 1];
            int cem = vt[i - 1];
            queue<int> q;
            q.push(i);
            while(!q.empty()) {
                int u = q.front();
                q.pop();
                for(int i = 0; i < edges.size(); ++ i) {
                    int x = edges[i].F , y = edges[i].S;
                    int Z = -1;
                    if(x == u && vis[y] != false) Z = y;
                    if(y == u && vis[x] != false) Z = x;
                    if(x != -1) {
                        vis[Z] = true;
                        sum += vt[Z - 1];
                        q.push(Z);
                    }
                }
                wreath.pb(sum);
            }
        }
    }
    cout << SAY << endl;
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	//sieve();
	//pppp();
	int t = 1;
	//cin >> t;
	//int n;
	for(int i = 0; i < t; ++i) {
		solve();
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...