H. Fibonacci-ish II

题目连接:

http://codeforces.com/contest/633/problem/H

Description

Yash is finally tired of computing the length of the longest Fibonacci-ish sequence. He now plays around with more complex things such as Fibonacci-ish potentials.

Fibonacci-ish potential of an array ai is computed as follows:

Remove all elements j if there exists i < j such that ai = aj.

Sort the remaining elements in ascending order, i.e. a1 < a2 < ... < an.

Compute the potential as P(a) = a1·F1 + a2·F2 + ... + an·Fn, where Fi is the i-th Fibonacci number (see notes for clarification).

You are given an array ai of length n and q ranges from lj to rj. For each range j you have to compute the Fibonacci-ish potential of the array bi, composed using all elements of ai from lj to rj inclusive. Find these potentials modulo m.

Input

The first line of the input contains integers of n and m (1 ≤ n, m ≤ 30 000) — the length of the initial array and the modulo, respectively.

The next line contains n integers ai (0 ≤ ai ≤ 109) — elements of the array.

Then follow the number of ranges q (1 ≤ q ≤ 30 000).

Last q lines contain pairs of indices li and ri (1 ≤ li ≤ ri ≤ n) — ranges to compute Fibonacci-ish potentials.

Output

Print q lines, i-th of them must contain the Fibonacci-ish potential of the i-th range modulo m.

Sample Input

5 10

2 1 2 1 2

2

2 4

4 5

Sample Output

3

3

Hint

题意

给你n个数,然后有q次询问

每次询问给你l,r区间

你首先得把l,r区间的数全部拿出来,从小到大排序,然后再去重

然后答案就等于ans = f[1]*a[1]+f[2]*a[2]....+f[n]*a[n]

其中f[i]是第i个fib数

要求答案mod m

题解:

现在出题人总喜欢艹一些大新闻出来

出一些复杂度迷的题目

这道题正解是莫队+奇怪的东西去维护

但是由于常数太大了,还没有大力出奇迹的暴力跑得快……

你说肿么办?

正解如下:

莫队去处理询问,然后线段树去处理答案

线段树怎么处理呢?

这里比较麻烦处理的是push_up

push_up你可以用矩阵去写。

每个点维护两个矩阵,[1][2]是答案的矩阵,[2][2]是fib的矩阵

a[i][1][2] = a[i*2][1][2] + a[i*2+1][1][2] * a[i*2][2][2]

a[i][2][2] = a[i*2][2][2]*a[i*2+1][2][2]

乘号是矩阵乘法

当然,用数学方法也可以

f(k+1)*(a1*f(i)+a2*f(i+1)+...)+f(k)*(a1*(f(i-1))+a2*f(i)....) = a1*f(i+k)+a2*f(i+k+1).....

大暴力代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e4+5;
pair<int,int> a[maxn];
int ans[maxn],step[maxn],f[maxn],l[maxn],r[maxn],last[maxn]; int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].first),a[i].second=i;
sort(a+1,a+1+n);
f[0]=1,f[1]=1;
for(int i=2;i<=n;i++)
f[i]=(f[i-1]+f[i-2])%m;
int q;scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&l[i],&r[i]);
last[i]=-1;
}
for(int i=1;i<=n;i++)
{
int d = a[i].first % m;
for(int j=1;j<=q;j++)
{
if(a[i].second<l[j]||a[i].second>r[j])continue;
if(a[i].first==last[j])continue;
ans[j]=(ans[j]+f[step[j]++]*d)%m;
last[j]=a[i].first;
}
}
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
}

莫队

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e4+5;
int a[maxn],pos[maxn],q,n,m,d[maxn];
int fib[maxn][2];
map<int,int> H;
vector<int> V;
long long Ans[maxn];
int cnt[maxn];
typedef int SgTreeDataType;
struct treenode
{
int L , R ;
SgTreeDataType sum1,sum2,siz;
void update(SgTreeDataType v)
{
siz = v;
sum1 = sum2 = v*d[L]%m;
}
}; treenode tree[maxn*4]; inline void push_down(int o)
{ } inline void push_up(int o)
{
tree[o].siz = tree[2*o].siz + tree[2*o+1].siz;
tree[o].sum1 = (tree[2*o].sum1+fib[tree[2*o].siz][0]*tree[o*2+1].sum1+fib[tree[2*o].siz][1]*tree[o*2+1].sum2)%m;
tree[o].sum2 = (tree[2*o].sum2+fib[tree[2*o].siz+1][0]*tree[o*2+1].sum1+fib[tree[2*o].siz+1][1]*tree[o*2+1].sum2)%m;
} inline void build_tree(int L , int R , int o)
{
tree[o].L = L , tree[o].R = R,tree[o].sum1 = tree[o].sum2 = tree[o].siz = 0;
if (R > L)
{
int mid = (L+R) >> 1;
build_tree(L,mid,o*2);
build_tree(mid+1,R,o*2+1);
}
} inline void update(int QL,int QR,SgTreeDataType v,int o)
{
int L = tree[o].L , R = tree[o].R;
if (QL <= L && R <= QR) tree[o].update(v);
else
{
push_down(o);
int mid = (L+R)>>1;
if (QL <= mid) update(QL,QR,v,o*2);
if (QR > mid) update(QL,QR,v,o*2+1);
push_up(o);
}
}
struct query
{
int l,r,id;
}Q[maxn];
bool cmp(query a,query b)
{
if(pos[a.l]==pos[b.l])
return a.r<b.r;
return pos[a.l]<pos[b.l];
}
void Updata(int x)
{
int p = H[a[x]];
cnt[p]++;
if(cnt[p]==1)
update(p,p,1,1);
}
void Delete(int x)
{
int p = H[a[x]];
cnt[p]--;
if(cnt[p]==0)
update(p,p,0,1);
}
int main()
{
scanf("%d%d",&n,&m);
int sz =ceil(sqrt(1.0*n));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
V.push_back(a[i]);
pos[i]=(i-1)/sz;
} sort(V.begin(),V.end());
V.erase(unique(V.begin(),V.end()),V.end());
for(int i=0;i<V.size();i++)
{
H[V[i]]=i+1;
d[i+1]=V[i]%m;
} fib[0][0]=1%m,fib[1][1]=1%m;
for(int i=2;i<=n;i++)
{
fib[i][0]=(fib[i-1][0]+fib[i-2][0])%m;
fib[i][1]=(fib[i-1][1]+fib[i-2][1])%m;
}
build_tree(1,n,1);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&Q[i].l,&Q[i].r);
Q[i].id = i;
}
sort(Q+1,Q+1+q,cmp);
int l = 1,r = 0;
int ans=0;
for(int i=1;i<=q;i++)
{
int id = Q[i].id;
while(r<Q[i].r)
{
r++;
Updata(r);
}
while(l>Q[i].l)
{
l--;
Updata(l);
}
while(r>Q[i].r)
{
Delete(r);
r--;
}
while(l<Q[i].l)
{
Delete(l);
l++;
}
Ans[id]=tree[1].sum1;
}
for(int i=1;i<=q;i++)
printf("%lld\n",Ans[i]);
}

Manthan, Codefest 16 H. 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(莫队+线段树)

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

  3. Manthan, Codefest 16

    暴力 A - Ebony and Ivory import java.util.*; import java.io.*; public class Main { public static void ...

  4. CF Manthan, Codefest 16 G. Yash And Trees 线段树+bitset

    题目链接:http://codeforces.com/problemset/problem/633/G 大意是一棵树两种操作,第一种是某一节点子树所有值+v,第二种问子树中节点模m出现了多少种m以内的 ...

  5. 牛客小白月赛12 H 华华和月月种树 (离线dfs序+线段树)

    链接:https://ac.nowcoder.com/acm/contest/392/H 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...

  6. Codeforces 446C - DZY Loves Fibonacci Numbers(斐波那契数列+线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 你可能会疑惑我为什么要写 *2400 的题的题解 首先一个很明显的想法是,看到斐波那契数列和 \(10^9+9\) 就想到通项公式,\(F ...

  7. Manthan, Codefest 16 D. Fibonacci-ish

    D. Fibonacci-ish time limit per test 3 seconds memory limit per test 512 megabytes input standard in ...

  8. Manthan, Codefest 16 D. Fibonacci-ish 暴力

    D. Fibonacci-ish 题目连接: http://www.codeforces.com/contest/633/problem/D Description Yash has recently ...

  9. CF #Manthan, Codefest 16 C. Spy Syndrome 2 Trie

    题目链接:http://codeforces.com/problemset/problem/633/C 大意就是给个字典和一个字符串,求一个用字典中的单词恰好构成字符串的匹配. 比赛的时候是用AC自动 ...

随机推荐

  1. php中的__call()函数重载

    <?php #调用类中没有的方法时, 会自动调用__call方法重载 #第一个参数是调用时的方法名, 第二个参数为参数组成的数组 class Cat{ public function Hello ...

  2. 2015多校第6场 HDU 5360 Hiking 贪心,优先队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360 题意:给定n个人,现在要邀请这些人去远足,但每个人同意邀请的条件是当前已经同意去远足的人数c必须 ...

  3. MiCode 40: 找小“3”

    题目链接 这道题真的是zjb恶心, 看其起来像是个数位dp, 然而我并不会数位dp.然后就xjb乱写了个雷类似于动态规划的玩意, 然后调出了\(9\times 9 = 81\)种Bug, 终于过了. ...

  4. 查询 IDE 的版本 方便安装第三方的时候选择

    TMD 很多第三方软件 的版本 定义 与 delphi是不一致的. 1.有的是以这个为准.

  5. HUD-5379

    Mahjong tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  6. 在cmd 中输入了错误mysql命令后,如何退出?

    例如: mysql> select * from tb_name          '>          '>          '>          '> 由于输错 ...

  7. highcharts 折线,饼状,条状综合图

    完整代码如下: <head> <meta http-equiv="Content-Type" content="text/html; charset=u ...

  8. 关于Logstash中grok插件的正则表达式例子

    一.前言 近期需要对Nginx产生的日志进行采集,问了下度娘,业内最著名的解决方案非ELK(Elasticsearch, Logstash, Kibana)莫属. Logstash负责采集日志,Ela ...

  9. cocos2djs ctor init onEnter的区别

    cocos2d-html5 onEnter init ctor构造函数 ---js特有特性(和c++有点不一样 ctor 构造函数, new 一个对象的时候调用-----coco2d-js , 默认c ...

  10. ngCordova安装配置使用教程

    ngCordova是什么 ngCordova是在Cordova Api基础上封装的一系列开源的AngularJs服务和扩展,让开发者可以方便的在HybridApp开发中调用设备能力,即可以在Angul ...