分块&莫队模板
最裸的莫队: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);
}
}
块状链表:咕
分块&莫队模板的更多相关文章
- P2709 小B的询问——普通莫队&&模板
普通莫队概念 莫队:莫涛队长发明的算法,尊称莫队.其实就是优化的暴力. 普通莫队只兹磁询问不支持修改,是离线的. 莫队的基本思想:就是假定我得到了一个询问区间[l,r]的答案,那么我可以在极短(通常是 ...
- 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法
3809: Gty的二逼妹子序列 Time Limit: 80 Sec Memory Limit: 28 MBSubmit: 1072 Solved: 292[Submit][Status][Di ...
- 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)
传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码
- HDU 5145 分块 莫队
给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...
- bzoj 3585 mex - 线段树 - 分块 - 莫队算法
Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...
- 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 ...
- 【洛谷2709】小B的询问(莫队模板题)
点此看题面 大致题意: 有一个长度为\(N\)的序列,每个数字在\(1\sim K\)之间,有\(M\)个询问,每个询问给你一个区间,让你求出\(\sum_{i=1}^K c(i)^2\),其中\(c ...
- 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ.3809.Gty的二逼妹子序列(分块 莫队)
题目链接 /* 25832 kb 26964 ms 莫队+树状数组:增加/删除/查询 都是O(logn)的,总时间复杂度O(m*sqrt(n)*logn),卡不过 莫队+分块:这样查询虽然变成了sqr ...
随机推荐
- P 1007 素数对猜想
转跳点:
- 图片字节流生成bmp文件
1 BITMAPFILEHEADER bfh;//文件头 2 bfh.bfType=0x4d42; bfh.bfOffBits=sizeof(bfh)+sizeof(BITMAPINFOHEADER) ...
- 小程序跳坑之JSON字符串转换JSON对象
常见的JSON字符串转换有很多,这里只讲我遇到过的小程序中用到的转换. 通常我们在小程序中用到的地方是,请求一个数据表或者请求一个接口,拿到了一堆数据,里面包含有各种字段数组,头像,图片,详情,地址, ...
- Local-Pref(本地优先属性)路由本地优先术
Local-Pref(本地优先属性)路由本地优先术: ①:抓取感兴趣流量——前缀与访问——prefix and access ②:创建路由地图——router-map ③:第一法则——permit 1 ...
- 《动手学深度学习》系列笔记—— 1.2 Softmax回归与分类模型
目录 softmax的基本概念 交叉熵损失函数 模型训练和预测 获取Fashion-MNIST训练集和读取数据 get dataset softmax从零开始的实现 获取训练集数据和测试集数据 模型参 ...
- tomcat和servlet容器的关系
- Meeloun教你如何正式切入Essay写作话题
很多同学在Essay写作过程中会发现:如果题目问到解决办法,写来写去,都是政府要颁布政策,人们要提高意识,感觉一点新意也没有.怎么样更好地切合不同的话题,想到最合适的解决办法呢?今天小编为你奉上更多处 ...
- junit基础学习之-引用spring容器的测试(7)
context 自动注入的文章链接:http://www.360doc.com/content/11/0815/09/2371584_140471325.shtml
- spring源码 AutowireCapableBeanFactory接口
对于想要拥有自动装配能力,并且想把这种能力暴露给外部引用的BeanFactory类需要实现此接口.正常情况下,不要使用此接口应该更倾向于使用BeanFactory或者ListableBeanFacto ...
- python--txt文件处理
1.打开文件的模式主要有,r.w.a.r+.w+.a+ file = open('test.txt',mode='w',encoding='utf-8') file.write('hello,worl ...