区间无修改莫队学习笔记(lg1494小z的袜子)
这几天感觉要学的要做的有点多,就偷了个懒没写笔记,赶紧补一下
莫队嘛,一个离线处理各种区间(或树上)询问的神奇算法
简单而言,按左端点排个序然后指针l,r递推就好了
复杂度证明貌似是不待修改的n^1.5,带修改的n^5/3(证明又与我何干呢)
这东西我只学了一天左右,感觉常规题没什么亮点,毒瘤起来就不知道了
然后我分享一下无修莫队和带修莫队的两道例题做法,回滚的话后面补吧
小z的袜子https://www.luogu.org/problemnew/show/P1494
抽到一样袜子的情况总和为 cnt[i]∗(cnt[i]−1)(cnt[i]>=2)(1<=i<=n)
那么请手推当cnt[i]+1或cnt[i]-1时的情况
#include<bits/stdc++.h>
#define int long long//这题貌似会爆int
using namespace std;
inline int read(){
int w=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
w=(w<<)+(w<<)+ch-;
ch=getchar();
}
return w*f;
}
int n,m,block,ans,pos[],col[],cnt[];
struct Query{
int l,r,ans1,ans2,id;//l,r表示当前询问区间,ans1,ans2表示答案的分子分母,id就是这个问题的序号
}q[];
inline int comp1(Query a,Query b){
if(pos[a.l]==pos[b.l]) return a.r<b.r;
else return a.l>b.l;//如果左端点所在块一样,按右端点排序,否则按左端点排序
}//这个貌似有很多种写法,面向数据编程吧(逃
inline int comp2(Query a,Query b){
return a.id<b.id;//回到最初的顺序
}
inline void add(int x){
ans+=cnt[col[x]]*,cnt[col[x]]++;return;//当你加为一个颜色加一的时候答案的变化
}
inline void del(int x){
if(cnt[col[x]]>=)ans-=(cnt[col[x]]-)*,cnt[col[x]]--;return;//当你删一个颜色的时候答案的变化
}
inline void work(){
int i,j,k;int l=,r=;//这个地方我建议写l=1,r=0,这表示一个空区间,如果写l=0,r=0会发生一些奇怪边界问题
for(i=;i<=m;i++){
if(q[i].l==q[i].r){
q[i].ans1=;q[i].ans2=;continue;//题目要求特判的情况
}
else{
/*
四种情况,分别讨论,然而在add的时候应该先移动指针再修改,del的话先修改再移动指针
*/
while(l>q[i].l) add(--l);
while(r<q[i].r) add(++r);
while(l<q[i].l) del(l++);
while(r>q[i].r) del(r--);
q[i].ans1=ans;q[i].ans2=(r-l+)*(r-l);
}
}
}
inline int GCD(int x,int y){//题目要求的
if(!y) return x;
else return GCD(y,x%y);
}
signed main(){//按题目要求走就好了
n=read();m=read();int i,j,k;int block=sqrt(n);
for(i=;i<=n;i++){
col[i]=read();pos[i]=(i-)/block+;
}
for(i=;i<=m;i++){
q[i].id=i;q[i].l=read();q[i].r=read();
}
sort(q+,q+m+,comp1);
work();
sort(q+,q+m+,comp2);
for(i=;i<=m;i++){
if(q[i].ans1==&&q[i].ans2==){
}
else{
int x=GCD(q[i].ans1,q[i].ans2);
q[i].ans1/=x;q[i].ans2/=x;
}
printf("%lld/%lld\n",q[i].ans1,q[i].ans2);
}
return ;
}
区间无修改莫队学习笔记(lg1494小z的袜子)的更多相关文章
- 莫队算法 [国家集训队]小Z的袜子
题目链接 洛古 https://www.luogu.org/problemnew/show/P1494 大概说下自己的理解 先来概率的计算公式 ∑C(2,f(i)) / C(2,r−l ...
- 莫队学习笔记(未完成QAQ
似乎之前讲评vjudge上的这题的时候提到过?但是并没有落实(...我发现我还有好多好多没落实?vjudge上的题目还没搞,然后之前考试的题目也都还没总结?天哪我哭了QAQ 然后这三道题我都是通过一道 ...
- P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...
- AT1219 歴史の研究[回滚莫队学习笔记]
回滚莫队例题. 这题的意思大概是 设 \(cnt_i\) 为 l ~ r 这个区间 \(i\) 出现的次数 求\(m\) 次询问 求 l~r 的 max {\(a_i\) * \(cnt_i\)} \ ...
- SP10707 COT2 - Count on a tree II [树上莫队学习笔记]
树上莫队就是把莫队搬到树上-利用欧拉序乱搞.. 子树自然是普通莫队轻松解决了 链上的话 只能用树上莫队了吧.. 考虑多种情况 [X=LCA(X,Y)] [Y=LCA(X,Y)] else void d ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)
莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...
- BZOJ2120&2453数颜色——线段树套平衡树(treap)+set/带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
随机推荐
- SAP 事务代码 ME31K 报错 - 不含来自带工厂分配的供应商的物料的采购没有被定义 -
SAP 事务代码 ME31K 报错 - 不含来自带工厂分配的供应商的物料的采购没有被定义 - 近日收到业务团队的报错说,试图创建合同,报错如下: 不含来自带工厂分配的供应商的物料的采购没有被定义 这个 ...
- 微信小程序入门笔记-账号注册(1)
小程序注册 微信小程序开发之前,必须先有小程序账号,下面是注册步骤: 1.打开网页 微信公众平台https://mp.weixin.qq.com/,点击立即注册按钮 2.注册类型 选择小程序开发 3. ...
- redis中key键操作
keys */查看所有的key remoteSelf:1>select 0 "OK" remoteSelf:0>keys * 1) "SUBCRIBEMAP& ...
- MySQL服务器的运维与优化
MySQL运维 安装数据库 配置本地yum源,将gpmall-repo文件上传至/opt目录 创建yum.repo文件 安装mariadb服务 # yum install -y mariadb mar ...
- linux cpp (接口与实现的分离)
以下是 .h 文件,是接口. 以下是函数的实现 以下是主函数 首先是以上两个文件编译,不用编译头文件 g++ -c gradeBook.cpp g++ -c gradeBook.main.cpp 之后 ...
- LeetCode 面试题 02.07. 链表相交
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/ 给定两个(单向)链表,判定它们是否相交并返回交 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hdfs分布式文件系统安装
实验目的 复习安装jdk 学习免密码登录 掌握安装配置hdfs集群的方法 掌握hdfs集群的简单使用和检查其工作状态 实验原理 1.hdfs是什么 hadoop安装的第一部分是安装hdfs,hdfs是 ...
- BSP与HAL关系(转)
板级支持包(BSP)(Board Support Package)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件 ...
- ACM常用STL容器
// STL(标准模板库),由三大部分组成:容器,算法,迭代器 // STL六大组件:container(容器),algorthm(算法),iterator(迭代器) // function obje ...
- Linux 进程调度笔记(一)
主要讨论的是单核 CPU 的情况下,进行调度的一些算法和思路.讨论都是基于单核 CPU 的条件下进行. 在内存中,无论对于用户而言有多少个进程,但在 CPU 运行的时候,总是只有只执行一个进程.进程调 ...