题目描述

题解:

坑题搞了三天。

莫队+线段树。

还有一些和斐波那契数列有关的性质。

首先答案是$a_1f_1+a_2f_2+…+a_nf_n$,

考虑插进去一个元素对答案产生的影响。

比如插进去一个$a_0$,插进去之后会排到第$k$位。

那么答案是$a_1f_1+a_2f_2+…+a_0f_k+a_kf_{k+1}+…+a_nf_{n+1}$,

等于$ans0+a_0f_k+a_kf_{k-1}+…+a_nf_{n-1}$。

所以单点插入,区间加斐波那契数?

不可能的。

考虑用矩阵推出斐波那契数列。

其实不需要矩阵快速幂,存当前$a_i*f_i$和前一个数$a_i*f_{i-1}$即可,

比如我们存的是$(a,b)$,那么有

$(a,b)->(a+b,a)->(2a+b,a+b)->(3a+2b,2a+b)->(5a+3b,3a+2b)->……$

系数都是斐波那契数。

向前转移同理

$(a,b)->(b,a-b)->(a-b,-a+2b)->(-a+2b,2a-3b)->……$

这个系数可以和斐波那契数列一起求,转移也很好推。

线段树单点插入时要一起搞事情,取模要少取,不然会$T$的很惨。

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = ;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,qq,w[N],to[N],m=,B=;
int MOD,f[N],g[N],ans[N];
void Mod(int&x){if(x>=MOD)x-=MOD;}
void init()
{
if(MOD==)return ;
f[]=f[]=;
for(int i=;i<=n+;i++)
Mod(f[i]=f[i-]+f[i-]);
g[]=,g[]=MOD-;
for(int i=;i<=n+;i++)
Mod(g[i]=g[i-]-g[i-]+MOD);
}
struct Pair
{
int x,y;
Pair(){}
Pair(int x,int y):x(x),y(y){}
}p[N];
bool cmp(Pair a,Pair b){return a.x<b.x;}
struct Q
{
int l,r,id;
Q(){}
Q(int l,int r,int i):l(l),r(r),id(i){}
}q[N];
bool CMP(Q a,Q b){return (a.l/B)==(b.l/B)?(a.r<b.r):(a.l<b.l);}
struct segtree
{
int siz[N<<],tag[N<<];
int c[N<<][];
void update(int u)
{
siz[u] = siz[u<<]+siz[u<<|];
Mod(c[u][] = c[u<<][]+c[u<<|][]);
Mod(c[u][] = c[u<<][]+c[u<<|][]);
}
void add(int u,int k)
{
tag[u] += k;
int a = c[u][],b = c[u][];
if(k>)
{
(c[u][] = a*f[k+]+b*f[k])%=MOD;
(c[u][] = a*f[k]+b*f[k-])%=MOD;
}else if(k<)
{
k = -k;
(c[u][] = a*g[k-]+b*g[k])%=MOD;
(c[u][] = a*g[k]+b*g[k+])%=MOD;
}
}
void pushdown(int u)
{
if(tag[u])
{
add(u<<,tag[u]);
add(u<<|,tag[u]);
tag[u] = ;
}
}
void insert(int l,int r,int u,int qx,int k,int d)
{
if(l==r)
{
if(k==-)c[u][]=c[u][]=,siz[u] = ;
else c[u][] = f[k]*to[l]%MOD,c[u][] = f[k-]*to[l]%MOD,siz[u] = ;
return ;
}
pushdown(u);
int mid = (l+r)>>;
if(qx<=mid)insert(l,mid,u<<,qx,k,d),add(u<<|,d);
else insert(mid+,r,u<<|,qx,k+(k!=-)*siz[u<<],d);
update(u);
}
}tr;
int vis[N];
inline void push(int x)
{
if(!x)return ;
if(!vis[x])tr.insert(,m,,x,,);
vis[x]++;
}
inline void pull(int x)
{
if(!x)return ;
vis[x]--;
if(!vis[x])tr.insert(,m,,x,-,-);
}
int main()
{
// freopen("tt.in","r",stdin);
read(n),read(MOD);
init();
for(int a,i=;i<=n;i++)
read(a),p[i]=Pair(a,i);
sort(p+,p++n,cmp);
for(int las = 0x3f3f3f3f,i=;i<=n;i++)
{
if(las != p[i].x)
{
las = p[i].x;
to[++m] = las%MOD;
}
w[p[i].y] = m;
}
read(qq);
for(int l,r,i=;i<=qq;i++)
{
read(l),read(r);
q[i]=Q(l,r,i);
}
sort(q+,q++qq,CMP);
int L = ,R = ;
for(int i=;i<=qq;i++)
{
while(R<q[i].r)push(w[++R]);
while(R>q[i].r)pull(w[R--]);
while(L<q[i].l)pull(w[L++]);
while(L>q[i].l)push(w[--L]);
ans[q[i].id]=tr.c[][];
}
for(int i=;i<=qq;i++)
printf("%d\n",ans[i]);
return ;
}

CF633H Fibonacci-ish II的更多相关文章

  1. 【CF633H】Fibonacci-ish II 莫队+线段树

    [CF633H]Fibonacci-ish II 题意:给你一个长度为n的序列$a_i$.m个询问,每个询问形如l,r:将[l,r]中的所有$a_i$排序并去重,设得到的新数列为$b_i$,求$b_1 ...

  2. CF633H Fibonacci-ish II 莫队、线段树、矩阵乘法

    传送门 这题除了暴力踩标程和正解卡常数以外是道很好的题目 首先看到我们要求的东西与\(Fibonacci\)有关,考虑矩阵乘法进行维护.又看到\(n \leq 30000\),这告诉我们正解算法其实比 ...

  3. 【TOJ 3600】Fibonacci II (对数+斐波那契通项式)

    描述 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i> ...

  4. CF633H Fibonacci-ish II(莫队+线段树)

    温馨提示:本题十分卡常数,我手动开O2才过的.而数据范围不伦不类的n<=30000,常数小的O(n2)居然比O(n√nlogn)跑得快…… 考虑插进去一个元素对答案产生的影响.原本数列为Σa[i ...

  5. ZOJ3774_Power of Fibonacci

    求fibonacci数列前N个数的K次方和. 通项公式:F[n]=((1+sqrt(5))/sqrt(5)-(1-sqrt(5))/sqrt(5))/sqrt(5). 有点乱,不过由于可以保证最后的结 ...

  6. poj3070 Fibonacci

    Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. F ...

  7. 1143 多少个Fibonacci数

    时间限制:500MS  内存限制:65536K提交次数:270 通过次数:16 题型: 编程题   语言: C++;C Description 给你如下Fibonacci 数的定义: F1 = 1 F ...

  8. Codeforces Gym 100286F Problem F. Fibonacci System 数位DP

    Problem F. Fibonacci SystemTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...

  9. LeetCode: Linked List Cycle II 解题报告

    Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cyc ...

随机推荐

  1. 【水水水】678A - Johny Likes Numbers

    #include<stdio.h> #include<iostream> #include<cstdio> #include<queue> #inclu ...

  2. bzoj 3697: 采药人的路径【点分治】

    点分治,设当前处理的块的重心为rt,预处理出每个子树中f[v][0/1]表示组合出.没组合出一对值v的链数(从当前儿子出发的链),能组合出一对v值就是可以有一个休息点 然后对于rt,经过rt且合法的路 ...

  3. Struts+Spring+Hibernate处理Lob(Blob,Clob)

    在使用struts+spring+hibernate的开发中,有些时候用户会有数据库存储文件的需求,在数据库中一般会采用Blob字段或Clob字段来存储二进制图片.流媒体或文件.现就将在实际开发中遇到 ...

  4. 手机测试用例-wap测试用例

    Software Test Case P/F comment tester test time P/F comment tester ID 功能描述 操作步骤 预期结果 备注 wap_001 wap ...

  5. Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) 题解

    真心简单的一场比赛 就是坑比较多(自己太蠢) A是一个水题 3分钟的时候过了 B也是一个比较简单的题 类似的套路见得多了 但是我当时可能比较困 想了一会才想出来 19分钟的时候过掉了 C同样很显然 性 ...

  6. What's mean ORA-25191?

    1.在给表授权的时候.报错ORA-25191 检查该表为IOT 表 . --因为不是按照单表方式授予权限,而是按照用户的方式授予权限,所以该表的父亲表都在该用户下,所以这个报错可以忽略. 2/ 在参考 ...

  7. 482 License Key Formatting 注册码格式化

    详见:https://leetcode.com/problems/license-key-formatting/description/ C++: class Solution { public: s ...

  8. ES--在windows上快速安装

    环境准备 java环境部署: Java下载路径:http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a ...

  9. CentOS 安装图形化界面方法

    登录系统,使用yum 安装 #yum groupinstall 'X Window System'  -y 安装GNOME桌面环境 #yum groupinstall  'GNOME Desktop ...

  10. linux高负载下mysql数据库彻底优化

    同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或 ...