首页 > 其他分享 >2023.7.13拷逝

2023.7.13拷逝

时间:2023-07-13 22:55:22浏览次数:48  
标签:13 sum mid long times 2023.7 拷逝 ll mod

T1

原题链接

看到最大值最小,考虑二分答案。接下来考虑如何构造 \(b\) 数组。因为 \(b\) 数组单调不减,所以当前的 \(b\) 越小,对后面的影响越小。所以构造时尽量小地构造 \(b\) ,如果无法构造,说明当前的二分值不合法;如果构造成功,说明合法。

\(code:\)

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll n,sa,sb,sc,sd,a[5000005],f[5000005],sum[5000005],maxn,minn,mod;
ll fun(ll x){
	return (sa*x%mod*x%mod*x%mod+sb*x%mod*x%mod+sc*x%mod+sd)%mod;
}
int main(){
	freopen("Bell.in","r",stdin);
	freopen("Bell.out","w",stdout);
	scanf("%lld%lld%lld%lld%lld%lld%lld",&n,&sa,&sb,&sc,&sd,&a[1],&mod); 
	sum[1]=maxn=minn=a[1];
	for(int i=2;i<=n;++i){
		a[i]=(fun(a[i-1])+fun(a[i-2]))%mod; 
		maxn=max(maxn,a[i]);
		minn=min(minn,a[i]);
		sum[i]=(sum[i-1]+a[i])%mod;
	}
	ll l=minn,r=maxn,mid;
	while(l<r){
		mid=(l+r)>>1;
		f[1]=a[1]-mid;
		bool ok=1;int pos;
		for(int i=2;i<=n;++i){
			f[i]=f[i-1];
			if(a[i]-f[i]>mid){
				f[i]=a[i]-mid;
			}
			else if(f[i]-a[i]>mid){
				ok=0;pos=i;break;
			}
		}
		if(ok)
			r=mid;
		else
			l=mid+1;
	}
	printf("%lld\n",r);
	fclose(stdin);fclose(stdout);
	return 0;
}

T2

原题链接

首先开一个桶,对于当前的 \(a[i]\) ,令\(t[a[i]]++\)。然后发现,如果\(t\)数组以 \(a[i]\) 为中心是回文的,那么对于任意一对满足 \(a[i]-a[j]=a[k]-a[i]\) 的 \(j\),\(k\) 都一定满足\(j<k<i\)或者\(i<j<k<=n\),即一定不满足题意。

如何判断是否回文?只需要开一个值域树状数组,然后哈希处理即可。

\(code:\)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#define ll long long
using namespace std;
const ll mod=1e9+7;
ll n,a[500005],pos[500005],h[500005],c[500005][2];
void add(ll x,ll w,ll id){
	while(x<=n)
		c[x][id]=(c[x][id]+w)%mod,x+=x&(-x);
}
ll ask(ll x,ll id){
	ll re=0;
	while(x)
		re=(re+c[x][id])%mod,x-=x&(-x);
	return re;
}
int main(){
	//freopen("Odd.in","r",stdin);
	//freopen("Odd.out","w",stdout);
	scanf("%lld",&n);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	h[0]=1;
	for(int i=1;i<=n;++i)
		h[i]=h[i-1]*233%mod;
	for(int i=1;i<=n;++i){
		ll len=min(a[i],n-a[i]+1);
		ll w1=(ask(a[i],0)-ask(a[i]-len,0)+mod)%mod;
		ll w2=(ask(a[i]+len-1,1)-ask(a[i]-1,1)+mod)%mod;
		add(a[i],h[a[i]],0);add(a[i],h[n-a[i]+1],1);
		if(w1*h[n-a[i]-len+2]%mod!=w2*h[a[i]-len+1]%mod){
			printf("YES\n");return 0;
		}
	}
	printf("NO\n");
	fclose(stdin);fclose(stdout);
}

T3

较为简单的斜率优化DP (虽然说我在考场上也没写出来吧)

首先推柿子:(假设平均数为\(mid\))

\(v\times m^2=(\sum_{i=1}^m(x_i-mid)^2/m\times m^2\)

\(=(\sum_{i=1}^m(x_i^2+mid^2-2x_i\times mid))/m\times m^2\)

\(=(\sum_{i=1}^mx_i^2+m\times mid^2-2\times m\times mid\times mid)/m\times m^2\)

\(=(\sum_{i=1}^mx_i^2-m\times mid^2)/m\times m^2\)

\(=\sum_{i=1}^mx_i^2\times m^2-(\sum_{i=1}^mx_i)^2\)

所以只需要将原序列分成 \(m\) 段,求出每段的和的平方即可。

设\(f[i][j]\)表示前 \(i\) 个数,分成 \(j\) 段,所有段的和的平方的最小值。

\(f[i][j]=f[k][j-1]+(sum[i]-sum[k])^2(1<k<i)\)

然后斜率优化就\(OK\)了

\(code:\)

#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,ans,f[3005][3005],a[5005],sum[3005],sum2,r[3005],l[3005];int q[3005][3005];
long long dy(long long a,long long b,long long j){
	return f[q[a][j]][j]+sum[q[a][j]]*sum[q[a][j]]-f[q[b][j]][j]-sum[q[b][j]]*sum[q[b][j]];
}
long long dx(long long a,long long b,long long j){
	return sum[q[a][j]]-sum[q[b][j]];
}
long long dy2(long long i,long long b,long long j){
	return f[i][j]+sum[i]*sum[i]-f[q[b][j]][j]-sum[q[b][j]]*sum[q[b][j]];
}
long long dx2(long long i,long long b,long long j){
	return sum[i]-sum[q[b][j]];
}
void work2(){
	for(int i=1;i<=n;++i)
		for(int j=0;j<=m;++j)
			f[i][j]=1e18;
	f[0][0]=0;
	for(int i=1;i<=m;++i)
		q[l[i]=r[i]=1][0]=0;
	for(int j=1;j<=m;++j)
		for(int i=j;i<=n;++i){
			while(l[j-1]<r[j-1]&&(dy(l[j-1]+1,l[j-1],j-1)<=2*sum[i]*dx(l[j-1]+1,l[j-1],j-1)))
				++l[j-1];
			f[i][j]=f[q[l[j-1]][j-1]][j-1]+(sum[i]-sum[q[l[j-1]][j-1]])*(sum[i]-sum[q[l[j-1]][j-1]]);
			while(l[j]<r[j]&&dy(r[j],r[j]-1,j)*dx2(i,r[j],j)>=dy2(i,r[j],j)*dx(r[j],r[j]-1,j))
				--r[j];
			q[++r[j]][j]=i;
		}
	ans=m*f[n][m]-sum[n]*sum[n];
}
int main(){
	//freopen("journey.in","r",stdin);
	//freopen("journey.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
		sum[i]=sum[i-1]+a[i];
		sum2+=a[i]*a[i];
	}
	work2();
	printf("%lld\n",ans);
	fclose(stdin);fclose(stdout);
	return 0;
}

标签:13,sum,mid,long,times,2023.7,拷逝,ll,mod
From: https://www.cnblogs.com/andyl/p/17552436.html

相关文章

  • LeetCode 剑指 Offer 13. 机器人的运动范围
    题目链接:LeetCode剑指Offer13.机器人的运动范围题意:地上有一个m行n列的方格,从坐标[0,0]到坐标[m-1,n-1]。一个机器人从坐标[0,0]的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机......
  • 7.13
    今天上午我大爷爷家的小孙子过满月,一大早就开车出去吃饭去了,下午去驾校练车,学了侧方停车和S型路和过直角弯,晚上的时候我爸一个朋友的儿子高考结束要我们两个同龄人认识一下,之后好帮帮忙啥的又出去吃饭了。今天没有打代码,就看了一会网课学习了方法的重写和super的讲解。......
  • 暑假训练2023.7.13
    CodeforcesRound884(Div.1+Div.2)A.SubtractionGame简单构造,输出a+bB.Permutations&Primes2和3都是质数,1不是,因此满足条件的区间一定包含1。把1放到序列最中间,2和3放到两端其他数字随意排列,可以证明此序列得到的素数mex的个数最大,为\(\lfloor\frac{n+1}{2}\rfl......
  • 2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串
    2023-07-13:如果你熟悉Shell编程,那么一定了解过花括号展开,它可以用来生成任意字符串。花括号展开的表达式可以看作一个由花括号、逗号和小写英文字母组成的字符串定义下面几条语法规则:如果只给出单一的元素x,那么表达式表示的字符串就只有"x"。R(x)={x}例如,表达式"a"......
  • 《摆与混》第十一章--7月13日--周四
    周四,值的反思的一天;1.今天做了什么:今天9点起。洗漱后,纠结于早餐的形式,上午的学习有些心不在焉,下午摆烂时间依旧存在心理斗争,5点出发健身锻炼,饭后看了几场比赛,今天也许无所事事,也许规划满满,我不禁反思什么才是真正的暑假,对于时间的苛责与暑假生活的罪恶感的斗争,这些事情消磨时间与......
  • CF1336C(挺重要的区间dp)
    KaaviandMagicSpell-洛谷|计算机科学教育新生态(luogu.com.cn)我们直接考虑如何构造出来的字符串,这个字符串显然只能每次最左端加或者最右端加入。对于第一个字符,显然每个位置都够能放置,且有两种方案。接着下一个字符加入它的左端或者右端,依次类推。令dp[i][j]为s(1......
  • 7.13总结
    今天总结稍微累点,但也比较充实上午起来后学姐告诉我了视频需要修改的地方,有些目前还改不了,所以打算以后改,后来做了pta,好消息是达到了1500分,该写报告了。下午看了java的课,还是面向对象,学到了接口这个知识点,这个是c++没有的,简单来说是一种规则,而且可以类比成一个抽象类,这还是比较......
  • 7.13打卡
    1.字符常量使用单引号,字符串常量使用双引号表示2.两者均支持转义字符表示,转义字符形式可以参见之前文章。3.以下几种情况必须区别对待:‘A’ 表示单个字符大写字母A,占用1个字节空间“A” 表示字符串,该字符串只有1个大写字母A组成,占用2个字节空间,每个字符串末尾自动会加上一......
  • 7月13日 今日所学 分享整理
    #define_CRT_SECURE_NO_WARNINGS1#include<string.h>#include<stdio.h>intmain(){ intarr1[10]={1,2,3};//不完全初始化 chararr2[5]={1,2,3,4,5}; chararr3[]={1,2,3,4}; chararr4[5]={1,2,3}; chararr5[3]={'a'......
  • 2023.7.13
    今天是养生开始的第一天,我昨天在小诊所买了一些养生的东西,泡一杯茶水,吃一些东西,为未来的消耗做好准备,早上在家里练习乒乓球,中午做一碗番茄炒蛋,下午看了看篮球赛,晚上学习编程1小时,生活再简单不过,不过看你怎么过,世界没有那么难过,就是一定要过去,心平气和地过一天,日复一日,不断进步。......