F-序列查询

v5zsq题解

假设数字xxx在区间[l,r]种出现y次,那么包含x的子区间个数为2r−l+1−y⋅(2y−1)2^{r-l+1-y}·(2^y-1)2r−l+1−y⋅(2y−1),因此对询问贡献是x⋅2r−l+1−y⋅(2y−1)=x[2r−l+1−2r−l+1−y]x·2^{r-l+1-y}·(2^y-1)=x[2^{r-l+1}-2^{r-l+1-y}]x⋅2r−l+1−y⋅(2y−1)=x[2r−l+1−2r−l+1−y]
其中第一部分非常好维护第二部分的贡献,可以把出现次数相同的数一起维护贡献 sum[k]维护出现从次数为k的数字总和是多少。用个链表加快计算。

注意到一起区间中只有O(n)O( \sqrt n )O(n​)种不同的出现次数因为1+2+...+n=O(n)1+2+...+\sqrt n = O(n)1+2+...+n​=O(n)这是一个自然根号所以我们可以用一个均摊的莫队来维护区间可能的出现次数,从而维护区间中所有出现次数然后为了O(1)实现快速幂,我们可以每次O(n)O(\sqrt n)O(n​)算出21,22…2nmodp2^1,2^2…2^{\sqrt n} \mod p21,22…2n​modp以及2n,22n…2nnmodp2^{\sqrt n},2^{2\sqrt n}…2^{\sqrt n\sqrt n} \mod p2n​,22n​…2n​n​modp

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
ll qmi(ll a,ll b,ll mod)
{ll v=1;while(b){if(b&1) v=v*a%mod;a=a*a%mod;b>>=1;}return v;
}
const int N=100005;
int Bs,b[N],a[N],n,m;
struct node
{int l,r,p,id;bool operator<(const node&o)const{if(b[l]==b[o.l]){if(b[l]&1) return r<o.r;return r>o.r;}return b[l]<b[o.l];}
}q[N];
int num[N],cnt[N];
ll sum[N];
int h,fr[N],ne[N];
int ans[N];
int mod;
void insert(int x)
{ne[x]=h;fr[h]=x;fr[x]=0;h=x;
}
void del(int x)
{if(h==x) return h=ne[x],void();ne[fr[x]]=ne[x];fr[ne[x]]=fr[x];
}
void update(int x,int v)
{// 出现个数为num[x]-xif(num[x]){sum[num[x]]-=x;cnt[num[x]]--;if(!cnt[num[x]]) del(num[x]);}num[x]+=v;if(num[x]){sum[num[x]]+=x;cnt[num[x]]++;if(cnt[num[x]]==1) insert(num[x]);}
}
int add(int a,int b)
{a+=b;if(a>=mod) a-=mod;return a;
}
int mul(int a,int b)
{ll z=1ll*a*b;return z-z/mod*mod;
}
int f[1005],g[1005];
void init(int n)
{f[0]=1;for(int i=1;i<=Bs;i++) f[i]=add(f[i-1],f[i-1]);g[0]=1;for(int i=1;i<=n/Bs;i++) g[i]=mul(g[i-1],f[Bs]);
}
int Pow(int n)
{return mul(g[n/Bs],f[n%Bs]);
}
int query(int l,int r,int p)
{mod=p;int len=r-l+1;init(n);  int ans=0;for(int i=h;i;i=ne[i]) ans=add(ans,mul(sum[i]%p,add(Pow(len),p-Pow(len-i))));return ans;
}
int main()
{n=rd(),m=rd();for(int i=1;i<=n;i++) a[i]=rd();Bs=sqrt(n)+1;for(int i=1;i<=n;i++) b[i]=(i-1)/Bs+1;for(int i=1;i<=m;i++) q[i].l=rd(),q[i].r=rd(),q[i].p=rd(),q[i].id=i;sort(q+1,q+1+m);int l=1,r=0;for(int i=1;i<=m;i++){while(r<q[i].r) update(a[++r],1);while(r>q[i].r) update(a[r--],-1);while(l<q[i].l) update(a[l++],-1);while(l>q[i].l) update(a[--l],1);ans[q[i].id]=query(q[i].l,q[i].r,q[i].p);}for(int i=1;i<=m;i++) printf("%d\n",ans[i]);}

牛客练习赛10 F-序列查询(莫队+链表)相关推荐

  1. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  2. 牛客练习赛 43 F Tachibana Kanade Loves Game 容斥原理(Java版ac)

    链接:https://ac.nowcoder.com/acm/contest/548/F 来源:牛客网 题目描述 立华奏是一个天天打比赛的萌新. 省选将至,萌新立华奏深知自己没有希望进入省队,因此开始 ...

  3. 牛客练习赛63 F 牛牛的树行棋 (SG函数+树差分)

    链接:https://ac.nowcoder.com/acm/contest/5531/F 来源:牛客网 牛牛的树行棋 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K, ...

  4. 牛客练习赛29: F. 算式子

    链接:https://www.nowcoder.com/acm/contest/211/F 来源:牛客网 题目描述 给定  个整数  .保证  . 对于每个  ,求出 .为了避免过量输出,你只需要将所 ...

  5. 牛客练习赛50 F tokitsukaze and Another Protoss and Zerg(分治NTT)

    一些废话: 写完上一题(分治FFT)之后记起之前牛客写的这道题,题解是用启发式NTT,每次选两个项数最小的合并,当时没有整理NTT的模板所以就先mark了,今天受到分治FFT的启发,想用分治NTT来解 ...

  6. 牛客练习赛71 F 红蓝图(kruskal重构树)

    红蓝图 给定两个参数x,tx, tx,t,删除边权大于ttt的红边,和边权小于ttt的蓝边,问对于所有的点yyy,既能通过红边走向xxx,又能通过蓝边走向xxx,的点有多少个. 考虑对红边按照边权升序 ...

  7. 牛客练习赛50 F tokitsukaze and Another Protoss and Zerg

    tokitsukaze and Another Protoss and Zerg 考虑生成函数,每一场的生成函数为∑j=1b[i]Cb[i]j+∑j=1a[i]Ca[i]jxj\sum\limits_ ...

  8. 牛客练习赛63 F.牛牛的树行棋(博弈 SG函数)

    题目链接:https://ac.nowcoder.com/acm/contest/5531/F 牛牛的树行棋 前置知识 思路 代码 前置知识 这道题目需要博弈论中的SG函数的知识,这里就不多赘述.主要 ...

  9. 【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】

    传送门:算式子 花了一些时间理解AC的代码,震惊,代码真的是短小精悍,推理能力很强亦或者是做题多,见的多. 能够理解里面的逻辑真的挺难的 题意 给定n,m,\(1\le x\le m\),求\(\su ...

最新文章

  1. 实验5,利用三层交换机实现VLAN间路由
  2. 微软推出MSDN2008中文版有些仓促,中文的MSDN2008Beta2内容都是E文的...
  3. C语言经典例32-删除字符串中指定的字符
  4. ubuntu和windows双系统时间错乱问题
  5. 职业经理人应该如何处理如下问题
  6. 工质热物理性质计算程序的编制及应用_新能源动力电池热管理方案设计和热流体仿真...
  7. excel未完全加载怎么办_你知道如何改变Excel的打开姿势吗?
  8. [vue-cli]vue-cli怎么解决跨域的问题?
  9. win10查看端口占用
  10. Linux操作Oracle(16)——Oracle扩容报错:ORA-01144_表空间数据文件超出最大限制
  11. ATL接口映射宏详解
  12. matlab2013基础教程,Matlab2013a教程
  13. Oracle彻底卸载干净教程
  14. 580刷590bios_老司机带你开车,迪兰570怒刷580BIOS超频至1430M
  15. 实现导出excel,pdf功能
  16. 知乎好物推荐怎么做赚钱?该如何做?
  17. [h5py] 解决ImportError: libhdf5.so.103: cannot open shared object file: No such file or directory
  18. python3的numpy包中的numpy.logspace解析
  19. 【原创】5.4青年有感
  20. 有苦有乐的算法 --- 基数排序

热门文章

  1. 原型链的理解_javascript之快速理解(原型链)
  2. python创建一个空的dataframe_python 创建一个空dataframe 然后添加行数据的实例
  3. 各高校寒假时间公布_高校放假哪家长?多所高校寒假时间公布!
  4. eval() php,js-eval编码,js-eval解码
  5. python求函数极值_python 遗传算法求函数极值的实现代码
  6. 控制是否展示_现场展示板管理不在于看,而在于管!
  7. [C++STL]deque容器用法介绍
  8. 蓝桥杯2015初赛-饮料换购-枚举
  9. C++vector容器-插入和删除
  10. hash table(全域散列法实现的哈希表)