【CF633H】Fibonacci-ish II 莫队+线段树
【CF633H】Fibonacci-ish II
题意:给你一个长度为n的序列$a_i$。m个询问,每个询问形如l,r:将[l,r]中的所有$a_i$排序并去重,设得到的新数列为$b_i$,求$b_1F_1+b_2F_2+...$($F_i$是斐波那契数)。
$n,m\le 30000,a_i\le 10^9$
题解:比较好想,但细节很难处理的题(我根本不懂斐波那契数列~)。
显然只能用莫队。我们对权值开一棵线段树,那么新加入一个数时,我们要进行的是:单点修改,区间整体换成下一个斐波那契数。如果你懒的话直接上矩乘就完事了,如果你还想知道矩阵的每一项到底是什么数的话,自己手推递推式就好了。区间整体换成上一个斐波那契数呢?手动求个逆就行了。
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=30010;
int n,m,N,Q,B;
int f[maxn],g[maxn],p[maxn],ref[maxn],cnt[maxn],v[maxn],ans[maxn];
struct node
{
int l,r,org;
}q[maxn];
int s[maxn<<2][2],siz[maxn<<2],tag[maxn<<2];
bool cmp2(const node &a,const node &b)
{
return (a.l/B==b.l/B)?(a.r<b.r):(a.l/B<b.l/B);
}
bool cmp1(const int &a,const int &b)
{
return v[a]<v[b];
}
inline void upd(int x,int y)
{
tag[x]+=y;
if(y>0)
{
int a=s[x][0],b=s[x][1];
s[x][0]=(f[y+1]*a+f[y]*b)%m,s[x][1]=(f[y]*a+f[y-1]*b)%m;
}
else
{
int a=s[x][0],b=s[x][1];
y=-y;
s[x][0]=(g[y-1]*a+g[y]*b)%m,s[x][1]=(g[y]*a+g[y+1]*b)%m;
}
}
void updata(int l,int r,int x,int a,int b,int y)
{
siz[x]+=y;
if(l==r)
{
if(y==-1) s[x][0]=s[x][1]=0;
else s[x][0]=f[b]*ref[l]%m,s[x][1]=f[b-1]*ref[l]%m;
return ;
}
if(tag[x]) upd(lson,tag[x]),upd(rson,tag[x]),tag[x]=0;
int mid=(l+r)>>1;
if(a<=mid) updata(l,mid,lson,a,b,y),upd(rson,y);
else updata(mid+1,r,rson,a,b+siz[lson],y);
s[x][0]=(s[lson][0]+s[rson][0])%m,s[x][1]=(s[lson][1]+s[rson][1])%m;
}
inline void add(int x)
{
if(!cnt[x]) updata(1,N,1,x,1,1);
cnt[x]++;
}
inline void del(int x)
{
cnt[x]--;
if(!cnt[x]) updata(1,N,1,x,0,-1);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),B=500;
int i,l,r;
for(i=1;i<=n;i++) v[i]=rd(),p[i]=i;
sort(p+1,p+n+1,cmp1);
for(i=1;i<=n;i++)
{
if(i==1||v[p[i]]!=ref[N]) ref[++N]=v[p[i]];
v[p[i]]=N;
}
for(i=1;i<=N;i++) ref[i]%=m;
f[1]=1,g[1]=1;
for(i=2;i<=n+1;i++) f[i]=(f[i-1]+f[i-2])%m,g[i]=(g[i-2]-g[i-1])%m;
Q=rd();
for(i=1;i<=Q;i++) q[i].l=rd(),q[i].r=rd(),q[i].org=i;
sort(q+1,q+Q+1,cmp2);
for(l=1,r=0,i=1;i<=Q;i++)
{
while(l>q[i].l) add(v[--l]);
while(l<q[i].l) del(v[l++]);
while(r<q[i].r) add(v[++r]);
while(r>q[i].r) del(v[r--]);
ans[q[i].org]=(s[1][0]+m)%m;
}
for(i=1;i<=Q;i++) printf("%d\n",ans[i]);
return 0;
}//3 1000 1 2 3 3 1 1 3 3 1 3
【CF633H】Fibonacci-ish II 莫队+线段树的更多相关文章
- Codeforces 666E E - Forensic Examination SA + 莫队 + 线段树
E - Forensic Examination 我也不知道为什么这个复杂度能过, 而且跑得还挺快, 数据比较水? 在sa上二分出上下界, 然后莫队 + 线段树维护区间众数. #include< ...
- 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线
正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...
- Manthan, Codefest 16 H. Fibonacci-ish II 大力出奇迹 莫队 线段树 矩阵
H. Fibonacci-ish II 题目连接: http://codeforces.com/contest/633/problem/H Description Yash is finally ti ...
- [hdoj6483][莫队+线段树/ST]
A Sequence Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- [bzoj4358]permu:莫队+线段树/回滚莫队
这道题是几天前水过去的,现在快没印象了,水一发. 首先我们看到它让求解的是最长的值域 连续段长度,很好. 然后就想到了山海经,但但是我还没有做. 然后又想到了很久以前的一次考试的T3旅馆hotel(我 ...
- BZOJ 4129 树上带修莫队+线段树
思路: 可以先做做BZOJ3585 是序列上的mex 考虑莫队的转移 如果当前数字出现过 线段树上把它置成1 对于询问 二分ans 线段树上查 0到ans的和 是不是ans+1 本题就是把它搞到了序列 ...
- CF633H Fibonacci-ish II(莫队+线段树)
温馨提示:本题十分卡常数,我手动开O2才过的.而数据范围不伦不类的n<=30000,常数小的O(n2)居然比O(n√nlogn)跑得快…… 考虑插进去一个元素对答案产生的影响.原本数列为Σa[i ...
- bzoj 3289: Mato的文件管理 莫队+线段树
题目链接 给一些询问,每个询问给出区间[L, R] , 求这段区间的逆序数. 先分块排序, 然后对于每次更改, 如果是更改L, 那么应该查询区间内比他小的数的个数, 如果更改R, 查区间内比他大的数的 ...
- BZOJ 4358 坑 莫队+线段树 死T
这是一个坑 竟然卡nsqrt(n)logn T死 等更 //By SiriusRen #include <cmath> #include <cstdio> #include & ...
随机推荐
- WPF TextBox属性IsReadOnlyCaretVisible
纠结了半天WPF下只读的TextBox怎么显示输入焦点提示,发现wpf 4中已有新属性“IsReadOnlyCaretVisible”,大善^_^
- (转)Java程序员应该知道的10个调试技巧
(转自 酷勤网 – 程序员的那点事!http://www.kuqin.com/) 试可以帮助识别和解决应用程序缺陷,在本文中,作者将使用大家常用的的开发工具Eclipse来调试Java应用程序.但这里 ...
- Android Material Design控件学习(二)——NavigationView的学习和使用
前言 上次我们学习了TabLayout的用法,今天我们继续学习MaterialDesign(简称MD)控件--NavigationView. 正如其名,NavigationView,导航View.一般 ...
- WebGL常用数学公式
1.三角函数 坐标轴采用右手法则,沿Z轴的逆时针方向为正角度,假设原始点为p(x,y,z),a是X轴旋转到点p的角度,r是从原始点到p点的距离.用这两个变量计算出点p的坐标,等式如下: x = rco ...
- 缓存管理(本地缓存+memcached)
http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html
- 输入控件tagsinput
摘要: tagsinput是一款基于jQuery的插件.具有组织输入内容.校验.backspace删除等功能.当你在输入框输入结束按下enter键,tagsinput会将你输入的内容用标签封装,每 ...
- 自动构建工具Grunt
摘要: 大部分项目在部署之前都需要做的就是js.css文件的压缩.合并,以及一些文件的错误检查,甚至是将LESS文件转换成css文件,coffeescript文件转化成js文件等等.但是项目开发是分迭 ...
- Spring JDBC入门
Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作. 操作JDBC时Spring可以帮我们做这些事情: 定义数据库连接参数,打开数据库连接,处理异常,关闭数据库连接 ...
- cocos2d-x 3.0 在C++中调用lua函数(2)
个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define ...
- MyBatis入门程序之整合Spring
1.引入相关jar包(版本对应关系3.3.1版本的mybatis和1.1.1的spring-mybatis匹配,3.4.1版本的mybatis和1.3.1的spring-mybatis匹配) 如果不对 ...