【LG-P5072 [Ynoi2015]】盼君勿忘
做的第一道莫队题 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]】盼君勿忘相关推荐
- 洛谷P5072 [YNOI2015]盼君勿忘 莫队+unordered_set+毒瘤卡常
在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...
- P5072-[Ynoi2015]盼君勿忘【莫队,根号分治】
正题 题目链接:https://www.luogu.com.cn/problem/P5072 题目大意 nnn个数,mmm个询问(l,r,p)(l,r,p)(l,r,p)表示询问[l,r][l,r][ ...
- 转行程序员日记---2020-09-18【,勿忘国耻】【回忆青春】
周五美好的日子,最近不加班了,国庆前的福利吧都期待着放假. 九一八,勿忘国耻,强我中华. 防控警报原谅我没听到,只有五环以外才有.不过我记得这个日子. 回忆篇: 看见原来高中班主任发的说说,感觉到我的 ...
- 你会copying了吗?(Effective C++ 12 复制对象时勿忘其每一个成分)
12. 复制对象时勿忘其每一个成分 为derived class写copying函数时,必须很小心地复制其base class成分.那些成分往往是private,故无法直接访问它们,应该让derive ...
- 2018——颓废的一年,勿忘初心。
你只管努力, --剩下的交给时光. 颓废.放纵.崩塌的一年. 创业失败颓废了整整2年时间,重新开始,万事艰难,看别人赚大钱,自己只能一步一个脚印.回到原点,勿忘初心. 尤记两年之初还在zhihu指点江 ...
- 观《南京!南京!》 勿忘国耻 缅怀同胞
勿忘国耻 缅怀同胞
- 勿忘初心,保持饥渴的心态
大牛的成长故事 最近看了很多文章,其中有介绍大牛成长的文章,讲述了各自的成长故事.陈浩,一位40岁以上的骨灰级程序员,非常热爱技术.他最初从一家银行的业务员跳槽出来,到北京找工作四处碰壁,最后进了一家 ...
- 你现在是怎样的心情呢? 勿忘初心
你现在是怎样的心情呢? 勿忘初心 一.最近发生的事儿 近期细佬(叔父)生了一场大病,急需用钱治疗,在资金极度匮乏的情况下,求助了xx大病筹款,我也跟着转发了. 我想象中的场景是这样的,会有不少人伸手援 ...
- 勿忘初心,坚定前行!
要因为走得太远,而忘记了为什么出发. 虽然知道重修这是一个既定的结局,在它来临的时候却也有些措手不及.站在105这个关口,我仅有的几种选择已经初现端倪,彷徨有之,困顿有之,思虑的问题也越来越多. PH ...
- 人生之路 — 勿忘初心
忘了初心 最近情绪特别烦躁,一方面来自各方面的工作学习压力太大,另一方面是尝试了很多新鲜的事物,却得到了来自各方面的打击.可以说是陷入了人生的一个小低谷.笔者对低谷的定义,当你满腔热血的 ...
最新文章
- PL/SQL无法登录
- jupyter notebook修改默认工作目录
- SAP MM MRP运行后触发的PR单据里没有Assign采购组织?
- chrome取消安全模式
- jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查
- dbunit java_Java – 让DbUnit使用Hibernate事务
- java jar包图片_jar包的图片不显示 求解
- [转载]js复制内容加版权声明代码
- 设计和实时视图不一样_三室两厅家装设计,如何打造出不一样的感觉?
- access 如何使用dolby_用Access开发《生产管理系统》
- Typedef的一些用法总结
- 网站内容批量抓取和《著作权法》
- CodeForces - 589A
- struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别添加错误信息
- mp4视频怎么转换成华为P10手机适配的分辨率
- 本博客基于Handsome主题的一些小修改教程
- 小学课外拓展计算机活动计划,小学科学课外活动计划及总结
- MySQL auto_increment介绍及自增键断层的原因分析
- 数据库删改都不会,还能被录用:女程序员要求这么宽松?
- PMP考试六大管理学定律