Submission #1287329

#TimeUsernameProblemLanguageResultExecution timeMemory
1287329liangjeremyNile (IOI24_nile)C++20
100 / 100
438 ms67764 KiB
#include<bits/stdc++.h> //#include<bits/extc++.h> #include "nile.h" #define fi first #define se second #define int long long using namespace std; //using namespace __gnu_pbds; using db=double; using ll=int64_t; using sll=__int128; using lb=long double; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); struct node{ int a; int b; int w; }; bool cmp(node q, node z){ return q.w<z.w; } struct querys{ int d; int idx; }; bool cmpq(querys a, querys b){ return a.d<b.d; } const int MAXN=3; struct Matrix{ int mat[3+1][3+1]; int h=3; int w=3; //int h,w; Matrix(){ memset(mat,0,sizeof(mat)); } void build(){ for(int i=1; i<=3; i++){ for(int j=1; j<=3; j++){ mat[i][j]=1e18; } } } }; Matrix operator*(const Matrix &a, const Matrix &b){ Matrix c; c.build(); //c.h=a.w; c.w=b.w; for(int i=1; i<=a.h; i++){ for(int j=1; j<=b.w; j++){ for(int k=1; k<=a.w; k++){ c.mat[i][j]=min(c.mat[i][j],a.mat[i][k]+b.mat[k][j]); } } } return c; }; const int maxn=1e5+10; Matrix sum[maxn<<2]; Matrix d; int f1; int f2; void build(int l, int r, int rt, const vector<node>&v){ if(l==r){ sum[rt].build(); sum[rt].mat[1][1]=v[l].a; sum[rt].mat[2][1]=0; sum[rt].mat[3][2]=0; return; } int mid=(l+r)>>1; build(l,mid,rt<<1,v); build(mid+1,r,rt<<1|1,v); sum[rt]=sum[rt<<1|1]*sum[rt<<1]; } void update(int l, int r, int rt, int idx){ if(l==r){ if(l==2){ sum[rt].mat[1][1]=f2; sum[rt].mat[2][1]=f1; sum[rt].mat[3][1]=0; return; } sum[rt]=d; return; } int mid=(l+r)>>1; if(idx<=mid)update(l,mid,rt<<1,idx); else update(mid+1,r,rt<<1|1,idx); if(l==1 && r==2)sum[rt]=sum[rt<<1|1]; else sum[rt]=sum[rt<<1|1]*sum[rt<<1]; } vector<int>calculate_costs(vector<int32_t>W, vector<int32_t>A, vector<int32_t>B, vector<int32_t>E){ int n=W.size(); int q=E.size(); vector<node>v(n+1); vector<querys>qry(q); for(int i=1; i<=n; i++){ v[i].a=A[i-1]; v[i].b=B[i-1]; v[i].w=W[i-1]; } sort(v.begin()+1,v.end(),cmp); vector<pair<int,int>>v1; vector<pair<int,int>>v2; for(int i=2; i<=n; i++){ v1.push_back({v[i].w-v[i-1].w,i}); if(i>=3)v2.push_back({v[i].w-v[i-2].w,i}); } for(int i=0; i<q; i++){ qry[i].d=E[i]; qry[i].idx=i; } sort(qry.begin(),qry.end(),cmpq); vector<int>ans(q); build(1,n,1,v); sort(v1.begin(),v1.end()); sort(v2.begin(),v2.end()); int x=0; int y=0; for(int i=0; i<q; i++){ f1=v[1].a; if(v[2].w-v[1].w<=qry[i].d)f2=v[1].b+v[2].b; else f2=v[2].a+v[1].a; update(1,n,1,2); d.build(); d.mat[2][1]=0; d.mat[3][2]=0; while(x<v1.size() && v1[x].fi<=qry[i].d){ int idx=v1[x].se; d.mat[1][1]=v[idx].a; d.mat[1][2]=v[idx].b+v[idx-1].b; x++; update(1,n,1,idx); } while(y<v2.size() && v2[y].fi<=qry[i].d){ int idx=v2[y].se; d.mat[1][1]=v[idx].a; d.mat[1][2]=v[idx].b+v[idx-1].b; d.mat[1][3]=v[idx].b+v[idx-1].a+v[idx-2].b; y++; update(1,n,1,idx); } ans[qry[i].idx]=sum[1].mat[1][1]; } 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...