题目大意:

一个数列 q次询问 每次询问l r

将数列中l-r的位置排序去重后的数列成为b

输出 sigma b i * F i (其中F i为斐波那契数列中的第i项)

思路:

由于要去重 考虑权值线段树 于是先把整个数列离散

区间+不会=莫队 由于n为30000 考虑每次修改log n的复杂度

用线段树维护当前线段的答案 数字个数

发现并不会维护

因为我们需要把 1-a 1-b 的这两个区间合并为 1- a+b

看了一波tutorial 发现:

(尝试证明 但由于水平太菜只能用通项公式口胡)

这样的话就可以维护了 在线段树内再维护一下那个东西即 答案多项式的系数变为斐波那契前一项

就搞完了

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define inf 2139062143
#define ll long long
#define MAXN 30100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,m,MOD,bl[MAXN],sz,g[MAXN],vis[MAXN],to[MAXN],val[MAXN];
int res[MAXN<<],tag[MAXN<<],sum[MAXN<<],f[MAXN],ans[MAXN];
struct data {int l,r,id;}q[MAXN];
bool cmp(data a,data b)
{
if(bl[a.l]==bl[b.l]) return a.r<b.r;
return a.l<b.l;
}
inline void upd(int k)
{
sum[k]=sum[k<<]+sum[k<<|];int lv=sum[k<<];
res[k]=(res[k<<]+(f[lv+]*res[k<<|])%MOD+(f[lv]*tag[k<<|])%MOD)%MOD;
if(lv) tag[k]=(tag[k<<]+(f[lv]*res[k<<|])%MOD+(f[lv-]*tag[k<<|])%MOD)%MOD;
else tag[k]=(tag[k<<]+tag[k<<|])%MOD;
}
void mdf(int k,int l,int r,int x,int w)
{
if(l==r) {tag[k]=,sum[k]=w,res[k]=w?g[l]:;return ;}
int mid=l+r>>;
if(x<=mid) mdf(k<<,l,mid,x,w);
else mdf(k<<|,mid+,r,x,w);
upd(k);
}
inline void add(int x)
{
vis[x]++;if(vis[x]-) return ;
mdf(,,n,x,);
}
inline void del(int x)
{
vis[x]--;if(vis[x]) return ;
mdf(,,n,x,);
}
int main()
{
n=read(),MOD=read(),sz=sqrt(n);int N;
for(int i=;i<=n;i++) val[i]=g[i]=read(),bl[i]=(i-)/sz,f[i]= i<=?:(f[i-]+f[i-])%MOD;
sort(g+,g+n+);N=unique(g+,g+n+)-g-;
for(int i=;i<=n;i++) to[i]=lower_bound(g+,g+N+,val[i])-g;
m=read();
for(int i=;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+,q+m+,cmp);n=N;int l=q[].l,r=q[].l-;
for(int i=;i<=m;i++)
{
while(l>q[i].l) add(to[--l]);
while(l<q[i].l) del(to[l++]);
while(r<q[i].r) add(to[++r]);
while(r>q[i].r) del(to[r--]);
ans[q[i].id]=res[];
}
for(int i=;i<=m;i++) printf("%d\n",ans[i]);
}

Codeforces 633H. Fibonacci-ish II的更多相关文章

  1. CodeForces - 633H :Fibonacci-ish II(正解:莫对+线段树)

    Yash is finally tired of computing the length of the longest Fibonacci-ish sequence. He now plays ar ...

  2. Codeforces 633H Fibonacci-ish II【线段树】

    LINK 题目大意 给你一个序列a,Q次询问,每次询问\([l,r]\) 把\([l,r]\)的数排序去重,得到序列b,f是斐波那契数列 求\(\sum_{b=1}^{len} b_if_i\) 思路 ...

  3. [莫队算法 线段树 斐波那契 暴力] Codeforces 633H Fibonacci-ish II

    题目大意:给出一个长度为n的数列a. 对于一个询问lj和rj.将a[lj]到a[rj]从小到大排序后并去重.设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk.当中 ...

  4. Codeforces 193E - Fibonacci Number(打表找规律+乱搞)

    Codeforces 题目传送门 & 洛谷题目传送门 蠢蠢的我竟然第一眼想套通项公式?然鹅显然 \(5\) 在 \(\bmod 10^{13}\) 意义下并没有二次剩余--我真是活回去了... ...

  5. Codeforces 126D Fibonacci Sums 求n由随意的Sum(fib)的方法数 dp

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/34120269 题目链接:点击打开链接 题意 ...

  6. Codeforces Gym101257F:Islands II(求割点+思维)

    http://codeforces.com/gym/101257/problem/F 题意:给出一个n*m的地图,上面相同数字的代表一个国家,问对于每个国家有多少个国家在它内部(即被包围).例如第一个 ...

  7. CodeForces 346C Number Transformation II

    Number Transformation II 题解: 对于操作2来说, a - a % x[i] 就会到左边离a最近的x[i]的倍数. 也就是说 [ k * x[i] + 1,  (k+1)* x ...

  8. Codeforces 346C Number Transformation II 构造

    题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> # ...

  9. codeforces 687D Dividing Kingdom II 带权并查集(dsu)

    题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...

随机推荐

  1. 让你的 CDN 费用省 50% 以上!图片瘦身的正确姿势

    七牛云新推出的图片瘦身功能是做什么的? 打开七牛云的「数据处理」中的「图片瘦身」功能,在图片受到访问时,能够实时对图片进行瘦身,在保证分辨率和画质不变的情况下,可以将图片最高缩小 80%.当「图片瘦身 ...

  2. POJ 1080 Human Gene Functions 【dp】

    题目大意:每次给出两个碱基序列(包含ATGC的两个字符串),其中每一个碱基与另一串中碱基如果配对或者与空串对应会有一个分数(可能为负),找出一种方式使得两个序列配对的分数最大 思路:字符串动态规划的经 ...

  3. Codeforces 660E Different Subsets For All Tuples【组合数学】

    看了官方题解+q神的讲解才懂... 智商问题.. 讲道理..数学真的比脱单难啊... 题目链接: http://codeforces.com/problemset/problem/660/E 题意: ...

  4. HDU 4193 Non-negative Partial Sums【单调队列】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4193 题意: 给定序列,可以把后面的连续的部分移到最前面来,问多少种移法使得最终得到的序列的前i项和 ...

  5. 2015轻院校赛 B 迷宫 (bfs)

    http://acm.zznu.edu.cn/problem.php?id=1967 这套题的有毒   我交了好多遍才对 坑:机关要按照顺序走 并且在走这个机关之前不能走这个机关  但是能穿过这个机关 ...

  6. webpack体积优化篇二(GZ压缩)

    这里我列举几个常用的能够用于减少包体大小的插件,我们可以根据项目需求选择性的使用: compression-webpack-plugin :该插件能够将资源文件压缩为.gz文件,并且根据客户端的需求按 ...

  7. Spring MVC中 log4j日志文件配置相对路径

    log4j和web.xml配置webAppRootKey 的问题 1 在web.xml配置 <context-param>  <param-name>webAppRootKey ...

  8. 蓦然回首,Java 已经 24 岁了!

    01.蓦然 真没想到,Java 竟然 24 岁了(算是 90 后)! 提起 Java,印象最深刻的当然就是: class Cmower {  public static void main(Strin ...

  9. iOS远程推送原理

    远程推送 就是从远程server推送消息给client的通知.当然须要联网. 远程推送服务APNs (Apple Push NotificationServices) 为什么须要远程推送通知? 传统获 ...

  10. win8系统 如何不显示这台电脑的文件夹

    在win8系统中,默认有下面这种文件夹   只要打开注册表编辑器,找到下面所示的项目,删除所有子文件夹即可(最后剩下一个DelegateFolders不用管) [HKEY_LOCAL_MACHINE\ ...