Submission #1103417

#TimeUsernameProblemLanguageResultExecution timeMemory
1103417aaaaaarrozNile (IOI24_nile)C++17
82 / 100
128 ms18352 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Dsu {
    ll cnt;
    vector<ll> parent, rank, size;
    Dsu(ll N) {
        cnt = 2 * N;
        parent.resize(N);
        rank.resize(N);
        size.resize(N, 1);
        for (ll i = 0; i < N; i++) {
            parent[i] = i;
        }
    }
    bool isSameSet(ll i, ll j) {
        return findSet(i) == findSet(j);
    }
    ll findSet(ll i) { 
        if (parent[i] == i) {
            return i;
        } else {
            return parent[i] = findSet(parent[i]);
        } 
    }
    void unionSet(ll i, ll j) {
        ll x = findSet(i);
        ll y = findSet(j);
        if (x != y) {
            if((size[x]%2)==(size[y]%2)&&size[y]%2==1){
                cnt -= 2;  
            }
            if (rank[x] > rank[y]) {
                parent[y] = x;
                size[x] += size[y];
            } else if (rank[x] < rank[y]) {
                parent[x] = y;
                size[y] += size[x];
            } else {
                parent[x] = y;
                size[y] += size[x];
                rank[y]++;
            }
        }
    }
    ll res() {
        return cnt;
    }
};
vector<ll> calculate_costs(vector<int> W, vector<int> A, vector<int> B, vector<int> E) {     
    if(E.size()>10){              
        vector<pair<ll, int>> sorted_W;
        ll n = W.size();
        for (int i = 0; i < n; i++) {
            sorted_W.push_back({W[i], i});
        }
        sort(sorted_W.begin(), sorted_W.end());
        vector<int> new_A(n), new_B(n);
        for (int i = 0; i < n; i++) {
            new_A[i] = A[sorted_W[i].second];
            new_B[i] = B[sorted_W[i].second];
        }
        A = new_A;
        B = new_B;
        Dsu dsu(n);
        vector<vector<ll>> edges;
        for (ll i = 0; i < n - 1; i++) {
            edges.push_back({abs(sorted_W[i + 1].first - sorted_W[i].first), i, i + 1});
        }
        edges.push_back({INT_MAX, -1, -1});  
        sort(edges.begin(), edges.end());
        vector<pair<ll, ll>> q;
        for (ll i = 0; i < E.size(); i++) {
            q.push_back({E[i], i});
        }
        sort(q.begin(), q.end());
        vector<ll> queries(E.size());
        ll puntero = 0;
        for (auto [d, pos] : q) {
            while (edges[puntero][0] <= d && puntero < edges.size()) {
                ll u = edges[puntero][1], v = edges[puntero][2];
                if (u != -1 && v != -1 && !dsu.isSameSet(u, v)) {
                    dsu.unionSet(u, v);
                }
                puntero++;
            }
            queries[pos] = dsu.res();
        }
        return queries;
    }
    else{
        int Q = (int)E.size();
        int N=(int)W.size();
        vector<ll>ans;
        vector<tuple<int,int,int>>ordenar;
        for(int i=0;i<N;i++){
            ordenar.push_back({W[i],B[i],A[i]});
        }
        sort(ordenar.begin(),ordenar.end());
        W.clear();
        A.clear();
        B.clear();
        for(auto[w,b,a]:ordenar){
            A.push_back(a);
            B.push_back(b);
            W.push_back(w);
        }
        for(int e=0;e<Q;e++){
            int d=E[e];
            vector<ll>dp(N,LLONG_MAX);
            for(int i=0;i<N;i++){
            if(i==0){
                dp[i]=A[i];
            }
            if(i==1){
                if((W[i]-W[i-1])<=d){
                dp[i]=(B[i]+B[i-1]);
                }
                else{
                dp[i]=(dp[i-1]+A[i]);
                }
            }
            if(i>=2){
                dp[i]=((ll)A[i]+dp[i-1]);
                if((W[i]-W[i-1])<=d){
                dp[i]=min(dp[i],(ll)((ll)B[i]+(ll)B[i-1]+dp[i-2]));
                }
                if((W[i]-W[i-2])<=d){
                if(i>=3){
                    dp[i]=min(dp[i],(ll)((ll)B[i]+(ll)B[i-2]+(ll)A[i-1]+dp[i-3]));
                }
                else{
                    dp[i]=min(dp[i],(ll)((ll)B[i]+(ll)B[i-2]+(ll)A[i-1]));
                }
                }
            }
            }
            ans.push_back(dp[N-1]);
        }
        return ans;
    }
}

Compilation message (stderr)

nile.cpp: In function 'std::vector<long long int> calculate_costs(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
nile.cpp:73:26: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |         for (ll i = 0; i < E.size(); i++) {
      |                        ~~^~~~~~~~~~
nile.cpp:80:54: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |             while (edges[puntero][0] <= d && puntero < edges.size()) {
      |                                              ~~~~~~~~^~~~~~~~~~~~~~
#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...