温馨提示:本题十分卡常数,我手动开O2才过的。而数据范围不伦不类的n<=30000,常数小的O(n2)居然比O(n√nlogn)跑得快……

考虑插进去一个元素对答案产生的影响。原本数列为Σa[i]f[i],其中1<=i<=n,然后考虑在k位置插入a[0],答案显然是a[1]f[1]+a[2]f[2]+...+a[0]f[k]+a[k]f[k+1]+...+a[n]f[n+1],然后直接区间加斐波那契数显然是不可能的。这时候要向后转移斐波那契数列,(a,b)->(a+b,a)->(2a+b,a+b)->(3a+2b,2a+b)->……系数始终是斐波那契数。

删除时向前转移?系数可以和斐波那契数一起直接求。

我是开O2、O3、Ofast优化才过的,如果能正常过可能会换成常数较小的code吧

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef pair<int,int>pii;
const int N=;
struct node{int l,r,id;}q[N];
int n,m,B,Q,mod,f[N],g[N],vis[N],a[N],w[N],sz[N<<],lazy[N<<],c[N<<][],ans[N];
pii p[N];
bool cmp(node a,node b){return (a.l-)/B==(b.l-)/B?a.r<b.r:a.l<b.l;}
void pushup(int rt)
{
sz[rt]=sz[rt<<]+sz[rt<<|];
c[rt][]=(c[rt<<][]+c[rt<<|][])%mod;
c[rt][]=(c[rt<<][]+c[rt<<|][])%mod;
}
void add(int rt,int k)
{
lazy[rt]+=k;
int a=c[rt][],b=c[rt][];
if(k>)c[rt][]=(1ll*a*f[k+]+1ll*b*f[k])%mod,c[rt][]=(1ll*a*f[k]+1ll*b*f[k-])%mod;
else k=-k,c[rt][]=(1ll*a*g[k-]+1ll*b*g[k])%mod,c[rt][]=(1ll*a*g[k]+1ll*b*g[k+])%mod;
}
void pushdown(int rt){if(lazy[rt])add(rt<<,lazy[rt]),add(rt<<|,lazy[rt]),lazy[rt]=;}
void update(int k,int v,int d,int l,int r,int rt)
{
if(l==r)
{
if(v==-)c[rt][]=c[rt][]=sz[rt]=;
else c[rt][]=1ll*f[v]*a[l]%mod,c[rt][]=1ll*f[v-]*a[l]%mod,sz[rt]=;
return;
}
pushdown(rt);
int mid=l+r>>;
if(k<=mid)update(k,v,d,lson),add(rt<<|,d);
else update(k,v+(v!=-)*sz[rt<<],d,rson);
pushup(rt);
}
void add(int x)
{
if(!x)return;
if(!vis[x])update(x,,,,m,);
vis[x]++;
}
void del(int x)
{
if(!x)return;
vis[x]--;
if(!vis[x])update(x,-,-,,m,);
}
int main()
{
scanf("%d%d",&n,&mod),B=;
f[]=f[]=;
for(int i=;i<=n+;i++)f[i]=(f[i-]+f[i-])%mod;
g[]=,g[]=mod-;
for(int i=;i<=n+;i++)g[i]=(g[i-]-g[i-]+mod)%mod;
for(int i=,x;i<=n;i++)scanf("%d",&x),p[i]=pii(x,i);
sort(p+,p+n+);
for(int i=,lst=1e9+;i<=n;i++)
{
if(lst!=p[i].first)lst=p[i].first,a[++m]=lst%mod;
w[p[i].second]=m;
}
scanf("%d",&Q);
if(mod==){while(Q--)puts("");return ;}
for(int i=;i<=Q;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+,q+Q+,cmp);
for(int i=,l=,r=;i<=Q;i++)
{
while(r<q[i].r)add(w[++r]);
while(r>q[i].r)del(w[r--]);
while(l<q[i].l)del(w[l++]);
while(l>q[i].l)add(w[--l]);
ans[q[i].id]=c[][];
}
for(int i=;i<=Q;i++)printf("%d\n",ans[i]);
}

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. Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树

    E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...

  3. 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线

    正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...

  4. Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵

    H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...

  5. [hdoj6483][莫队+线段树/ST]

    A Sequence Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. [bzoj4358]permu:莫队+线段树/回滚莫队

    这道题是几天前水过去的,现在快没印象了,水一发. 首先我们看到它让求解的是最长的值域 连续段长度,很好. 然后就想到了山海经,但但是我还没有做. 然后又想到了很久以前的一次考试的T3旅馆hotel(我 ...

  7. BZOJ 4129 树上带修莫队+线段树

    思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...

  8. bzoj 3289: Mato的文件管理 莫队+线段树

    题目链接 给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数. 先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的 ...

  9. BZOJ 4358 坑 莫队+线段树 死T

    这是一个坑 竟然卡nsqrt(n)logn T死 等更 //By SiriusRen #include <cmath> #include <cstdio> #include & ...

随机推荐

  1. Spring 事件(2)- 自定义事件

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  2. hdu 1087 最长上升序列和 dp

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  3. js模式-观察者模式

    // 主题,接收状态变化,触发每个观察者 class Subject { constructor() { this.state = 0 this.observers = [] } getState() ...

  4. HTML5 新增元素梳理

    HTML5新增元素如下图: <canvas> 新元素 <canvas> 标签定义图形,比如图表和其他图像,该标签基于javascript的绘图api 新多媒体元素 <au ...

  5. Codeforces 392 C Unfair Poll(模拟)

    题意:老师点名顺序规则如下:第1排,第2排,……,第n-1排,第n排,第n-1排,……,第2排,第1排,第2排,……,第n-1排,第n排,……对于每排都是从左到右依次点名,问点名k个人后,所有人中最多 ...

  6. Tyvj1952 Easy

    %%http://hzwer.com/2838.html 比较巧妙的是原来L^2->(l+1)^1=L^2+2*L+1这样就可以递推了 “?”的贡献及时“o”贡献的1/2. #include&l ...

  7. C# 直接使用sql语句对数据库操作 (cmd.ExecuteNonQuery)

    只介绍读和删 不管使用什么方法来对数据库进行操作都绕不开和数据库的连接问题,所以咱们先在App.config中添加连接字段 <connectionStrings> <add name ...

  8. 兼容iphonex底部那个

    @media only screen and (device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ra ...

  9. 2016蓝桥杯省赛C/C++A组第三题 方格填数

    题意:如下的10个格子  填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 分析:dfs,划定边界,行1~4,列1~3,初始化为INT_IN ...

  10. 51nod1007:正整数分组 DP

    1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 ...