제출 #1178185

#제출 시각아이디문제언어결과실행 시간메모리
1178185alexander707070나일강 (IOI24_nile)C++20
0 / 100
37 ms7352 KiB
#include<bits/stdc++.h> #define MAXN 100007 using namespace std; const long long inf=1e17; struct item{ int w; int a,b; inline friend bool operator < (item fr,item sc){ return fr.w<sc.w; } }; int delta; int n; item a[MAXN]; vector< pair<int,int> > raz,qs; long long ans[MAXN],dp[MAXN]; long long slow(int l,int r){ dp[l-1]=0; for(int i=l;i<=r;i++){ dp[i]=dp[i-1]+a[i].a; if(i-1>=l and (a[i].w-a[i-1].w)<=delta)dp[i]=min(dp[i],dp[i-2]+a[i].b+a[i-1].b); if(i-2>=l and (a[i].w-a[i-2].w)<=delta)dp[i]=min(dp[i],dp[i-3]+a[i-2].b+a[i-1].a+a[i].b); } return dp[r]; } struct node{ long long ans[3][3]; }; node tree[4*MAXN]; void solve(int v,int l,int r){ if(r-l+1<=7){ long long pref=0; for(int i=0;i<3;i++){ long long suff=0; for(int f=0;f<3;f++){ tree[v].ans[i][f]=slow(l+i,r-f)+pref+suff; suff+=a[r-f].a; } pref+=a[l+i].a; } return; } int mid=(l+r)/2; solve(2*v,l,mid); solve(2*v+1,mid+1,r); auto s=tree[2*v],t=tree[2*v+1]; for(int i=0;i<3;i++){ for(int f=0;f<3;f++){ long long curr=s.ans[i][0]+t.ans[0][f]; if((a[mid].w-a[mid+1].w)<=delta)curr=min(curr,s.ans[i][1]+t.ans[1][f]-a[mid].a-a[mid+1].a+a[mid].b+a[mid+1].b); if((a[mid].w-a[mid+2].w)<=delta)curr=min(curr,s.ans[i][1]+t.ans[2][f]-a[mid].a-a[mid+2].a+a[mid].b+a[mid+2].b); if((a[mid-1].w-a[mid+1].w)<=delta)curr=min(curr,s.ans[i][2]+t.ans[1][f]-a[mid-1].a-a[mid+1].a+a[mid-1].b+a[mid+1].b); } } } vector<long long> calculate_costs(vector<int> W, vector<int> A,vector<int> B,vector<int> E){ n=int(W.size()); for(int i=1;i<=n;i++){ a[i]={W[i-1],A[i-1],B[i-1]}; } sort(a+1,a+n+1); delta=0; for(int i=1;i<=n;i++){ if(i+1<=n)raz.push_back({a[i+1].w-a[i].w,i}); if(i+2<=n)raz.push_back({a[i+2].w-a[i].w,i}); } sort(raz.begin(),raz.end()); for(int i=0;i<E.size();i++){ qs.push_back({E[i],i}); } sort(qs.begin(),qs.end()); int pt=0; for(int i=0;i<qs.size();i++){ delta=qs[i].first; /*while(pt<raz.size() and raz[pt].first<=qs[i].first){ tree.upd(raz[pt].second); pt++; }*/ solve(1,1,n); ans[qs[i].second]=tree[1].ans[0][0]; } vector<long long> sol; for(int i=0;i<qs.size();i++)sol.push_back(ans[i]); return sol; } /*int main(){ auto res=calculate_costs({15, 12, 2, 10, 21}, {5, 4, 5, 6, 3}, {1, 2, 2, 3, 2}, {5, 9, 1}); for(auto s:res)cout<<s<<" "; return 0; }*/
#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...