题目大意:

一个数列 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. 洛谷P1521 求逆序对 题解

    题意: 求1到n的全排列中有m对逆序对的方案数. 思路: 1.f[i][j]表示1到i的全排列中有j对逆序对的方案数. 2.显然,1到i的全排列最多有(i-1)*i/2对逆序对,而对于f[i][j]来 ...

  2. HDU 1426 dancing links解决数独问题

    题目大意: 这是一个最简单的数独填充题目,题目保证只能产生一种数独,所以这里的初始9宫格较为稠密,可以直接dfs也没有问题 但最近练习dancing links,这类数据结构解决数独无疑效率会高很多 ...

  3. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  4. C#中的各种排序算法

    原文发布时间为:2008-11-26 -- 来源于本人的百度文章 [由搬家工具导入] C#算法(一)选择排序using System;public class SelectionSorter{    ...

  5. linux 安装报错:pkg-config not found

    linux 安装报错:pkg-config not found 使用编译安装时,在执行./configure时报如下错误: ... ... checking for pkg-config... no ...

  6. eslint (js代码检查)

    eslint 是一个应用广泛的javascript代码检查工具. 能检测变量名重复等等... 1.安装 npm install -g eslint 2.初始化 会在当前目录下生成一个.eslintrc ...

  7. Javaee的霸主之spring系列

    Spring 顶级框架 谈及微服务,作为当前主流的企业框架Spring,它提供了一整套相关的顶级项目,能让开发者快速的上手实现自己的应用,今天就介绍下Spring旗下各个顶级项目: Spring IO ...

  8. 使用Python将数据插入数据库(一)

    假如我现在有一个Excel数据表格,需要将其数据插入MySQL数据库中.数据如下: 对应的Python实现代码如下: #导入需要使用到的数据模块 import pandas as pd import ...

  9. iphone5s 耳机更换插头 EarPods change jack

    iphone5s 耳机使用了不到两年,出现了接头接触不良,话筒线短路的状况,经常自动出现暂停或者siri.买了一个新耳机,这几天有时间,把旧耳机修好了,更换了一个新的插头.   工具/原料   剥线钳 ...

  10. AngularJS - $index, $event, $log

    原文: https://thinkster.io/egghead/index-event-log --------------------------------------------------- ...