제출 #1217497

#제출 시각아이디문제언어결과실행 시간메모리
1217497dosts나일강 (IOI24_nile)C++20
38 / 100
72 ms15028 KiB
#include "nile.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e5+1, inf = 4e9;

vi benefit(LIM);
vi pref(LIM);
int getsm(int l,int r) {
  if (!l) return pref[r];
  return pref[r]-pref[l-1];
}
struct DSU {
  vi dad;
  vi sz,contr,left,right,mn;
  int ans = 0;

  DSU(int nn) {
    dad.resize(nn);
    iota(all(dad),0ll);
    left = right = dad;
    mn.resize(nn);
    sz.assign(nn,1);
    contr.assign(nn,0);
  }

  int find(int x) {
    if (x == dad[x]) return x;
    return dad[x] = find(dad[x]);
  }

  void unite(int a,int b) {
    int x = find(a),y = find(b);
    if (x == y) return;
    ans-=contr[x],ans-=contr[y];
    left[y] = min(left[y],left[x]);
    right[y] = max(right[y],right[x]);
    mn[y] = min(mn[y],mn[x]);
    sz[y]+=sz[x];
    dad[x] = y;
    if (sz[y]%2 == 0) contr[y] = getsm(left[y],right[y]);
    else contr[y] = getsm(left[y],right[y])-mn[y];
    ans+=contr[y];
  }
}dsu(LIM);

std::vector<long long> calculate_costs(std::vector<signed> W, std::vector<signed> A,
                                       std::vector<signed> B, std::vector<signed> E) {
  int Q = big(E);
  int N = big(W);
  vi inds(N);
  iota(all(inds),0ll);
  sort(all(inds),[&](int x,int y) {return W[x] < W[y];});
  int sm = 0;
  vector<pii> diffs;
  for (int i = 0;i<N;i++) {
    sm+=A[inds[i]];
    benefit[i] = A[inds[i]]-B[inds[i]];
    if (i) diffs.push_back({W[inds[i]]-W[inds[i-1]],i});
  }
  sort(all(diffs));
  reverse(all(diffs));
  for (int i = 0;i<N;i++) dsu.mn[i] = benefit[inds[i]];
  pref[0] = benefit[inds[0]];
  for (int i = 1;i<N;i++) pref[i] = pref[i-1]+benefit[inds[i]];
  vi R(Q);
  vector<pii> qs(Q);
  for (int i = 0;i<Q;i++) qs[i] = {E[i],i};
  sort(all(qs));
  for (int i = 0;i<Q;i++) {
    while (!diffs.empty() && diffs.back().ff <= qs[i].ff) {
      int p = diffs.back().ss;
      diffs.pop_back();
      dsu.unite(p-1,p);
    }
    R[qs[i].ss] = sm-dsu.ans;
  }
  return R;
}
#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...