Submission #1345375

#TimeUsernameProblemLanguageResultExecution timeMemory
1345375thesentroNile (IOI24_nile)C++20
32 / 100
110 ms23212 KiB
#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll res = 0;
struct DSU
{
    vector<ll>e;
    vector<ll>vis;
    void init(ll n)
    {
        e.resize(n+1, -1);
        vis.resize(n+1, 0);
    }
    ll find (ll x)
    {
        if (e[x]<0)
            return x;
        return e[x] = find(e[x]);
    }
    bool merge(ll x, ll y)
    {
        ll a = find(x);
        ll b = find(y);
        if (a==b)
            return false;
        if (e[a]>e[b])
            swap(a, b);
		ll a1 = -e[a];
		ll b1 = -e[b];
		res -= (a1+(a1%2));
		res -= (b1+(b1%2));
		b1 += a1;
		res += b1+(b1%2);
        e[a]+=e[b];
        e[b] = a;
        return true;
    }
};
std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A,
                                       std::vector<int> B, std::vector<int> E) {
	map<ll, vector<ll>>mp;
	set<ll>acc;
	for (int i=0 ; i<E.size() ; i++) 
	{	mp[E[i]].push_back(i); acc.insert(E[i]);}
	DSU dsu;
	ll n = W.size();
	dsu.init(n);
	sort(W.begin(), W.end());
	map<ll, vector<ll>>mp1;
	for (int i=1 ; i<n ;i ++)
	{
		mp1[W[i]-W[i-1]].push_back(i-1);
		acc.insert(W[i]-W[i-1]);
	}
	res = 2*n;
	ll sz = E.size();
	vector<ll>out(sz);
	for (auto i:acc)
	{
		for (auto j:mp1[i])
			dsu.merge(j, j+1);
		for (auto j:mp[i])
			out[j] = res; 
	}

	return out;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...