题目大意:

一个数列 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. Go内建变量类型

    package main import ( "math/cmplx" "fmt" "math" ) //内建变量类型: // bool , ...

  2. [luoguP2982][USACO10FEB]慢下来Slowing down(dfs序 + 线段树)

    传送门 这个题显然可以用树链剖分做. 然而线段树也能做. 每个点都对它的子树有贡献,所以先求一边 dfs序,然后直接在 dfs序 中搞 线段树 就行. ——代码 #include <cstdio ...

  3. hdu 1500 dp

    /* 状态转移方程式: dp[i][j]=Min(dp[i][j-1],dp[i-1][j-2]+(a[j-1]-a[j])*(a[j-1]-a[j])); 依次求出第i个人在第j个数时的所求的最小值 ...

  4. Jquery操作事件

    1.文档加载事件 2.DOM单击双击事件 3.DOM获得焦点,失去焦点问题 4.DOM鼠标移入,移出事件 <!DOCTYPE html> <html> <head> ...

  5. 钱币兑换问题---hdu1284(完全背包)

    Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于32768.   ...

  6. 洛谷 P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下 ...

  7. 仿苹果app下载动画-煎饼

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. FlashFXP绿色版

    http://www.xdowns.com/soft/1/98/2006/Soft_30927.html

  9. Spark SQL数据载入和保存实战

    一:前置知识具体解释: Spark SQL重要是操作DataFrame,DataFrame本身提供了save和load的操作. Load:能够创建DataFrame. Save:把DataFrame中 ...

  10. POJ2752 Seek the Name, Seek the Fame 【KMP】

    Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11602   Ac ...