Csp-s2019 划分


本題主要靠結論

12pt

爆搜

時間復雜度\(O(n^n)\)

36pt

\(f_{i,j}表示前i個數由狀態j轉移過來,a_i表示前綴和\)

\(So,f_{i,j}=f_{j,k}+(a_i-a_j)^2\ \ \ \ \ \ \ (a_j-a_k\leq a_i-a_j)\)

時間復雜度\(O(n^3)\)

64pt

我們發現,在\(i\)變大過程中,每個\(j\)對應的\(k\)也只會變大,所以用一個\(g_j\)表示當前\(j\)狀態的\(k\)動到哪兒了,再配合后綴最小值均攤轉移\(O(1)\)

時間復雜度\(O(n^2)\)

100pt

結論:當\(j\)一定時取\(k\)最大的,並且要合法。

證明

所以:\(f_i=min \{f_j+(a_i-a_j)^2\}\ \ \ \ \ \ \ \ \ \ (a_j-a_{g_j} \leq a_i-a_j)\)

我們把條件變換一下\(\Rightarrow\) \(2*a_j-a_{g_j}\leq a_i\),發現可以用單調隊列優化

\(\mathfrak{Talk\ is\ cheap,show\ you\ the\ code.}\)

#include<cstdio>
#include<algorithm>
using namespace std;
# define Type template<typename T>
# define read read1<int>()
Type inline T read1()
{
	T t=0;
	bool ty=0;
	char k;
	do k=getchar(),(k=='-')&&(ty=1);while('0'>k||k>'9');
	do t=(t<<3)+(t<<1)+(k^'0'),k=getchar();while('0'<=k&&k<='9');
	return ty?-t:t;
}
# define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
# define ll long long
# define I128 __int128
int s,p[100001],l[100001],r[100001],g[40000001],q[40000001];
# define ret(n) (a[n]*2-a[g[n]])
ll a[40000002];
bool ty;
void into()
{
	s=read;ty=read;
	if(!ty)for(int i=0;i++^s;)a[i]=read;
	else
	{
		ll x=read,y=read,z=read;
		int now=0,b[2];
		b[0]=read,b[1]=read;
		int m=read;
		for(int i=0;i++^m;p[i]=read,l[i]=read,r[i]=read);
		for(int i=0;i++^s;)
		{
			while(p[now]<i)++now;
			if(i<=2)a[i]=b[i-1]%(r[now]-l[now]+1)+l[now];	
			else
			{
				b[0]^=b[1]^=(b[0]=(y*b[0]+x*b[1]+z)%(1<<30))^=b[1];
				a[i]=b[1]%(r[now]-l[now]+1)+l[now];
			}
		}
	}
}
void work()
{
	int l=0,r=0;
	for(int i=0;i++^s;a[i]+=a[i-1]);
	for(int i=0;i++^s;)
	{
		while(l<r&&ret(q[l+1])<=a[i])++l;
		g[i]=q[l];
		while(l<r&&ret(q[r])>=ret(i))--r;
		q[++r]=i;
	}
	I128 ans=0;
	while(s)ans+=(I128)(a[s]-a[g[s]])*(a[s]-a[g[s]]),s=g[s];
	r=0;
	do
	{
		q[++r]=ans%10;
		ans=ans/10;
	}while(ans);
	do
	{
		printf("%d",q[r]);
	}while(--r);
}
int main()
{
	//fre("partition");
	into();
	work();
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM