1 条题解

  • 0
    @ 2025-8-24 22:22:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ReseeCher
    AFO·运气选手

    搬运于2025-08-24 22:22:36,当前版本为作者最后更新于2020-07-01 21:52:36,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    约定覆盖位置[l][l],[l+1][l+1],[l+2][l+2]......[r][r]的为一条从ll开始的“直线”

    约定覆盖位置[l][l],[l+2][l+2],[l+4][l+4]......[r][r]的为一条从ll开始的“跳线”

    那么原问题相当于使用一些直线和跳线使每个位置ii刚好被a[i]a[i]条线覆盖

    每用一条线称作11costcost,我们希望总的costcost最小


    首先考虑如何去覆盖第11和第22个位置

    为了方便,这里a[i]a[i]表示位置ii还要被几条线段覆盖

    这里先给出方案

    1. (a[1]>0,a[2]=0)(a[1]>0,a[2]=0):从a[1]a[1]开始一条跳线

    2. (a[1]>0,a[2]>0)(a[1]>0,a[2]>0):从a[1]a[1]开始一条直线

    3. (a[1]=0)(a[1]=0):暂时不决策

    prove1prove1

    比较显然,位置22已经不能被覆盖,只能连出跳线

    prove2prove2

    考虑证明以下命题:从1开始的连续非0区间(长度>=2)用一条直线覆盖一定不劣

    设这段区间为[1,r][1,r],那么因为a[r+1]=0a[r+1]=0,所以不可能向后连出直线,唯一有利于后面位置被覆盖的方案是在与(r)(r)奇偶性相同的位置连出一条跳线

    但是这样做必有cost>=2cost>=2,而使用一条直线和一条跳线costcost22,所以一定不优于原方案(不如从后面开始跳线)


    此时由于a[1]=0a[1]=0了,我们可以把位置11删除,继续考虑第22和第33个位置

    这个问题与刚才的问题类似,唯一的区别是要处理被前面开始的线覆盖的情况

    如果能被前面的线覆盖则一定被覆盖,因为这样cost=0cost=0,而任意一种可能更利于后面被覆盖的方案都需要cost=1cost=1,不如从后面开始

    若前面的直线有AA个,能连到33的跳线有BB

    那么如果a[3]>=A+Ba[3]>=A+B,直接把a[3]a[3]减去A+BA+B即可

    但如果a[3]<A+Ba[3]<A+B,则一定有A+Ba[3]A+B-a[3]条线无法连下去,记为KK

    发现保留直线还是跳线和后面的位置有关,于是我们可以先把A和B都减去KK,再在33上打KK个标记,表示可以从33免费开始KK条任意的线

    但这时候出现了一个新的问题,AABB不能被减到负数

    注意到若K>AK>A,那么BB至少也要断掉KAK-A条,那么先把这些边断掉,这样就没有问题了

    K>BK>B时同理


    这样我们就有一个可以从(a[i1],a[i])(a[i-1],a[i])推到(a[i],a[i+1])(a[i],a[i+1])的算法了,一遍推过去即可

    具体可以看代码中的注释

    void Work(){
    	LL A=0,B=0,C=0,Ans=0,D=0;			//C表示奇偶性为另一类的跳线个数 
    	F(i,2,n+1){
    		if(a[i]<B+A){					//处理被前面的线覆盖的情况
    			int K=B+A-a[i];
    			if(B<K)A-=K-B,K-=K-B;
    			if(A<K)B-=K-A,K-=K-A;
    			B-=K;A-=K;a[i]-=K;D=K;		//D:记录标记个数 
    		}
    		a[i]-=A+B;
    		
    		LL U=min(a[i-1],a[i]);			//U:新增直线个数 
    		Ans+=U;a[i-1]-=U;a[i]-=U;A+=U;	//处理直线 
    		Ans+=a[i-1];C+=a[i-1];a[i-1]=0;	//处理跳线 
    		
    		a[i]+=D;Ans-=D;D=0;				//处理标记 
    		swap(B,C);						//奇偶性互换 
    	}
    	cout<<Ans<<'\n';
    }
    
    • 1

    信息

    ID
    5678
    时间
    1000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者