제출 #404541

#제출 시각아이디문제언어결과실행 시간메모리
404541FidiskDischarging (NOI20_discharging)C++14
100 / 100
972 ms965156 KiB
#include <bits/stdc++.h> using namespace std; #define oo 1e15 #define fi first #define se second #define sp(iiii) setprecision(iiii) #define IO ios_base::sync_with_stdio(false); cin.tie(0) #define ms(aaaa,xxxx) memset(aaaa,xxxx,sizeof(aaaa)) #define cntbit(xxxx) __builtin_popcount(xxxx) #define getbit(xxxx,aaaa) ((xxxx>>(aaaa-1))&1) typedef long double ld; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<pair<int,int>,int> piii; typedef pair<long long,long long> pll; typedef pair<pair<long long,long long>,long long> plll; typedef pair<pair<long long,long long>,pair<long long,long long>> pllll; typedef pair<pair<long long,long long>,bool> pllb; const ll base=361; const ll mod=998244353; const ld eps=1e-5; const ll maxn=1e9+9; ll n,i,j,a[1000009],f[1000009],sizet; struct segtree_ele{ pll line; ll l,r; } segtree[30000009]; ll getval(pll line,ll gt) { return line.fi*gt+line.se; } ll getnode(ll &x) { if (x!=0) { return x; } sizet++; x=sizet; segtree[x].l=0; segtree[x].r=0; segtree[x].line={0,-oo}; return x; } void update(ll id,ll l,ll r,pll line) { if (line.fi<segtree[id].line.fi) { swap(segtree[id].line,line); } if (line.fi==segtree[id].line.fi) { segtree[id].line.se=max(segtree[id].line.se,line.se); return; } if (r-l==1) { return; } ll mid=(r+l)/2; if (getval(line,l)>getval(segtree[id].line,l)) { swap(line,segtree[id].line); update(getnode(segtree[id].l),l,mid,line); } else { if (getval(line,mid)>getval(segtree[id].line,mid)) { swap(segtree[id].line,line); update(getnode(segtree[id].l),l,mid,line); } else { update(getnode(segtree[id].r),mid,r,line); } } } ll get(ll id,ll l,ll r,ll gt) { if (r-l==1) { return getval(segtree[id].line,gt); } ll mid=(r+l)/2; if (gt<mid) { return max(getval(segtree[id].line,gt),get(getnode(segtree[id].l),l,mid,gt)); } else { return max(getval(segtree[id].line,gt),get(getnode(segtree[id].r),mid,r,gt)); } } int main(){ IO; sizet=0; getnode(n); cin>>n; for (i=1;i<=n;i++) { cin>>a[i]; a[i]=max(a[i-1],a[i]); } update(1,1,maxn,{0,0}); for (i=1;i<=n;i++) { f[i]=-get(1,1,maxn,a[i])+n*a[i]; update(1,1,maxn,{i,-f[i]}); } cout<<f[n]<<'\n'; }
#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...