首页 > 其他分享 >CF1634F Fibonacci Additions 题解

CF1634F Fibonacci Additions 题解

时间:2024-07-29 19:17:06浏览次数:13  
标签:CF1634F cnt int 题解 加减 每次 区间 Additions mod

CF1634F Fibonacci Additions 题解

传送门

题目大意:给定两个序列 \(A\) 和 \(B\),每次一个可以选一个区间,并在区间的第 \(i\) 个数加上 \(F_i\),其中 \(F\) 是斐波那契数列,你需要在每次询问结束时输出两个序列是否相等。


可以先求一个序列 \(C\) 表示 \(A\) 和 \(B\) 每个位置的差,即 \(C_i=A_i-B_i\),然后问题就转换为了在 \(C\) 上面选区间加减,每次看 \(C\) 是否全为 \(0\)。

区间加减,很容易就能想到差分数组,我们看一下差分数组的定义:\(D_i=C_i-C_{i-1}\),它适用的区间加减是加或减同一个数,这样 \(C_i-C_{i-1}\) 不会变。

继续考虑斐波那契的性质:\(F_i=F_{i-1}+F_{i-2}\),所以 \(F_i-F_{i-1}-F_{i-2}=0\),那么每次区间加减时,区间内的数 \(C_i-C_{i-1}-C_{i-2}\) 就不会变,于是可以得出 \(D\) 数组的定义:\(D_i=C_i-C_{i-1}-C_{i-2}\)。

然后每次区间加减就只需要改边界上的值就行了,而且 \(C\) 全为 \(0\) 和 \(D\) 全为 \(0\) 是等价的,所以每次只用看 \(D\) 是否全为 \(0\) 就行了。具体来说,用一个 \(cnt\) 来记录 \(D\) 中 \(0\) 的个数。

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int N = 3e5+5;
int n,q,mod;
ll d[N],f[N],cnt;
void up(int x,ll v)
{
    if(x>n)return;
    cnt -= !d[x];(d[x] += v+mod) %= mod;
    cnt += !d[x];
}
int main()
{
    cin >> n >> q >> mod;
    f[1] = 1;for(int i = 2;i <= n;i++)f[i] = (f[i-1]+f[i-2])%mod;
    for(int i = 1;i <= n;i++)scanf("%d",d+i);
    for(int i = 1;i <= n;i++)
    {
        int x;scanf("%d",&x);
        (d[i] -= x-mod) %= mod;
    }
    for(int i = n;i;i--)
    {
        d[i] = (d[i]-d[i-1]-d[i-2]+mod+mod)%mod;
        cnt += !d[i];
    }
    while(q--)
    {
        int l,r;char s[5];
        scanf("%s %d %d",s,&l,&r);
        if(s[0]=='A'){up(l,1);up(r+1,-f[r-l+2]);up(r+2,-f[r-l+1]);}
        else{up(l,-1);up(r+1,f[r-l+2]);up(r+2,f[r-l+1]);}
        puts(cnt==n?"YES":"NO");
    }
}

标签:CF1634F,cnt,int,题解,加减,每次,区间,Additions,mod
From: https://www.cnblogs.com/max0810/p/18330853

相关文章

  • 剑指Offer题解合集
    剑指Offer题单及题解题目顺序为牛客上剑指Offer专题JZ3、数组中重复的数字分析可以直接对数组进行排序,通过判断首末数字大小来判断数字越界情况,注意数组为空的情况。发现\(0\leqnums[i]\leqn-1\),因此直接开一个数组判断是否有重复数字即可,返回第一个重复数字。代码......
  • 力扣题解2-两数相加
    问题的描述如下:分析过程:为了解决这个问题,我们需要逐位相加两个链表对应位置的值,并处理进位问题。具体步骤如下:初始化一个新的链表,用于存储结果。使用两个指针遍历两个输入链表,逐位相加,同时考虑进位。如果一个链表比另一个短,则将其视为0进行计算。处理最后可能存在的进位......
  • curl发送get和post请求时遇到&截断的问题解决
    get的parameter里带&被截断处理第一种是双引号括住 第二种是加反斜杠转义 post请求的body里有参数的value带了&curl-XPOSThttp://qa-ci.fuxi.netease.com:36800/job/xxxxx/xxxx--userxxxx:xxxxx-d token=popo -d"msg=cd/ssd/deployment_bash&&bashkill.b......
  • P10812 【MX-S2-T3】跳 题解
    题目分析考虑DP。显然当没有\(i\)连向\(i+1\)的边时,整个图是一个DAG,可以直接DP。所以我们DP要解决的唯一问题,就是考虑上\(i\)到\(i+1\)的边。考虑从\(n\)走到\(1\)的过程。当我们从\(i\)向前跳到\(j\)后,此时我们要么向前跳,要么往回走。又因为不能经过重复......
  • CF30E Tricky and Clever Password 题解
    考虑先贪心中间的回文串\(b\),因为这即使影响了两边的字符串,也不会改变最终的总串长。所以先使用manacher跑出来每个位置的最长回文半径。在考虑怎样找出最长的\(a\)和\(a'\)。可以二分答案,设此时答案为\(k\),找出的\(b\)串为\(s[l\dotsr]\),那么其合法的条件就是存在\(......
  • 关于网站安全狗卸载了仍然能拦截的问题解决
    关于网站安全狗卸载了仍然能拦截的问题解决如果你将所有safedog的文件删除的话,可能会导致Apache服务启动不了例如:这里没有提示相关安全狗的信息是因为我已经删除了Apache访问safedog的配置代码,只是提醒错误信息会如上图所示。导致这种原因的结果大概率是因为Apache的conf文件......
  • 题解:P4563 [JXOI2018] 守卫
    思路解法:区间DP。本题虽标上紫题,但黄队说了:“不要被颜色所吓倒。”易得,区间\([l,r]\)中最右端的亭子\(r\)一定会有保镖。先说一下可见性判断吧,只要\(l,r\)的连线的斜率大于\(p,r\)连成的线的斜率大,\(l\)即是可见的。如图,红线是\(r\)无法看到的,而蓝线是\(r\)可......
  • CF1178D Prime Graph 题解
    首先考虑一个问题:如果没有边数是素数的限制,应该怎么构造?这其实很简单,把原图连成一个环即可,每个点度数为\(2\)。接着考虑在原图上加边,注意到\(3\)也是个素数,所以每次可以任意选两个度数为\(2\)的点连边,此时仍然符合条件。这样加边最多可以加\(\left\lfloor\frac{n}{2}\rig......
  • CF685E 题解
    吐槽一下,为啥这道题\(\mathcal{O}(nm)\)可以过。联考的时候做到了这道题,还一直在想更快的算法。。。然后,这联考的数据是自己出的,有\(s=t\)的情况,我反正是完全没有想到,又因为是捆绑测试,直接痛失\(100pts\)。首先考虑转化一下题目。对于一个询问\(l,r,s,t\),就相当于是让你......
  • P4468[SCOI2007]折纸-题解
    题意:有一个左下角为\((0,0)\),右上角为\((100,100)\)的正方形,给你\(n\)个有向线段和\(m\)个询问,将纸片依次按直线折叠,然后每次询问让你求出某个点上有多少层纸。分析:观察到数据范围非常小,于是可以直接对于每个询问\(\mathcal{O}(2^n)\)来求。具体的,对于每一个点,倒着枚......