最裸的莫队:https://www.luogu.org/problemnew/show/P1494

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e4+;
struct query{int l,r,id;ll a,b;}q[N];
int n,m,block,c[N],pos[N];
ll s[N],ans;
bool cmp(query a,query b){return pos[a.l]<pos[b.l]||pos[a.l]==pos[b.l]&&a.r<b.r;}
bool cmd(query a,query b){return a.id<b.id;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
void update(int p,int add)
{
ans-=s[c[p]]*s[c[p]];
s[c[p]]+=add;
ans+=s[c[p]]*s[c[p]];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
for(int i=;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
block=floor(sqrt(n)+0.01);
for(int i=;i<=n;i++)pos[i]=(i-)/block+;
sort(q+,q+m+,cmp);
for(int i=,l=,r=;i<=m;i++)
{
while(r<q[i].r)update(++r,);
while(r>q[i].r)update(r--,-);
while(l<q[i].l)update(l++,-);
while(l>q[i].l)update(--l,);
if(q[i].l==q[i].r){q[i].a=;q[i].b=;continue;}
q[i].a=ans-(r-l+);
q[i].b=(ll)(r-l+)*(r-l);
ll t=gcd(q[i].a,q[i].b);
q[i].a/=t;q[i].b/=t;
}
sort(q+,q+m+,cmd);
for(int i=;i<=m;i++)printf("%lld/%lld\n",q[i].a,q[i].b);
}

树上莫队:https://www.luogu.org/problemnew/show/P4074

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e5+;
struct modify{int x,y,z;}p[N];
struct query{int l,r,k,lca,id;}q[N];
struct edge{int v,nxt;}e[N*];
int n,m,Q,block,cnt,mdf,qry,hd[N],v[N],w[N],fa[N][],deep[N],sum[N],pos[N],st[N],ed[N],col[N],dfx[N],lst[N];
ll ans[N],ret;
bool vis[N];
bool cmp(query x,query y)
{
if(pos[x.l]!=pos[y.l])return pos[x.l]<pos[y.l];
if(pos[x.r]!=pos[y.r])return pos[x.r]<pos[y.r];
return x.k<y.k;
}
void add(int x,int y){e[++cnt]=(edge){y,hd[x]};hd[x]=cnt;}
void dfs(int u)
{
st[u]=++cnt;dfx[cnt]=u;
for(int i=hd[u];i;i=e[i].nxt)
if(e[i].v!=fa[u][])
fa[e[i].v][]=u,deep[e[i].v]=deep[u]+,dfs(e[i].v);
ed[u]=++cnt;dfx[cnt]=u;
}
int lca(int x,int y)
{
if(deep[x]<deep[y])swap(x,y);
int t=deep[x]-deep[y];
for(int i=;(<<i)<=t;i++)if(t&(<<i))x=fa[x][i];
if(x==y)return x;
for(int i=;i>=;i--)
if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
return fa[x][];
}
void update(int x)
{
vis[x]^=;
if(vis[x])sum[col[x]]++,ret+=1ll*v[col[x]]*w[sum[col[x]]];
else ret-=1ll*v[col[x]]*w[sum[col[x]]],sum[col[x]]--;
}
void change(int x,int y)
{
if(vis[x])update(x),col[x]=y,update(x);
else col[x]=y;
return;
}
int main()
{
scanf("%d%d%d",&n,&m,&Q);
block=pow(n,2.0/)*0.52;
for(int i=;i<=m;i++)scanf("%d",&v[i]);
for(int i=;i<=n;i++)scanf("%d",&w[i]);
for(int i=,x,y;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x);
for(int i=;i<=n;i++)scanf("%d",&col[i]),lst[i]=col[i];
cnt=;dfs();
for(int j=;(<<j)<=n;j++)
for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];
for(int i=;i<=*n;i++)pos[i]=i/block+;
for(int i=,op,x,y;i<=Q;i++)
{
scanf("%d%d%d",&op,&x,&y);
if(!op)p[++mdf]=(modify){x,lst[x],y},lst[x]=y;
else{
if(st[x]>st[y])swap(x,y);
int Fa=lca(x,y);
if(x==Fa)q[++qry]=(query){st[x],st[y],mdf,,qry};
else q[++qry]=(query){ed[x],st[y],mdf,Fa,qry};
}
}
sort(q+,q+qry+,cmp);
for(int i=,l=,r=,k=;i<=qry;i++)
{
while(k<q[i].k)k++,change(p[k].x,p[k].z);
while(k>q[i].k)change(p[k].x,p[k].y),k--;
while(l>q[i].l)update(dfx[--l]);
while(l<q[i].l)update(dfx[l++]);
while(r<q[i].r)update(dfx[++r]);
while(r>q[i].r)update(dfx[r--]);
if(q[i].lca)update(q[i].lca);
ans[q[i].id]=ret;
if(q[i].lca)update(q[i].lca);
}
for(int i=;i<=qry;i++)printf("%lld\n",ans[i]);
}

带修莫队:https://www.lydsy.com/JudgeOnline/problem.php?id=2120

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+;
int n,m,cntq,cntc,block,a[N],pos[N],t[N],ret,ans[N],l,r,tim,cnt[N*];
struct query{
int l,r,tm,id;
bool operator<(const query&b)const
{
if(pos[l]!=pos[b.l])return pos[l]<pos[b.l];
if(pos[r]!=pos[b.r])return pos[r]<pos[b.r];
return tm<b.tm;
}
}q[N];
struct change{int x,ya,yb;}c[N];
void add(int p){if(!cnt[p])ret++;cnt[p]++;}
void del(int p){cnt[p]--;if(!cnt[p])ret--;}
void update1(change c)
{if(l<=c.x&&c.x<=r)del(c.yb),add(c.ya);a[c.x]=c.ya;}
void update2(change c)
{if(l<=c.x&&c.x<=r)del(c.ya),add(c.yb);a[c.x]=c.yb;}
int main()
{
scanf("%d%d",&n,&m);
block=floor(sqrt(n)+0.01);
for(int i=;i<=n;i++)scanf("%d",&a[i]),t[i]=a[i],pos[i]=(i-)/block+;
int x,y;char ch;
for(int i=;i<m;i++)
{
scanf(" %c%d%d",&ch,&x,&y);
if(ch=='R')c[++cntc]={x,y,t[x]},t[x]=y;
else q[++cntq]={x,y,cntc,cntq};
}
sort(q+,q+cntq+);
l=,r=,tim=;
for(int i=;i<=cntq;i++)
{
while(tim<q[i].tm)update1(c[++tim]);
while(tim>q[i].tm)update2(c[tim--]);
while(r<q[i].r)add(a[++r]);
while(r>q[i].r)del(a[r--]);
while(l<q[i].l)del(a[l++]);
while(l>q[i].l)add(a[--l]);
ans[q[i].id]=ret;
}
for(int i=;i<=cntq;i++)printf("%d\n",ans[i]);
}

回滚莫队:https://www.lydsy.com/JudgeOnline/problem.php?id=4241

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+;
struct query{int l,r,id;}q[N];
int n,m,len,block,pos[N],a[N],v[N],num[N],num1[N];
ll ret,ans[N];
bool cmp(query x,query y){return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];}
void add(int p){ret=max(ret,1ll*(++num[p])*v[p]);}
void del(int p){--num[p];}
ll query(int l,int r)
{
ll mx=;
for(int i=l;i<=r;i++)mx=max(mx,1ll*(++num1[a[i]])*v[a[i]]);
for(int i=l;i<=r;i++)--num1[a[i]];
return mx;
}
int update(int i,int blo)
{
int r=min(blo*block,n),l=r+,L=l;
memset(num,,sizeof num);
ret=;
for(;pos[q[i].l]==blo;i++)
{
if(pos[q[i].l]==pos[q[i].r])ans[q[i].id]=query(q[i].l,q[i].r);
else{
while(r<q[i].r)add(a[++r]);
ll tmp=ret;
while(l>q[i].l)add(a[--l]);
ans[q[i].id]=ret;
while(l<L)del(a[l++]);
ret=tmp;
}
}
return i;
}
int main()
{
scanf("%d%d",&n,&m);
block=sqrt(n+);
for(int i=;i<=n;i++)scanf("%d",&a[i]),v[i]=a[i],pos[i]=(i-)/block+;
sort(v+,v+n+);
len=unique(v+,v+n+)-v-;
for(int i=;i<=n;i++)a[i]=lower_bound(v+,v+len+,a[i])-v;
for(int i=;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
sort(q+,q+m+,cmp);
for(int now=,i=;i<=pos[n];i++)now=update(now,i);
for(int i=;i<=m;i++)printf("%lld\n",ans[i]);
}

二维莫队:https://www.lydsy.com/JudgeOnline/problem.php?id=2639

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define y1 orz
using namespace std;
const int N=,M=1e5;
int n,m,Q,tot,sum,x1,y1,x2,y2,a[N][N],b[N*N],bel[N],cnt[N*N],ans[M];
struct query{
int x1,y1,x2,y2,id;
bool operator<(const query&a)const{
if(bel[x1]!=bel[a.x1])return x1<a.x1;
if(bel[y1]!=bel[a.y1])return y1<a.y1;
if(bel[x2]!=bel[a.x2])return x2<a.x2;
return y2<a.y2;
}
}q[M];
int sqr(int x){return x*x;}
inline void modify_x(int x,int v)
{rep(i,y1,y2)sum-=sqr(cnt[a[x][i]]),cnt[a[x][i]]+=v,sum+=sqr(cnt[a[x][i]]);}
inline void modify_y(int y,int v)
{rep(i,x1,x2)sum-=sqr(cnt[a[i][y]]),cnt[a[i][y]]+=v,sum+=sqr(cnt[a[i][y]]);}
int main()
{
scanf("%d%d",&n,&m);
rep(i,,max(n,m))bel[i]=i/;
rep(i,,n)rep(j,,m)scanf("%d",&a[i][j]),b[++tot]=a[i][j];
sort(b+,b+tot+);
tot=unique(b+,b+tot+)-b-;
rep(i,,n)rep(j,,m)a[i][j]=lower_bound(b+,b+tot+,a[i][j])-b;
scanf("%d",&Q);
rep(i,,Q)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1>x2)swap(x1,x2);if(y1>y2)swap(y1,y2);
q[i]=(query){x1,y1,x2,y2,i};
}
sort(q+,q+Q+);
x1=,y1=,x2=,y2=;
rep(i,,Q)
{
while(x1>q[i].x1)modify_x(--x1,);
while(x2<q[i].x2)modify_x(++x2,);
while(x1<q[i].x1)modify_x(x1++,-);
while(x2>q[i].x2)modify_x(x2--,-);
while(y1>q[i].y1)modify_y(--y1,);
while(y2<q[i].y2)modify_y(++y2,);
while(y1<q[i].y1)modify_y(y1++,-);
while(y2>q[i].y2)modify_y(y2--,-);
ans[q[i].id]=sum;
}
rep(i,,Q)printf("%d\n",ans[i]);
}

按位分块:https://www.luogu.org/problemnew/show/CF472G

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int n1,n2,m,sz[];
unsigned a[][N],b[][N];
char s[N];
int count(unsigned x){return sz[x>>]+sz[x&];}
int main()
{
scanf("%s",s),n1=strlen(s);
for(int j=;j<;j++)for(int i=;i+j<n1;i++)a[j][i>>]|=s[i+j]==''?<<(i&):;
scanf("%s",s),n2=strlen(s);
for(int j=;j<;j++)for(int i=;i+j<n2;i++)b[j][i>>]|=s[i+j]==''?<<(i&):;
for(int i=;i<;i++)sz[i]=sz[i>>]+(i&);
scanf("%d",&m);
while(m--)
{
int x,y,len,ans=,i,j;
scanf("%d%d%d",&x,&y,&len);
for(i=x>>,j=y>>;len>=;i++,j++,len-=)ans+=count(a[x&][i]^b[y&][j]);
ans+=count((a[x&][i]^b[y&][j])&((<<len)-));
printf("%d\n",ans);
}
}

块状链表:咕

分块&莫队模板的更多相关文章

  1. P2709 小B的询问——普通莫队&&模板

    普通莫队概念 莫队:莫涛队长发明的算法,尊称莫队.其实就是优化的暴力. 普通莫队只兹磁询问不支持修改,是离线的. 莫队的基本思想:就是假定我得到了一个询问区间[l,r]的答案,那么我可以在极短(通常是 ...

  2. 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1072  Solved: 292[Submit][Status][Di ...

  3. 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)

    传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码

  4. HDU 5145 分块 莫队

    给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...

  5. bzoj 3585 mex - 线段树 - 分块 - 莫队算法

    Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...

  6. CODEFORCES 340 XOR and Favorite Number 莫队模板题

    原来我直接学的是假的莫队 原题: Bob has a favorite number k and ai of length n. Now he asks you to answer m queries ...

  7. 【洛谷2709】小B的询问(莫队模板题)

    点此看题面 大致题意: 有一个长度为\(N\)的序列,每个数字在\(1\sim K\)之间,有\(M\)个询问,每个询问给你一个区间,让你求出\(\sum_{i=1}^K c(i)^2\),其中\(c ...

  8. 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...

  9. BZOJ.3809.Gty的二逼妹子序列(分块 莫队)

    题目链接 /* 25832 kb 26964 ms 莫队+树状数组:增加/删除/查询 都是O(logn)的,总时间复杂度O(m*sqrt(n)*logn),卡不过 莫队+分块:这样查询虽然变成了sqr ...

随机推荐

  1. C# 关于AD域的操作 (首博)

    前段时间(因为懒得找具体的时间了)公司说让系统可以进行对AD域的操作,包括创建用户.于是上网查资料,了解何为AD域.还不知道的这边请https://www.cnblogs.com/cnjavahome ...

  2. OI生涯回顾

    OI回忆录只是一个预告,估计等2020高考结束才放出来吧. 先写一下自己简单的OI历程吧: 小升初刚起步 初一 第一次比赛,NOIP PJ组215分,踩线1=,全省rk86,全国rk677(毕竟AH ...

  3. cf 763A. Timofey and a tree

    呵呵呵,直接判断是不是一个点连起来所有的特殊边(连接2不同颜色的点的边) (一开始还想各种各样奇怪的dfs...垃圾) #include<bits/stdc++.h> #define LL ...

  4. 云时代架构阅读笔记五——Java内存模型详解(一)

    什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...

  5. 联系我们地图坐标展示js

    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=6d88 ...

  6. 干货分享|Critique Essay写作解析

    Critique essay要求学生对另一篇文章进行批判性分析,通常是一本书.期刊文章或论文.不管你的专业是什么,你可能会被要求在某个时候写一篇Critique essay.拿心理学专业举例,评论一篇 ...

  7. python中的__code__

    简单总结几个常用的__code__的用法: (1)func.__code__.co_argcount:返回函数的参数个数,这里的参数个数不包含*args与**kwargs,具体来讲就是*args前的参 ...

  8. 浅谈Python之sys.argv

    (1)sys.argv是什么 sys模块为进入解释器维护或使用的变量,以及与解释器相关的函数提供了途径.sys.argv在脚本程序中扮演了这样一个角色:将命令行输入的参数作为一个list传入脚本程序, ...

  9. 【LGR-(-8)】洛谷入门赛 #5 题解

    比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...

  10. oracle11g数据库的安装

     先在 Oracle官网上下载11g  oracle Database 11g 第 2 版 (11.2.0.1.0) 标准版.标准版 1 以及企业版,适用于 Microsoft Windows (x6 ...