[ZJOI2020]シーケンス-貪欲+計画

タイトル説明

[ZJOI2020]シーケンス

回答

タイトルは、連続削除操作に基づいてスキップ操作を追加します。これは、各ポイントを複数の直線とジャンパーでカバーできることと同等であり、各ポイントを正確にa [i]回カバーする必要があります。

貪欲は、最も単純なケース、2つのポイント1、2のみを考慮します。

  1. a1> 0、a2> 0、min(a1、a2)直線を1から後ろに接続します。
  2. a1> 0、a2 = 0、a1ジャンパーを1から後ろに接続します。
  3. a1 = 0、a2> 0、一時的に処理しないでください。

このようにして、i番目のポイントに到達したら、z本の直線とb個の有効なジャンパーが接続されていると仮定して下にスイープします。

z +b≤aiの場合、z + bを直接減算する必要があります。

z + b> aiの場合、カットするz + b-aiラインがあることを意味し、次にまっすぐにカットしますか、それともジャンパーですか?多くの人がここで立ち往生し、最初にジャンパーを切って直線を維持する必要があると考えますが(最初はそう思っていました)、大きな例を通過することはできません。詳細については、これを参照してください。

4 1 3 0 3 0 3

最初の3つまでスキャンすると、1つの直線と3つのジャンパーがあり、明らかにジャンパーを保持します。

したがって、直線を維持するかジャンパーを維持するかは、次の点に依存することがわかりました。マークを付けることができます。k= z + b-aiを設定し、zとbの両方からkを引き、この点にkを解放します。直線またはジャンプしたがって、この時点で決定を行うとき、k本の線が決定されたと見なすことができ、aiは0に減少し、2つの点はa(i-1)で貪欲になります。

次に、マークの処理方法として、aiをkに加算してから、ansからkを減算します。これは、加算されたkを最終的にk回減算する必要があるためです。つまり、k行はkの寄与としてカウントされます。省略してください。答えでは;

アルゴリズムは基本的にここで完了しますが、それでも問題があります。zとbを負の数に減らすことはできません。

z <k、つまりz <z + b-ai、b> aiの場合、aiラインのみを予約できる場合は、ジャンパーをb-aiから切り離す必要があり、k '= z + ai-と考えてください。 ai = z、zは負に縮小されません。

同じことがb <kにも当てはまります。

コード

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<queue>
#define ll long long
#define MAXN 100005
#define mod 998244353ll
using namespace std;
inline ll read(){
	ll x=0,f=1;char s=getchar();
	while((s<'0'||s>'9')&&s>0){if(s=='-')f*=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=(x<<1)+(x<<3)+s-'0';s=getchar();}
	return f>0?x:-x;
}
int T=read(),n,m,p;
ll a[MAXN];
int main()
{
	while(T--){
		n=read(),m=n+1>>1;
		for(int i=1;i<=n;i++)a[i]=read();
		ll z=0,b=0,c=0,ans=0;a[n+1]=0;
		for(int i=2;i<=n+1;i++){
			ll d=0;
			if(a[i]<z+b){
				ll k=z+b-a[i];
				if(k>z)b-=k-z,k=z;
				if(k>b)z-=k-b,k=b;
				z-=k,b-=k,a[i]-=k,d=k;
			}a[i]-=z+b;
			ll mn=min(a[i],a[i-1]);
			a[i-1]-=mn,a[i]-=mn,ans+=mn,z+=mn;
			ans+=a[i-1],c+=a[i-1],a[i-1]=0;
			a[i]+=d,ans-=d,swap(b,c);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_43960287/article/details/109274146