CSP 前学习珂学,祝自己 \(while(1)\ rp++\)。


考虑求解出每种数对答案的贡献。

设 \(t=r-l+1,k_x=\sum\limits_{i=l}^r [a_i=x]\),由容斥得贡献为 \(x(2^t-2^{t-k_x})\)。

求解 \(k_x\),考虑莫队,时间复杂度为 \(O(n\sqrt n)\),这也是本题的复杂度上限。

由于 \(p\) 会变,所以不能用莫对维护 \(2^i\)。我们希望答案的计算次数级别为 \(O(\sqrt n)\),考虑根号分治:

  • 对于出现次数 \(\le \sqrt n\) 的数,我们用数组 \(num_i\) 统计,表示当前子串出现次数为 \(i\) 的数之和为多少。可以表示为: \(num_i=\sum\limits_{j=1}^{10^5}[k_j=i]\times j\),时间复杂度 \(O(\sqrt n)\)。

  • 对于出现次数 \(>\sqrt n\) 的数,我们直接维护它们的 \(k_i\)。由于这种数的个数级别为 \(O(\sqrt n)\),所以也没问题。

现在只需要考虑快速幂的问题。普通快速幂肯定是不行了,时间复杂度会多一只 \(\log\)。考虑预处理可以给到 \(O(\sqrt n)\),选择光速幂。

时间复杂度 \(O(\sqrt n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,kl,a[N],l=1,r,ans[N];
struct que{int l,r,p,id;}q[N];
int cmp(que x,que y){
if(x.l/kl!=y.l/kl)
return x.l/kl<y.l/kl;
if(x.l/kl%2) return x.r>y.r;
return x.r<y.r;
}int pw1[N],pw2[N],p;
void init(int c){
p=c,pw1[0]=pw2[0]=1;
for(int i=1;i<=kl;i++)
pw1[i]=pw1[i-1]*2%p;
for(int i=1;i<=kl;i++)
pw2[i]=pw2[i-1]*pw1[kl]%p;
}int kpow(int y){
return pw1[y%kl]*pw2[y/kl]%p;
}int num[N],sum[N],vis[N],b[N],id;
void add(int x){
sum[x]++;
if(vis[x]) return;
num[sum[x]-1]-=x;
num[sum[x]]+=x;
}void del(int x){
sum[x]--;
if(vis[x]) return;
num[sum[x]+1]-=x;
num[sum[x]]+=x;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m,kl=sqrt(n)+1;
for(int i=1;i<=n;i++)
cin>>a[i],num[a[i]]++;
for(int i=1;i<=1e5;i++){
if(num[i]>kl)
b[++id]=i,vis[i]=1;
num[i]=0;
}for(int i=1;i<=m;i++)
cin>>q[i].l>>q[i].r>>q[i].p,q[i].id=i;
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;i++){
init(q[i].p);int ij=q[i].id;
while(r<q[i].r) add(a[++r]);
while(r>q[i].r) del(a[r--]);
while(l>q[i].l) add(a[--l]);
while(l<q[i].l) del(a[l++]);
for(int j=1;j<=id;j++)
ans[ij]=(ans[ij]+b[j]*(kpow(r-l+1)-kpow(r-l+1-sum[b[j]])))%p;
for(int j=1;j<=kl;j++)
ans[ij]=(ans[ij]+num[j]*(kpow(r-l+1)-kpow(r-l+1-j)))%p;
ans[ij]=(ans[ij]+p)%p;
}for(int i=1;i<=m;i++)
cout<<ans[i]<<"\n";
return 0;
}

[Ynoi2015] 盼君勿忘 题解的更多相关文章

  1. 题解 P5072 【[Ynoi2015] 盼君勿忘】

    在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...

  2. [Ynoi2015]盼君勿忘

    题目大意: 给定一个序列,每次查询一个区间\([l,r]\)中所有子序列分别去重后的和\(\bmod p\)(每次询问模数不同). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后 ...

  3. 【题解】Luogu P5072 [Ynoi2015]盼君勿忘

    众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题 我博客里对莫队的简单介绍 既然是莫队,我们就要考虑每多一个数或少一个数对答案的贡献是什么 假 ...

  4. Luogu P5072 [Ynoi2015]盼君勿忘

    题意 给定一个长度为 \(n\) 的序列 \(a\) 和 \(m\) 次询问,第 \(i\) 次询问需要求出 \([l_i,r_i]\) 内所有子序列去重之后的和,对 \(p_i\) 取模. \(\t ...

  5. 洛谷P5072 [Ynoi2015]盼君勿忘 [莫队]

    传送门 辣鸡卡常题目浪费我一下午-- 思路 显然是一道莫队. 假设区间长度为\(len\),\(x\)的出现次数为\(k\),那么\(x\)的贡献就是\(x(2^{len-k}(2^k-1))\),即 ...

  6. P5072 [Ynoi2015]盼君勿忘

    传送门 一开始理解错题意了--还以为是两个子序列相同的话只算一次--结果是子序列里相同的元素只算一次-- 对于一个区间\([l,r]\),设其中\(x\)出现了\(k\)次,那么它的贡献就是它的权值乘 ...

  7. 洛谷:P5072 [Ynoi2015]盼君勿忘

    原题地址:https://www.luogu.org/problem/P5072 题目简述 给定一个序列,每次查询一个区间[l,r]中所有子序列分别去重后的和mod p 思路 我们考虑每个数的贡献.即 ...

  8. 【洛谷5072】[Ynoi2015] 盼君勿忘(莫队)

    点此看题面 大致题意: 一个序列,每次询问一个区间\([l,r]\)并给出一个模数\(p\),求模\(p\)意义下区间\([l,r]\)内所有子序列去重后值的和. 题意转化 原来的题意看起来似乎很棘手 ...

  9. Luogu5072 [Ynoi2015]盼君勿忘 【莫队】

    题目描述:对于一个长度为\(n\)的序列,\(m\)次询问\(l,r,p\),计算\([l,r]\)的所有子序列的不同数之和\(\mathrm{mod} \ p\). 数据范围:\(n,m,a_i\l ...

  10. EC笔记:第二部分:12、复制对象时勿忘其每一个成分

    EC笔记:第二部分:12.复制对象时勿忘其每一个成分 1.场景 某些时候,我们不想使用编译器提供的默认拷贝函数(包括拷贝构造函数和赋值运算符),考虑以下类定义: 代码1: class Point{ p ...

随机推荐

  1. Electron(2) - 下载与解压缩

    1.下载文件 主线程中调用下载 win.webContents.downloadURL(url) 监听下载事件 //监听下载动作 win.webContents.session.on('will-do ...

  2. 生成条形码二维码DataMatrix条码.EAN码.39码.交叉25码.UPC码.128码.93码.ISBN码.Codabar等

    1.引用Spire.Barcode 在Nuget包中安装Spire.Barcode 2.生成条形码 //创建 BarcodeSettings对象 BarcodeSettings settings = ...

  3. 【前端】‘opencollective-postinstall‘ 不是内部或外部命令,也不是可运行的程序

    问题 'opencollective-postinstall' 不是内部或外部命令,也不是可运行的程序 解决办法 npm install --save opencollective-postinsta ...

  4. AspNetCore全局异常处理

    在开发ASP.NET Core应用程序时,全局异常处理是一个重要的概念.它允许我们集中处理应用程序中未捕获的异常,确保应用程序的稳定性和用户体验. 1. 为什么需要全局异常处理 全局异常处理的目的是为 ...

  5. node-sass安装问题

    前情 最近在开发一个小程序项目,为了开发速度,部分页面使用原有H5,但原有H5需要对小程序做一定兼容适配,发现原有H5项目是个很古老项目. 坑位 在项目启动前,需要执行npm install安装项目依 ...

  6. RepoDB:一个介于Dapper、EFCore之间.Net的ORM库

    推荐一个介轻量ORM和全功能ORM的开源项目. 01 项目简介 RepoDB 提供了基本操作所需的方法,同时也提供了一些高级功能,如第二层缓存.跟踪.仓储.属性处理器和批量/大量操作.支持的数据库,包 ...

  7. 授权|取消授权MYSQL数据库用户权限

    授权 queryusr用户查询test数据库 grant select on test.* to queryusr@'%'; flush PRIVILEGES 收回queryusr用户查询test数据 ...

  8. 黑苹果(Hackintosh) - 安装1:用 VMware pro 16 安装 Big Sur 11.6

    1. 背景情况 1.1 想法 想要体验体验macOS系统,不想花钱买 Macbook,就想着 装一个黑苹果体验下. 1.2 本机基本情况 笔记本:zx6 cp5s1 CPU:i5 8400 主板:H3 ...

  9. Thrift中enum的一些探究

    http://anruence.com/2018/06/27/enum-thrift/ 问题 在用注解定义的Thrift enum 中,如果客户端端和服务端的enum定义不同,比如调换了enum中的枚 ...

  10. SSM或Spring Boor开发中@Repository和@Mapper的区别

    在做一个SpringBoot项目的时候在Dao层使用了@Repository注解然后报了这个错: Description: Field userService in com.example.demo. ...