제출 #1242068

#제출 시각아이디문제언어결과실행 시간메모리
1242068dosts나일강 (IOI24_nile)C++20
100 / 100
88 ms19004 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 = 1e6+1, inf = 2e18; struct Data { int len = 0,oddmn = inf,evenmn = inf,cool = inf,sm =0 ; }; Data merge(Data d1,Data d2) { Data ret; ret.len = d1.len+d2.len; ret.sm = d1.sm+d2.sm; ret.oddmn = min(d1.oddmn,(d1.len%2)?(d2.evenmn):(d2.oddmn)); ret.evenmn = min(d1.evenmn,(d1.len%2 == 0)?(d2.evenmn):(d2.oddmn)); ret.cool = min(d1.cool,d2.cool); return ret; } struct DSU { vector<Data> data; vi dad; int ans = 0; DSU(int nn) { dad.resize(nn); data.resize(nn); iota(all(dad),0ll); } int find(int x) { if (x == dad[x]) return x; return dad[x] = find(dad[x]); } int wonder(int x) { int a = find(x); if (data[a].len%2) return data[a].sm-min(data[a].oddmn,data[a].cool); else return data[a].sm; } void unite(int x,int y) { int a = find(x),b = find(y); assert(a!=b); ans-=wonder(a),ans-=wonder(b); dad[a] = b; data[b] = merge(data[a],data[b]); ans+=wonder(b); } void upd(int x,int y) { ans-=wonder(x); int a = find(x); data[a].cool = min(data[a].cool,y); ans+=wonder(x); } }; struct Query { int d, id; }; std::vector<long long> calculate_costs(std::vector<signed> W, std::vector<signed> A, std::vector<signed> B, std::vector<signed> E) { int N = big(W),Q = big(E); vi ord(N); iota(all(ord),0ll); sort(all(ord),[&](int x,int y) { return W[x] < W[y]; }); vi ww = vi(all(W)),aa = vi(all(A)),bb = vi(all(B)); int smm = 0; for (int i = 0;i<N;i++) { W[i] = ww[ord[i]]; A[i] = aa[ord[i]]; B[i] = bb[ord[i]]; smm+=A[i]; } vi ans(Q); vi v(N); for (int i = 0;i<N;i++) { v[i] = A[i]-B[i]; } DSU dsu(N); for (int i = 0;i<N;i++) dsu.data[i] = {1,v[i],inf,inf,v[i]}; for (int i = 0;i<N;i++) dsu.upd(i,inf); vector<pii> pqish,merges; for (int i=1;i<N-1;i++) { pqish.push_back({W[i+1]-W[i-1],i}); } for (int i=0;i<N-1;i++) { merges.push_back({W[i+1]-W[i],i}); } vector<Query> queries; for (int i = 0;i<Q;i++) { queries.push_back({E[i],i}); } sort(all(merges)); sort(all(pqish)); sort(all(queries),[&](Query& q1,Query& q2) { return pii{q1.d,q1.id} < pii{q2.d,q2.id}; }); int ptr = 0,ptr2 = 0; for (auto& Q : queries) { int D = Q.d; while (ptr < N-1 && merges[ptr].ff <= D) { dsu.unite(merges[ptr].ss,merges[ptr].ss+1); ptr++; } while (ptr2 < N-2 && pqish[ptr2].ff <= D) { dsu.upd(pqish[ptr2].ss,v[pqish[ptr2].ss]); ptr2++; } ans[Q.id] = smm-dsu.ans; } return ans; }
#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...