zoukankan      html  css  js  c++  java
  • Jzoj5451【NOIP2017提高A组冲刺11.4】Genocide(待补充)

    给你一个序列a,要你求出一个同样长的序列c满足ai∈{0,1}的情况下使得下面式子值最大

                                

    现在还有m个询问,每次修改一个ai(注意询问是互相独立的),依然是问你最大值

    这个题先讲讲50分,后面要加上cdq完全不会,挖个坑待填

    额一眼还以为是个线性代数题

    结果是一个dp

    差不多就是说,你选一段连续的区间[l,r]会带来(r-l+1)*(r-l+2)/2的收益同时付出Σc[i]{l<=i<=r}的代价

    可以随便列出一个转移方程式 f[i]=max(f[j-1]+(i-j)*(i-j+1)/2-sum[i]+sum[j])

    这里f[i]表示i必须选择的最大收益

    发现数据范围不可以这么搞

    于是开始网上找斜率dp的教程,各种看不懂

    于是来自己推一发发现很好理解

    我们式子先变形一下

    f[i]=f[j-1]+i*i+j*j-2ij-sum[i]+sum[j]-i+j

    f[i]+i-i*i+sum[i]=-2ij+f[j-1]+j*j+sum[j]

    发现对于同一个j,我们可以将它看成一个类似于y=kx+b的方程(这里k=-2j,b=f[j-1]+j*j+sum[j])

    那么如果我们将所有的直线画出来,我们会得到一张图


    其中数字代表了j,红色部分代表最优解

    我们会发现,由于斜率是单调下降的,所以当i逐渐增大的时候,斜率越大的直线会越来越优

    所以我们可以将所有的直线放入一个栈,每次判断栈顶两个直线的交点和当前i的位置关系

    如果在i的左边,我们就将栈顶丢掉,一直直到只有一个元素或者交点在i右侧

    让后尝试将i所代表的直线加入即可,方法也很简单,计算i和栈顶的交点和栈顶两个直线的交点,如果前者较大则将栈顶丢弃直到符合条件,将i加入即可

    这样既有50了。。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define N 300010
    #define LL long long
    #define D double 
    using namespace std;
    int q[N],t=0,n;
    LL c[N],f[N];
    inline double cross(int i,int j){
    	return (f[i]-f[j]+(i*i-j*j-i+j)/2.0+c[i]-c[j])/(i-j);
    }
    int main(){
    	freopen("genocide.in","r",stdin);
    	freopen("genocide.out","w",stdout);
    	scanf("%d",&n); ++n;
    	for(int i=2;i<=n;++i)
    		scanf("%lld",c+i);
    	q[++t]=1; int m,x,y; scanf("%d",&m);
    	if(!m) return 0; else { scanf("%d%d",&x,&y); c[x+1]=y; }
    	for(int i=2;i<=n;++i) c[i]+=c[i-1];
    	for(int i=2,j;i<=n;++i){
    		double c2=cross(q[t],q[t-1]);
    		while(t>1 && i>=cross(q[t],q[t-1])) --t;
    		j=q[t];
    		f[i]=max(f[i-1],f[j]+(i-j)*(i-j+1ll)/2+c[j]-c[i]);
    		while(t>1 && cross(i,q[t])>=cross(q[t],q[t-1])) --t;
    		q[++t]=i;
    	}
    	printf("%d
    ",f[n]);
    }

  • 相关阅读:
    Digital Video Stabilization and Rolling Shutter Correction using Gyroscope 论文笔记
    Distortion-Free Wide-Angle Portraits on Camera Phones 论文笔记
    Panorama Stitching on Mobile
    Natural Image Stitching with the Global Similarity Prior 论文笔记 (三)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(二)
    Natural Image Stitching with the Global Similarity Prior 论文笔记(一)
    ADCensus Stereo Matching 笔记
    Efficient Large-Scale Stereo Matching论文解析
    Setting up caffe on Ubuntu
    Kubernetes配置Secret访问Harbor私有镜像仓库
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/7800611.html
Copyright © 2011-2022 走看看