做的第一道莫队题 QwQ。

P5072 [Ynoi2015] 盼君勿忘

给定一个序列,每次查询一个区间 [l,r][l,r][l,r] 中所有子序列分别去重后的和 modp\bmod\ pmod p。

思路

莫队 + 手写双向链表

1

题意有点绕,但注意是“分别去重”。

那么假设一个数 xxx,它在长为 nnn 的序列中出现了 mmm 次,即一共有 2n2^n2n 个子序列,不含 xxx 的子序列有 2n−m2^{n-m}2n−m 个。

则 xxx 在所有去重后的子序列中出现了 (2n−2n−m)(2^n-2^{n-m})(2n−2n−m) 次,那么 xxx 对答案的贡献为 x∗(2n−2n−m)x * (2^n-2^{n-m})x∗(2n−2n−m)。

2

所以问题转化为记录在区间 [l,r][l,r][l,r] 中 xxx 一共出现了几次。

莫队。

同时,因为要维护出现次数为 mmm 的数,所以还要手写一个双向链表(不手写会 TLE)。然后就是莫队板子了。

3

如果用快速幂去计算 2 的若干次方的话,由于 nnn 和 mmm 很大,就容易超时。

所以要使用光速幂。光速幂在计算固定底数、指数很大的幂时有很高的效率。

预处理 O(n)\text{O(n)}O(n),计算该底数的 1,2,3,⋯,n1,2,3,\cdots ,\sqrt{n}1,2,3,⋯,n​ 次幂和 2n,3,n,⋯,nn2\sqrt{n},\ 3,\sqrt{n},\ \cdots ,n\sqrt{n}2n​, 3,n​, ⋯,nn​ 次幂。

查询 O(1)\text{O(1)}O(1),2x2^x2x 即为 pow1(x%len)∗pow2(⌊xlen⌋)(len=(n))pow1(x \% len) * pow2(\left\lfloor\frac{x}{len}\right\rfloor)\ (len=\sqrt(n))pow1(x%len)∗pow2(⌊lenx​⌋) (len=(​n))。

代码

#include<bits/stdc++.h>
using namespace std;#define int long long
#define maxn 100005
int n, m, len, tot;
int a[maxn], cnt[maxn], sum[maxn], ans[maxn];
int pw1[maxn], pw2[maxn];inline int get(int x)
{return (x - 1) / len + 1;
}struct relist{struct node2{int pre, nxt;}d[maxn];int tot;
}lst;
struct node{int l, r, p, id;friend bool operator < (const node &a, const node &b){return get(a.l) == get(b.l) ? a.r < b.r : get(a.l) < get(b.l);}
}q[maxn];inline void power_pre(int mod)
{pw1[0] = pw2[0] = 1;for(int i = 1; i <= len + 3; ++i) pw1[i] = pw1[i - 1] * 2 % mod;for(int i = 1; i <= len + 3; ++i) pw2[i] = pw2[i - 1] * pw1[len] % mod;
}inline int qry(int k, int mod)
{return pw1[k % len] % mod * pw2[k / len] % mod;
}inline void era(int x)
{if(x != tot){lst.d[lst.d[x].nxt].pre = lst.d[x].pre;lst.d[lst.d[x].pre].nxt = lst.d[x].nxt; }else{lst.d[lst.d[x].pre].nxt = 0;tot = lst.d[x].pre;}lst.d[x].pre = lst.d[x].nxt = 0;
}inline void add_back(int x)
{lst.d[tot].nxt = x, lst.d[x].pre = tot;tot = x;
}inline void updt(int x, int tim)
{if(!(sum[cnt[a[x]]] -= a[x]))era(cnt[a[x]]);if(!sum[cnt[a[x]] += tim])add_back(cnt[a[x]]);sum[cnt[a[x]]] += a[x];
}signed main()
{scanf("%lld %lld", &n, &m);for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]);len = ceil(sqrt(n));for(int i = 1; i <= m; ++i){scanf("%lld %lld %lld", &q[i].l, &q[i].r, &q[i].p);q[i].id = i;  }   sort(q + 1, q + m + 1);for(int i = 1, l = 1, r = 0; i <= m; ++i){power_pre(q[i].p);while(l > q[i].l) l -= 1, updt(l, 1);while(r < q[i].r) r += 1, updt(r, 1);while(l < q[i].l) updt(l, -1), l += 1;while(r > q[i].r) updt(r, -1), r -= 1;//注意这四个的顺序不能改变 for(int j = lst.d[0].nxt; j; j = lst.d[j].nxt){int totl = qry(r - l + 1, q[i].p);int disc = qry(r - l + 1 - j, q[i].p);int res = ((totl - disc) * sum[j] + q[i].p) % q[i].p;ans[q[i].id] = (ans[q[i].id] + res + q[i].p) % q[i].p;}}for(int i = 1; i <= m; ++i) printf("%lld\n", ans[i]);return 0;
}

——EndEndEnd——

【LG-P5072 [Ynoi2015]】盼君勿忘相关推荐

  1. 洛谷P5072 [YNOI2015]盼君勿忘 莫队+unordered_set+毒瘤卡常

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

  2. P5072-[Ynoi2015]盼君勿忘【莫队,根号分治】

    正题 题目链接:https://www.luogu.com.cn/problem/P5072 题目大意 nnn个数,mmm个询问(l,r,p)(l,r,p)(l,r,p)表示询问[l,r][l,r][ ...

  3. 转行程序员日记---2020-09-18【,勿忘国耻】【回忆青春】

    周五美好的日子,最近不加班了,国庆前的福利吧都期待着放假. 九一八,勿忘国耻,强我中华. 防控警报原谅我没听到,只有五环以外才有.不过我记得这个日子. 回忆篇: 看见原来高中班主任发的说说,感觉到我的 ...

  4. 你会copying了吗?(Effective C++ 12 复制对象时勿忘其每一个成分)

    12. 复制对象时勿忘其每一个成分 为derived class写copying函数时,必须很小心地复制其base class成分.那些成分往往是private,故无法直接访问它们,应该让derive ...

  5. 2018——颓废的一年,勿忘初心。

    你只管努力, --剩下的交给时光. 颓废.放纵.崩塌的一年. 创业失败颓废了整整2年时间,重新开始,万事艰难,看别人赚大钱,自己只能一步一个脚印.回到原点,勿忘初心. 尤记两年之初还在zhihu指点江 ...

  6. 观《南京!南京!》 勿忘国耻 缅怀同胞

    勿忘国耻 缅怀同胞

  7. 勿忘初心,保持饥渴的心态

    大牛的成长故事 最近看了很多文章,其中有介绍大牛成长的文章,讲述了各自的成长故事.陈浩,一位40岁以上的骨灰级程序员,非常热爱技术.他最初从一家银行的业务员跳槽出来,到北京找工作四处碰壁,最后进了一家 ...

  8. 你现在是怎样的心情呢? 勿忘初心

    你现在是怎样的心情呢? 勿忘初心 一.最近发生的事儿 近期细佬(叔父)生了一场大病,急需用钱治疗,在资金极度匮乏的情况下,求助了xx大病筹款,我也跟着转发了. 我想象中的场景是这样的,会有不少人伸手援 ...

  9. 勿忘初心,坚定前行!

    要因为走得太远,而忘记了为什么出发. 虽然知道重修这是一个既定的结局,在它来临的时候却也有些措手不及.站在105这个关口,我仅有的几种选择已经初现端倪,彷徨有之,困顿有之,思虑的问题也越来越多. PH ...

  10. 人生之路 — 勿忘初心

           忘了初心 最近情绪特别烦躁,一方面来自各方面的工作学习压力太大,另一方面是尝试了很多新鲜的事物,却得到了来自各方面的打击.可以说是陷入了人生的一个小低谷.笔者对低谷的定义,当你满腔热血的 ...

最新文章

  1. PL/SQL无法登录
  2. jupyter notebook修改默认工作目录
  3. SAP MM MRP运行后触发的PR单据里没有Assign采购组织?
  4. chrome取消安全模式
  5. jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查
  6. dbunit java_Java – 让DbUnit使用Hibernate事务
  7. java jar包图片_jar包的图片不显示 求解
  8. [转载]js复制内容加版权声明代码
  9. 设计和实时视图不一样_三室两厅家装设计,如何打造出不一样的感觉?
  10. access 如何使用dolby_用Access开发《生产管理系统》
  11. Typedef的一些用法总结
  12. 网站内容批量抓取和《著作权法》
  13. CodeForces - 589A
  14. struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别添加错误信息
  15. mp4视频怎么转换成华为P10手机适配的分辨率
  16. 本博客基于Handsome主题的一些小修改教程
  17. 小学课外拓展计算机活动计划,小学科学课外活动计划及总结
  18. MySQL auto_increment介绍及自增键断层的原因分析
  19. 数据库删改都不会,还能被录用:女程序员要求这么宽松?
  20. PMP考试六大管理学定律

热门文章

  1. Minimum supported Gradle version is 6.1.1. Current version is 5.6.4
  2. 传感器技术—新型光电传感器(学习笔记十 补充)
  3. 霍尔 磁电 光电式测数传感器的优缺点比较
  4. 怎么对电脑的DNS进行设置从而使网速更快
  5. 使用MapReduce实现k-means算法
  6. jpg转换成pdf转换器免费版
  7. 2022.5.2 HTML学习第二天
  8. 奥布莱恩杯尘埃落定 人工智能立功了!
  9. 如何避免淘宝拼多多比价订单?教你应对
  10. FPGA状态机跑飞 的解决办法