Codeforces 633H. Fibonacci-ish II
题目大意:
一个数列 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的更多相关文章
- CodeForces - 633H :Fibonacci-ish II(正解:莫对+线段树)
Yash is finally tired of computing the length of the longest Fibonacci-ish sequence. He now plays ar ...
- Codeforces 633H Fibonacci-ish II【线段树】
LINK 题目大意 给你一个序列a,Q次询问,每次询问\([l,r]\) 把\([l,r]\)的数排序去重,得到序列b,f是斐波那契数列 求\(\sum_{b=1}^{len} b_if_i\) 思路 ...
- [莫队算法 线段树 斐波那契 暴力] Codeforces 633H Fibonacci-ish II
题目大意:给出一个长度为n的数列a. 对于一个询问lj和rj.将a[lj]到a[rj]从小到大排序后并去重.设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk.当中 ...
- Codeforces 193E - Fibonacci Number(打表找规律+乱搞)
Codeforces 题目传送门 & 洛谷题目传送门 蠢蠢的我竟然第一眼想套通项公式?然鹅显然 \(5\) 在 \(\bmod 10^{13}\) 意义下并没有二次剩余--我真是活回去了... ...
- Codeforces 126D Fibonacci Sums 求n由随意的Sum(fib)的方法数 dp
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq574857122/article/details/34120269 题目链接:点击打开链接 题意 ...
- Codeforces Gym101257F:Islands II(求割点+思维)
http://codeforces.com/gym/101257/problem/F 题意:给出一个n*m的地图,上面相同数字的代表一个国家,问对于每个国家有多少个国家在它内部(即被包围).例如第一个 ...
- CodeForces 346C Number Transformation II
Number Transformation II 题解: 对于操作2来说, a - a % x[i] 就会到左边离a最近的x[i]的倍数. 也就是说 [ k * x[i] + 1, (k+1)* x ...
- Codeforces 346C Number Transformation II 构造
题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> # ...
- codeforces 687D Dividing Kingdom II 带权并查集(dsu)
题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...
随机推荐
- php对象(继承,多态)
/2.继承//function abc(){// $arr = func_get_args();//}//子类只能有一个父类 一个父类 可以有多个子类//override 重写//overlood 重 ...
- 【板+背包】多重背包 HDU Coins
http://acm.hdu.edu.cn/showproblem.php?pid=2844 [题意] 给定n种价值为Ci,个数为Wi的硬币,问在1~V中的这些数中哪些数能由这些硬币组成? [思路] ...
- K/3Cloud二次开发基于WebDev附加进程调试
大部分人在进行K/3cloud二次开发插件的调试时,选择的是附加IIS进程w3wp调试,本文给大家介绍一下基于WebDev附加进程调试,不用重启iis. 步骤如下: 1)拷贝K/3cloud产品安装目 ...
- 潘多拉的盒子(bzoj 1194)
Description Input 第一行是一个正整数S,表示宝盒上咒语机的个数,(1≤S≤50).文件以下分为S块,每一块描述一个咒语机,按照咒语机0,咒语机1„„咒语机S-1的顺序描述.每一块的格 ...
- web移动端小tip,box-flex
1,移动端页面 最重要的标签: <meta content="width=device-width,initial-scale=1.0,minimum-scale=1,maximum- ...
- Delphi接口使用实例介绍
对于Object Pascal语言来说,最近一段时间最有意义的改进就是从Delphi3开始支持接口(interface),接口定义了能够与一个对象进行交互操作的一组过程和函数.对一个接口进行定义包含两 ...
- Linux--进程组、会话、守护进程(转)
http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html 进程组 一个或多个进程的集合 进程组ID: 正整数 两个函数 getpg ...
- 2017多校Round7(hdu6120~hdu6132)
补题进度:9/13 1001 待填坑 1002(数学推导) 题意 有一个按顺序的n个点的k叉树,问每个点子树个数的异或和是多少(n,k<=1e18) 分析 可以先求出最大的d,满足d以上都是满K ...
- 学习日常笔记<day15>mysql基础
1.数据库入门 1.1数据库软件 数据库:俗称数据的仓库,方便管理数据的软件(或程序) 1.2市面上数据库软件 Oracle,甲骨文公司的产品. 当前最流行应用最广泛的数据库软件.和java语言兼容非 ...
- SyntaxError: expected expression, got '<'异常错误
引入jQuery文件,浏览器报SyntaxError: expected expression, got '<'错误,但是jQuery文件可以在网络一栏看到,最后检查是springMVC定义的拦 ...