제출 #1217494

#제출 시각아이디문제언어결과실행 시간메모리
1217494dostsNile (IOI24_nile)C++20
38 / 100
64 ms15032 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); for (int i =0 ;i<nn;i++) mn[i] = benefit[i]; 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[i]; pref[0] = benefit[0]; for (int i = 1;i<N;i++) pref[i] = pref[i-1]+benefit[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...