最裸的莫队: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. CAN分帧接收实现

    该版本程序实现了上电后先发送MACID检测功能,如果网络上有应答.则一直进行死循环,直到用户更改了本机的ID地址 才可以跳出循环体. 本单片机设置为双滤波 ,使目标地址为0X1F 实现了建立连接命令 ...

  2. USB2.0主机控制器 UPD720114 简单详解

    UPD720114 是符合 USB 2.0规格的集线器控制器,适用于“符合生态原则的解决方案”.这种小型封装的控制器集成了核心逻辑电路的2.5 V 内部电压调整器.终端电阻器,减少了所需要的外部组件的 ...

  3. JSP编码规范

    JSP包含文件 <%@ include file=”relativeURI”%> //在翻译阶段执行加载,比如:校验是否登录通过 jsp的include指令元素读入指定页面的内容.并把这些 ...

  4. 2.13 ViewModel 使数据即使在后台被杀死数据也能存活

    操作程序如下: 主要是创建一个 SavedStateHandle 来缓存上一次的数据,并通过重新读取上一次存储的数据来实现数据的存活 MyVIewModel: package com.example. ...

  5. RDD转为Dataset如何指定schema?

    与RDD进行互操作 Spark SQL支持两种不同方法将现有RDD转换为Datasets.第一种方法使用反射来推断包含特定类型对象的RDD的schema.这种基于反射的方法会导致更简洁的代码,并且在编 ...

  6. 如何创建NPM包并上传

    1 在NPM网站上注册,并验证(verify)自己的邮箱 https://www.npmjs.com 2 用命令行定位到你的库文件夹 3 在命令行里登录npm, 按提示依次输入用户名 密码 注册邮箱 ...

  7. 【pwnable.kr】coin1

    pwnable从入门到放弃又一发 说是一道pwnable,其实是一道coding... nc pwnable.kr 9007 连接上看看,玩硬币? 老子是来拿flag的,谁来哄孩子来了!!! 算了,f ...

  8. jquery 获取同级元素

    $(".userinfo-three:eq(0)").css({                 "width": winWidth * 300 / 1080, ...

  9. PHP日期函数

    在正式学习日期函数前大家得了解几个概念: 1.时区 2.世界时 3.unix时间戳 时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的.1884年 ...

  10. hdu3359 Kind of a Blur

    因为变化出来的是平均数,那么就可以对每一个变化出来的列方程,直接高斯消元就行了. #include<bits/stdc++.h> #define N 100005 #define LL l ...