ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1634F Fibonacci Additions

2022-07-31 18:35:28  阅读:166  来源: 互联网

标签:CF1634F int d% 差分 fib Fibonacci 数组 Additions mod


written on 2022-05-06

传送门

一道好题,是对差分的进一步理解。

首先我们要明确几个结论。

  • 设原数组为 \(C\) ,差分数组为 \(D\) ,那么\(∀i∈[1,n]\) , \(C_i=0\) \(⟺\) \(∀i∈[1,n]\) , \(D_i=0\) 。

  • 差分数组维护的信息是几个相邻数之间的关系,支持将区间操作改为单点操作。

这题的新颖之处在于差分数组与原数组的对应关系。为了满足题目加斐波那契数列的要求,我们定义 \(D_i=C_i-C_{i-1}-C_{i-2}\) 。感性理解一下,位置 \(i\) 的差分数组记录的就是 这个位置的数 与 前两个位置的数的和 之差

那么一次操作就只用对两端进行修改,具体操作见代码。因为每一次都只要查询是否相等,那么我们只需要维护 \(D\) 数组(差分数组)中 \(0\) 的个数即可。

#include<bits/stdc++.h>
#define N 300005
using namespace std;
typedef long long ll;
int n,m;
ll mod,fib[N],a[N],b[N],c[N],d[N];
int main()
{
	scanf("%d%d%lld",&n,&m,&mod);
	fib[1]=fib[2]=1ll;
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=3;i<=n+2;i++) fib[i]=(fib[i-1]+fib[i-2])%mod;
	int now=0;
	for(int i=1;i<=n;i++) scanf("%lld",&b[i]),c[i]=(a[i]-b[i]+mod)%mod;
	for(int i=1;i<=n+2;i++)
	{
		if(i>=2) d[i]=((c[i]-c[i-1]-c[i-2])%mod+mod)%mod;
		else if(i>=1) d[i]=c[i];
		if(i<=n) now+=(d[i]!=0);
	}
	for(int i=1;i<=m;i++)
	{
		char op[3];
		int l,r;
		scanf("%s%d%d",op,&l,&r);
		if(op[0]=='A')
		{
			if(d[l]==0) now++;
			d[l]=(d[l]+1)%mod;
			if(d[l]==0) now--;
			if(r+1<=n)
			{
				if(d[r+1]==0) now++;
				d[r+1]=((d[r+1]-fib[r-l+2])%mod+mod)%mod;
				if(d[r+1]==0) now--;
			}
			if(r+2<=n)
			{
				if(d[r+2]==0) now++;
				d[r+2]=((d[r+2]-fib[r-l+1])%mod+mod)%mod;
				if(d[r+2]==0) now--;
			}
		}
		else
		{
			if(d[l]==0) now++;
			d[l]=(d[l]-1+mod)%mod;
			if(d[l]==0) now--;
			if(r+1<=n)
			{
				if(d[r+1]==0) now++;
				d[r+1]=(d[r+1]+fib[r-l+2])%mod;
				if(d[r+1]==0) now--;
			}
			if(r+2<=n)
			{
				if(d[r+2]==0) now++;
				d[r+2]=(d[r+2]+fib[r-l+1])%mod;
				if(d[r+2]==0) now--;
			}
		}
//		printf("now=%d\n",now);
		puts(now==0?"YES":"NO");
	}
}

其实代码还可以写几个函数然后更短一点的

标签:CF1634F,int,d%,差分,fib,Fibonacci,数组,Additions,mod
来源: https://www.cnblogs.com/Freshair-qprt/p/16537753.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有