题解 P7503 「HMOI R1」文化课
upd:改正了一处笔误(将 l 打成了 1)
验题人又来水题解了。
for(rgi i=1;i<=n;++i){
for(rgi j=1;j<=i;++j)dp[i]=max(dp[i],dp[j-1]+sum(j,i,ma[j][i]));
}
考虑这个
看似不大能优化,其实是可以的。记
考虑分开计算每个人的贡献。对于一个人
把它写成
我们分别预处理出
我们在
这样的复杂度是
核心代码:
for(rgi i=1;i<=n;++i){
if(a[i][0]>r[i])continue;
ll[i]=lr[i]=rl[i]=rr[i]=i;
for(rgi w=LOG;~w;--w){
chg(rl[i],w,l[i]-1,1),chg(rr[i],w,r[i],1);
chg(lr[i],w,l[i]-1,-1),chg(ll[i],w,r[i],-1);
}
if(a[lr[i]][0]<l[i])--lr[i];
if(a[rl[i]][0]<l[i])++rl[i];
v[i].push_back(opt{ll[i],lr[i],1});
v[rl[i]].push_back(opt{lr[i]+1,i,1});
v[rr[i]+1].push_back(opt{ll[i],i,-1});
}
for(rgi i=1;i<=n;++i){
for(opt o:v[i])upd(o);
upd(opt{i+1,i+1,ans=qry(1,0,n,0,n)});
}