区间无修改莫队学习笔记(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 ...
随机推荐
- MySQL 8 InnoDB Table 和 Page 压缩
压缩用一点CPU换取磁盘IO.内存空间.磁盘空间. 在有Secondary Indexes 的表中,使用压缩更加明显,相关索引数据也会压缩. InnoDB 表压缩 对表压缩只需要在Create Tab ...
- 数据库自学笔记(2)--- HAVING和WHERE, ANY 和 ALL,IN和EXIST。
1.HAVING和WHERE: WHERE 和 HAVING 的作用对象不一样.WHERE作用于基本表或视图,挑出满足条件的元组.HAVING作用于组(group),一般配合GROUP BY 使用. ...
- python中class的定义及使用
#类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法. #对象:它是类的实例化. #方法:类中定义的函数. #类(Class) 由3个部分构成: ...
- .net core 3.0一个记录request和respose的中间件
参考资料 https://www.cnblogs.com/wybin6412/p/10944077.html RequestResponseLog.cs using System; using Sys ...
- 二次剩余的判定及Cipolla算法
二次剩余 ppp是奇素数.所有的运算都是在群Zp∗Z_{p}^{*}Zp∗中的运算.方程x2=a≠0x^2=a \neq 0x2=a̸=0问是否有解,以及解是什么?若有解,aaa就是模ppp的二次 ...
- js中的节点遍历+类数组对象
firstChild 第一个子元素 lastChild 最后一个子元素 childNodes[n] = childNodes.item(n) 第n+1个子元素 parentNode ...
- MySQL基础入门使用和命令的使用
数据库了解 概念 数据库就是一种特殊的文件,其中存储着需要的数据 一个数据库可以有多张表 MySQL是一种关系型数据库 具有关联性数据的就是关系型数据库 MySQL是一种软件可以用来创建mysql数据 ...
- Linux配置安装
1. 安装jdk 1.1 卸载:使用java version查看虚拟机是否有jdk环境,存在先卸载: 1. 首先我的系统是CenOS7,安装完成后,先打开终端,切换到管理员账号,命令如 ...
- 安卓自定义View实例-----跟随手指移动的鸟
今天学习了一些安卓开发中的自定义布局,编写了简单一个实例,“跟随手指移动的鸟”,需要两张图片,背景图片和鸟的图片,鸟的图片可以在屏幕中跟随手指的移动而移动. 1.将两张图片导入到mipmap中: 2. ...
- 【笔记】机器学习 - 李宏毅 - 9 - Keras Demo
3.1 configuration 3.2 寻找最优网络参数 代码示例: # 1.Step 1 model = Sequential() model.add(Dense(input_dim=28*28 ...