제출 #832807

#제출 시각아이디문제언어결과실행 시간메모리
832807ttamx휴가 (IOI14_holiday)C++14
24 / 100
63 ms65536 KiB
#include"holiday.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; const ll inf=1e18; int n,d,st; int a[N]; vector<pair<int,int>> vec; int mp[N]; ll dp[4][2*N]; struct persist{ struct node; typedef node* pnode; struct node{ ll val; int freq; pnode l,r; node(ll val,int freq):val(val),freq(freq),l(nullptr),r(nullptr){} }; pnode rt[N]; void build(int l,int r,pnode &t){ t=new node(0,0); if(l==r)return; int m=(l+r)/2; build(l,m,t->l); build(m+1,r,t->r); } void build(int t){ build(1,n,rt[t]); } void update(int l,int r,pnode &t,pnode k,int x,ll v){ t=new node(*k); t->val+=v; t->freq++; if(l==r)return; int m=(l+r)/2; if(x<=m)update(l,m,t->l,k->l,x,v); else update(m+1,r,t->r,k->r,x,v); } void update(int k,int t,int x,ll v){ update(1,n,rt[t],rt[k],x,v); } ll query(int l,int r,pnode t,int k){ if(l==r)return k>0?t->val:0; int m=(l+r)/2; int freq=t->r->freq; if(freq<k)return query(l,m,t->l,k-freq)+t->r->val; return query(m+1,r,t->r,k); } ll query(int t,int k){ return query(1,n,rt[t],k); } }s; void solve(int l,int r,int optl,int optr,int id,int mul){ if(l>r)return; int mid=(l+r)/2; pair<ll,int> best(-inf,-1); for(int i=optl;i<=optr;i++)best=max(best,{s.query(i,mid-mul*abs(i-st)),i}); int opt; tie(dp[id][mid],opt)=best; if(id%2==0){ solve(l,mid-1,optl,opt,id,mul); solve(mid+1,r,opt,optr,id,mul); }else{ solve(l,mid-1,opt,optr,id,mul); solve(mid+1,r,optl,opt,id,mul); } } ll findMaxAttraction(int _n,int start,int _d,int _a[]) { n=_n,d=_d,st=start+1; for(int i=1;i<=n;i++){ a[i]=_a[i-1]; vec.emplace_back(a[i],i); } sort(vec.begin(),vec.end()); for(int i=0;i<n;i++)mp[vec[i].second]=i+1; s.build(st); for(int i=st+1;i<=n;i++)s.update(i-1,i,mp[i],a[i]); for(int i=st-1;i>=1;i--)s.update(i+1,i,mp[i],a[i]); solve(1,d,st,n,0,2); solve(1,d,1,st,1,2); s.update(st,st,mp[st],a[st]); for(int i=st+1;i<=n;i++)s.update(i-1,i,mp[i],a[i]); for(int i=st-1;i>=1;i--)s.update(i+1,i,mp[i],a[i]); solve(1,d,st,n,2,1); solve(1,d,1,st,3,1); ll ans=0; for(int i=0;i<=d;i++){ ans=max(ans,dp[0][i]+dp[3][d-i]); ans=max(ans,dp[1][i]+dp[2][d-i]); } 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...