Atcoder Regular Contest 066 F genocide【JZOJ5451】
来源:互联网 发布:mac用pe安装win7系统 编辑:程序博客网 时间:2024/06/08 18:59
题目
分析
设
类似的,设
将a翻转,像f一样做一遍,再将g翻转就可以了。
对于询问(p,x),如果我们不选择p,那么答案就是
如果我们选择了p,我们再设
时间复杂度是
如何可以更快的求出
分治,假设当前做到
我们将
那么
因为只考虑了i在
那么选择了p的的最优值就是
#include <iostream>#include <cmath>#include <cstring>#include <algorithm>#include <cstdio>#include <cstdlib>#include <map>#include <queue>#include <stack>using namespace std;const int maxlongint=2147483647;const int mo=1e9+7;const int N=1000005;#define rev(h) for(int i=1;i<=n/2;i++) swap(h[i],h[n-i+1])#define val(h,j,k) 1ll*(h[j]-h[k]+s[j]-s[k]-1ll*j*1.0/2+1ll*k*1.0/2+1ll*j*j*1.0/2-1ll*k*k*1.0/2)*1.0/(j-k)int n,m,t[N],top;long long a[N],s[N],f[N],g[N],F[N],tmp[N];void dg(long long *f,long long *g,int l,int r){ if(l==r) { F[l]=max(F[l],f[l-1]+g[l+1]+1-a[l]); return; } int mid=(l+r)>>1; top=0; for(int i=l-1;i<=mid;i++) { for(;top>1 && val(f,i,t[top])>=val(f,t[top],t[top-1]);) top--; t[++top]=i; } for(int i=mid+1;i<=r;i++) { for(;top>1 && val(f,t[top],t[top-1])<=i;) top--; int j=t[top]; tmp[i]=f[j]-(s[i]-s[j])+1ll*(i-j)*(i-j+1)/2+g[i+1]; } for(int i=r-1;i>=mid+1;i--) tmp[i]=max(tmp[i],tmp[i+1]); for(int i=r;i>=mid+1;i--) F[i]=max(F[i],tmp[i]); dg(f,g,l,mid),dg(f,g,mid+1,r);}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]),s[i]=s[i-1]+a[i],F[i]=-a[i]+1; t[top=1]=0; for(int i=1;i<=n;i++) { for(;top>1 && val(f,t[top],t[top-1])<=i;) top--; int j=t[top]; f[i]=max(f[j]-(s[i]-s[j])+1ll*(i-j)*(i-j+1)/2,f[i-1]); for(;top>1 && val(f,i,t[top])>=val(f,t[top],t[top-1]);) top--; t[++top]=i; } rev(a); t[top=1]=0; for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; for(int i=1;i<=n;i++) { for(;top>1 && val(g,t[top],t[top-1])<=i;) top--; int j=t[top]; g[i]=max(g[j]-(s[i]-s[j])+1ll*(i-j)*(i-j+1)/2,g[i-1]); for(;top>1 && val(g,i,t[top])>=val(g,t[top],t[top-1]);) top--; t[++top]=i; } rev(a); for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; rev(g); dg(f,g,1,n); rev(a); rev(g); for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; rev(F); rev(f); dg(g,f,1,n); rev(F); rev(g); rev(f); rev(a); scanf("%d",&m); for(int i=1;i<=m;i++) { long long p,x; scanf("%lld%lld",&p,&x); printf("%lld\n",max(f[p-1]+g[p+1],F[p]+a[p]-x)); }}
阅读全文
1 0
- Atcoder Regular Contest 066 F genocide【JZOJ5451】
- AtCoder Regular Contest 071 F
- AtCoder Regular Contest 076 F
- AtCoder Regular Contest 069 F
- AtCoder Regular Contest 071 F
- AtCoder Regular Contest 074 F Lotus Leaves
- AtCoder Regular Contest 082-F-Sandglass
- 【Atcoder Regular Contest 085F】 NRE
- 【AtCoder Regular Contest 066 F】【JZOJ 5451】Contest with Drinks Hard
- 【2-SAT】【AtCoder Regular Contest 069 F】Flag
- AtCoder Regular Contest 085 F NRE 线段树优化dp
- Atcoder Regular contest 085F NRE 线段树+DP
- AtCoder Regular Contest 077
- AtCoder Regular Contest 077
- AtCoder Regular Contest 078
- AtCoder Regular Contest 079
- Atcoder Regular Contest 084
- AtCoder Regular Contest 086
- 网络七层
- 一个获取鼠标位置和键盘按钮的图形化界面一个 工程文件
- 从体测到健康问题的思考转变
- Go语言实现二叉搜索树
- Android杂谈--闹钟详谈
- Atcoder Regular Contest 066 F genocide【JZOJ5451】
- (五)、Java复习笔记之Map集合
- Linux 下的磁盘的格式化和挂载
- 卷积神经网络入门详解
- You Only Look Once: Unified, Real-Time Object Detection
- 11.5
- QString与std::string的相互转换
- java se--2.数组-3.常见算法
- WIN7下创建tensorflow环境[Anaconda3-4.2.0+tensorflow(gpu/cpu)+pycharm]