目录

1.区间加+单点查

每个块维护tag,散的暴力改。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=50010;
const int maxt=250;
int n,t,cnt;
int a[maxn],tag[maxt],L[maxt],R[maxt],pos[maxn];
inline void add(int ql,int qr,int k)
{
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)a[i]+=k;
return;
}
for(int i=ql;i<=R[pos[ql]];i++)a[i]+=k;
for(int i=L[pos[qr]];i<=qr;i++)a[i]+=k;
if(pos[ql]+1<=pos[qr]-1)for(int i=pos[ql]+1;i<=pos[qr]-1;i++)tag[i]+=k;
}
int main()
{
scanf("%d",&n);
t=sqrt(n);cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
int op,x,y,k;
scanf("%d%d%d%d",&op,&x,&y,&k);
if(!op)add(x,y,k);
else printf("%d\n",a[y]+tag[pos[y]]);
}
return 0;
}

2.区间加+查询区间小于某个数的数的个数

这题类似。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=50010;
const int maxt=250;
int n,t,cnt;
int a[maxn],b[maxn],L[maxt],R[maxt],pos[maxn],tag[maxt];
inline void add(int ql,int qr,int k)
{
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)a[i]+=k;
for(int i=L[pos[ql]];i<=R[pos[qr]];i++)b[i]=a[i];
sort(b+L[pos[ql]],b+R[pos[qr]]+1);
return;
}
for(int i=ql;i<=R[pos[ql]];i++)a[i]+=k;
for(int i=L[pos[ql]];i<=R[pos[ql]];i++)b[i]=a[i];
sort(b+L[pos[ql]],b+R[pos[ql]]+1);
for(int i=L[pos[qr]];i<=qr;i++)a[i]+=k;
for(int i=L[pos[qr]];i<=R[pos[qr]];i++)b[i]=a[i];
sort(b+L[pos[qr]],b+R[pos[qr]]+1);
if(pos[ql]+1<=pos[qr]-1)for(int i=pos[ql]+1;i<=pos[qr]-1;i++)tag[i]+=k;
}
inline int query(int ql,int qr,int k)
{
int res=0;
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)if(a[i]+tag[pos[ql]]<k)res++;
return res;
}
for(int i=ql;i<=R[pos[ql]];i++)if(a[i]+tag[pos[ql]]<k)res++;
for(int i=L[pos[qr]];i<=qr;i++)if(a[i]+tag[pos[qr]]<k)res++;
if(pos[ql]+1<=pos[qr]-1)
for(int i=pos[ql]+1;i<=pos[qr]-1;i++)
{
int l=L[i],r=R[i],ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(b[mid]+tag[i]<k)l=mid+1,ans=mid-L[i]+1;
else r=mid-1;
}
res+=ans;
}
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
t=sqrt(n);cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
for(int i=1;i<=cnt;i++)sort(b+L[i],b+R[i]+1);
for(int i=1;i<=n;i++)
{
int op,l,r,k;scanf("%d%d%d%d",&op,&l,&r,&k);
if(!op)add(l,r,k);
else printf("%d\n",query(l,r,k*k));
}
return 0;
}

3.区间加+区间查前驱

每个块内放个multiset,查询时lower_bound

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
const int maxt=350;
int n,t,cnt;
int a[maxn],L[maxt],R[maxt],pos[maxn],tag[maxt];
multiset<int>s[maxt];
inline void add(int ql,int qr,int k)
{
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)s[pos[ql]].erase(s[pos[ql]].find(a[i]));
for(int i=ql;i<=qr;i++)a[i]+=k;
for(int i=ql;i<=qr;i++)s[pos[ql]].insert(a[i]);
return;
}
for(int i=ql;i<=R[pos[ql]];i++)s[pos[ql]].erase(s[pos[ql]].find(a[i]));
for(int i=ql;i<=R[pos[ql]];i++)a[i]+=k;
for(int i=ql;i<=R[pos[ql]];i++)s[pos[ql]].insert(a[i]);
for(int i=L[pos[qr]];i<=qr;i++)s[pos[qr]].erase(s[pos[qr]].find(a[i]));
for(int i=L[pos[qr]];i<=qr;i++)a[i]+=k;
for(int i=L[pos[qr]];i<=qr;i++)s[pos[qr]].insert(a[i]);
if(pos[ql]+1<=pos[qr]-1)for(int i=pos[ql]+1;i<=pos[qr]-1;i++)tag[i]+=k;
}
inline int query(int ql,int qr,int k)
{
int res=-1;
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)if(a[i]+tag[pos[ql]]<k)res=max(res,a[i]+tag[pos[ql]]);
return res;
}
for(int i=ql;i<=R[pos[ql]];i++)if(a[i]+tag[pos[ql]]<k)res=max(res,a[i]+tag[pos[ql]]);
for(int i=L[pos[qr]];i<=qr;i++)if(a[i]+tag[pos[qr]]<k)res=max(res,a[i]+tag[pos[qr]]);
if(pos[ql]+1<=pos[qr]-1)
for(int i=pos[ql]+1;i<=pos[qr]-1;i++)
{
set<int>::iterator it=s[i].lower_bound(k-tag[i]);
if(it==s[i].begin())continue;
it--;
res=max(res,*it+tag[i]);
}
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
t=sqrt(n),cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
for(int i=1;i<=n;i++)s[pos[i]].insert(a[i]);
for(int i=1;i<=n;i++)
{
int op,l,r,k;scanf("%d%d%d%d",&op,&l,&r,&k);
if(!op)add(l,r,k);
else printf("%d\n",query(l,r,k));
}
return 0;
}

4.区间加+区间和

类似线段树对块打标记。

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=50010;
const int maxt=250;
int n,t,cnt;
int a[maxn],L[maxt],R[maxt],pos[maxn],sum[maxt],tag[maxt];
inline void add(int ql,int qr,int k)
{
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)a[i]+=k;
sum[pos[ql]]+=(qr-ql+1)*k;
return;
}
for(int i=ql;i<=R[pos[ql]];i++)a[i]+=k;
sum[pos[ql]]+=(R[pos[ql]]-ql+1)*k;
for(int i=L[pos[qr]];i<=qr;i++)a[i]+=k;
sum[pos[qr]]+=(qr-L[pos[qr]]+1)*k;
if(pos[ql]+1<=pos[qr]-1)for(int i=pos[ql]+1;i<=pos[qr]-1;i++)tag[i]+=k;
}
inline int query(int ql,int qr,int mod)
{
int res=0;
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)res=(res+(a[i]+tag[pos[ql]])%mod)%mod;
return res;
}
for(int i=ql;i<=R[pos[ql]];i++)res=(res+(a[i]+tag[pos[ql]])%mod)%mod;
for(int i=L[pos[qr]];i<=qr;i++)res=(res+(a[i]+tag[pos[qr]])%mod)%mod;
if(pos[ql]+1<=pos[qr]-1)
for(int i=pos[ql]+1;i<=pos[qr]-1;i++)res=(res+(sum[i]+(R[i]-L[i]+1)*tag[i]%mod)%mod)%mod;
return res;
}
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
t=sqrt(n),cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
for(int i=1;i<=n;i++)sum[pos[i]]+=a[i];
for(int i=1;i<=n;i++)
{
int op,l,r,k;scanf("%lld%lld%lld%lld",&op,&l,&r,&k);
if(!op)add(l,r,k);
else printf("%lld\n",query(l,r,k+1));
}
return 0;
}

5.区间开根+区间和

记录最大值,发现最大值小于等于1就不修改。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=50010;
const int maxt=250;
int n,t,cnt;
int a[maxn],L[maxt],R[maxt],pos[maxn],sum[maxt],maxx[maxt];
inline void change(int ql,int qr)
{
if(pos[ql]==pos[qr])
{
if(maxx[pos[ql]]<=1)return;
for(int i=ql;i<=qr;i++)sum[pos[ql]]-=a[i],a[i]=sqrt(a[i]),sum[pos[ql]]+=a[i];
maxx[pos[ql]]=0;
for(int i=L[pos[ql]];i<=R[pos[ql]];i++)maxx[pos[ql]]=max(maxx[pos[ql]],a[i]);
return;
}
if(maxx[pos[ql]]>1)for(int i=ql;i<=R[pos[ql]];i++)sum[pos[ql]]-=a[i],a[i]=sqrt(a[i]),sum[pos[ql]]+=a[i];
if(maxx[pos[qr]]>1)for(int i=L[pos[qr]];i<=qr;i++)sum[pos[qr]]-=a[i],a[i]=sqrt(a[i]),sum[pos[qr]]+=a[i];
if(pos[ql]+1>pos[qr]-1)return;
for(int i=pos[ql]+1;i<=pos[qr]-1;i++)
{
if(maxx[i]<=1)continue;
sum[i]=maxx[i]=0;
for(int j=L[i];j<=R[i];j++)a[j]=sqrt(a[j]),sum[i]+=a[j];
for(int j=L[i];j<=R[i];j++)maxx[i]=max(maxx[i],a[j]);
}
}
inline int query(int ql,int qr)
{
int res=0;
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)res+=a[i];
return res;
}
for(int i=ql;i<=R[pos[ql]];i++)res+=a[i];
for(int i=L[pos[qr]];i<=qr;i++)res+=a[i];
if(pos[ql]+1<=pos[qr]-1)
for(int i=pos[ql]+1;i<=pos[qr]-1;i++)res+=sum[i];
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
t=sqrt(n),cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
for(int i=1;i<=n;i++)sum[pos[i]]+=a[i],maxx[pos[i]]=max(maxx[pos[i]],a[i]);
for(int i=1;i<=n;i++)
{
int op,l,r,k;scanf("%d%d%d%d",&op,&l,&r,&k);
if(!op)change(l,r);
else printf("%d\n",query(l,r));
}
return 0;
}

6.插入一个数+查第k个数

插入次数达到块长就重构,查询暴力跳。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=200010;
const int maxt=500;
int n,t,cnt,tot,num;
int a[maxn],c[maxn];
vector<int>ve[maxt];
inline void rebuild()
{
num=tot=0;
for(int i=1;i<=cnt;i++)
{
for(unsigned int j=0;j<ve[i].size();j++)a[++tot]=ve[i][j];
ve[i].clear();
}
t=sqrt(tot);cnt=tot/t;
if(tot%t)cnt++;
for(int i=1;i<=tot;i++)ve[(i-1)/t+1].push_back(a[i]);
}
inline int find(int x)
{
int now=1;
while(x>ve[now].size())x-=ve[now].size(),now++;
return ve[now][x-1];
}
inline void insert(int x,int k)
{
num++;
int now=1;
while(x>ve[now].size())x-=ve[now].size(),now++;
ve[now].insert(ve[now].begin()+x-1,k);
if(num==t)rebuild();
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
t=sqrt(n);cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=n;i++)ve[(i-1)/t+1].push_back(a[i]);
for(int i=1;i<=n;i++)
{
int op,l,r,k;scanf("%d%d%d%d",&op,&l,&r,&k);
if(!op)insert(l,r);
else printf("%d\n",find(r));
}
return 0;
}

7.区间乘+区间加+单点查

像线段树2那样维护标记即可

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
const int maxt=350;
const int mod=10007;
int n,t,cnt;
int a[maxn],pos[maxn],L[maxt],R[maxt],tag1[maxt],tag2[maxt];
inline void down(int x)
{
for(int i=L[x];i<=R[x];i++)a[i]=(a[i]*tag2[x]%mod+tag1[x])%mod;
tag1[x]=0,tag2[x]=1;
}
inline void add(int ql,int qr,int k)
{
if(pos[ql]==pos[qr])
{
down(pos[ql]);
for(int i=ql;i<=qr;i++)a[i]=(a[i]+k)%mod;
return;
}
down(pos[ql]);
for(int i=ql;i<=R[pos[ql]];i++)a[i]=(a[i]+k)%mod;
down(pos[qr]);
for(int i=L[pos[qr]];i<=qr;i++)a[i]=(a[i]+k)%mod;
if(pos[ql]+1<=pos[qr]-1)for(int i=pos[ql]+1;i<=pos[qr]-1;i++)tag1[i]=(tag1[i]+k)%mod;
}
inline void mul(int ql,int qr,int k)
{
if(pos[ql]==pos[qr])
{
down(pos[ql]);
for(int i=ql;i<=qr;i++)a[i]=a[i]*k%mod;
return;
}
down(pos[ql]);
for(int i=ql;i<=R[pos[ql]];i++)a[i]=a[i]*k%mod;
down(pos[qr]);
for(int i=L[pos[qr]];i<=qr;i++)a[i]=a[i]*k%mod;
if(pos[ql]+1<=pos[qr]-1)
for(int i=pos[ql]+1;i<=pos[qr]-1;i++)
tag1[i]=tag1[i]*k%mod,tag2[i]=tag2[i]*k%mod;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
t=sqrt(n),cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
for(int i=1;i<=cnt;i++)tag2[i]=1;
for(int i=1;i<=n;i++)
{
int op,l,r,k;scanf("%d%d%d%d",&op,&l,&r,&k);
if(!op)add(l,r,k);
if(op==1)mul(l,r,k);
if(op==2)printf("%d\n",(a[r]*tag2[pos[r]]%mod+tag1[pos[r]])%mod);
}
return 0;
}

8.每次查询一个区间等于某个值的数的个数并将区间赋值为这个值

显然有势能,维护每个块是否被覆盖和覆盖的颜色,每次重构两个散块

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
const int maxt=350;
int n,t,cnt;
int a[maxn],pos[maxn],L[maxt],R[maxt],col[maxt];
inline void down(int x)
{
if(col[x]==-1)return;
for(int i=L[x];i<=R[x];i++)a[i]=col[x];
}
inline void reset(int x,int k)
{
col[x]=k;
for(int i=L[x];i<=R[x];i++)if(a[i]!=k)col[x]=-1;
}
inline int query(int ql,int qr,int k)
{
int res=0;
if(pos[ql]==pos[qr])
{
if(~col[pos[ql]])return (col[pos[ql]]==k)?qr-ql+1:0;
for(int i=ql;i<=qr;i++)res+=(a[i]==k);
return res;
}
if(~col[pos[ql]])res+=(col[pos[ql]]==k)?R[pos[ql]]-ql+1:0;
else for(int i=ql;i<=R[pos[ql]];i++)res+=(a[i]==k);
if(~col[pos[qr]])res+=(col[pos[qr]]==k)?qr-L[pos[qr]]+1:0;
else for(int i=L[pos[qr]];i<=qr;i++)res+=(a[i]==k);
if(pos[ql]+1<=pos[qr]-1)
for(int i=pos[ql]+1;i<=pos[qr]-1;i++)
{
if(~col[i]){res+=(col[i]==k)?R[i]-L[i]+1:0;continue;}
for(int j=L[i];j<=R[i];j++)res+=(a[j]==k);
}
return res;
}
inline void change(int ql,int qr,int k)
{
if(pos[ql]==pos[qr])
{
down(pos[ql]);
for(int i=ql;i<=qr;i++)a[i]=k;
reset(pos[ql],k);
return;
}
down(pos[ql]);
for(int i=ql;i<=R[pos[ql]];i++)a[i]=k;
reset(pos[ql],k);
down(pos[qr]);
for(int i=L[pos[qr]];i<=qr;i++)a[i]=k;
reset(pos[qr],k);
if(pos[ql]+1<=pos[qr]-1)for(int i=pos[ql]+1;i<=pos[qr]-1;i++)col[i]=k;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
t=sqrt(n),cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
for(int i=1;i<=cnt;i++)col[i]=-1;
for(int i=1;i<=n;i++)
{
int l,r,k;scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query(l,r,k));
change(l,r,k);
}
return 0;
}

9.区间最小众数

这题相同。

code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
const int maxt=10100;
const int inf=1e9;
int n,t,cnt,num;
int a[maxn],b[maxn],c[maxn],L[maxt],R[maxt],pos[maxn];
int ans[maxt][maxt];
vector<int>ve[maxn];
inline int read()
{
char c=getchar();int res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
inline void pre_work()
{
sort(b+1,b+n+1);num=unique(b+1,b+n+1)-(b+1);b[0]=inf;
for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+num+1,a[i])-b;
for(int i=1;i<=n;i++)ve[a[i]].push_back(i);
for(int i=1;i<=cnt;i++)
{
int maxx=0,res=0;
for(int j=L[i];j<=n;j++)
{
c[a[j]]++;
if(c[a[j]]>maxx||(c[a[j]]==maxx&&b[a[j]]<b[res]))res=a[j],maxx=c[a[j]];
if(j%t==0||j==n)ans[i][pos[j]]=res;
}
for(int j=L[i];j<=n;j++)c[a[j]]--;
}
}
inline int calc(int ql,int qr,int k)
{
return upper_bound(ve[k].begin(),ve[k].end(),qr)-lower_bound(ve[k].begin(),ve[k].end(),ql);
}
inline int query(int ql,int qr)
{
int maxx=0,res=0;
if(pos[ql]==pos[qr])
{
for(int i=ql;i<=qr;i++)
{
int tmp=calc(ql,qr,a[i]);
if(tmp>maxx||(tmp==maxx&&b[a[i]]<b[res]))maxx=tmp,res=a[i];
}
return res;
}
for(int i=ql;i<=R[pos[ql]];i++)
{
int tmp=calc(ql,qr,a[i]);
if(tmp>maxx||(tmp==maxx&&b[a[i]]<b[res]))maxx=tmp,res=a[i];
}
for(int i=L[pos[qr]];i<=qr;i++)
{
int tmp=calc(ql,qr,a[i]);
if(tmp>maxx||(tmp==maxx&&b[a[i]]<b[res]))maxx=tmp,res=a[i];
}
int p1=pos[ql]+1,p2=pos[qr]-1;
if(p1<=p2)
{
int tmp=calc(ql,qr,ans[p1][p2]);
if(tmp>maxx||(tmp==maxx&&b[ans[p1][p2]]<b[res]))maxx=tmp,res=ans[p1][p2];
}
return res;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)a[i]=b[i]=read();
t=30;cnt=n/t;
if(n%t)cnt++;
for(int i=1;i<=cnt;i++)L[i]=(i-1)*t+1,R[i]=min(i*t,n);
for(int i=1;i<=n;i++)pos[i]=(i-1)/t+1;
pre_work();
for(int i=1;i<=n;i++)
{
int l=read(),r=read();
printf("%d\n",b[query(l,r)]);
}
return 0;
}

LOJ 数列分块入门系列的更多相关文章

  1. [Loj] 数列分块入门 1 - 9

    数列分块入门 1 https://loj.ac/problem/6277 区间加 + 单点查询 #include <iostream> #include <cstdio> #i ...

  2. loj 数列分块入门 6 9(区间众数)

    6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...

  3. loj 数列分块入门 5 7 8

    5 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间开方,区间求和. 思路 用\(tag\)记录这一块是否已全为\(1\). 除分块外,还可用 树状数组+并查集(链表) 或者 线 ...

  4. LOJ 6277:数列分块入门 1(分块入门)

    #6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...

  5. LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)

    #6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给 ...

  6. LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)

    #6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  7. LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)

    #6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2   题目描述 给出 ...

  8. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

    #6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出 ...

  9. LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)

    #6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5   题目描述 给出 ...

随机推荐

  1. bcftools

    beftools非常复杂,大概有20个命令,每个命令下面还有N多个参数 annotate .. edit VCF files, add or remove annotations call .. SN ...

  2. 局域网部署ntp时间服务器

    搭建ntp时间服务器 时间服务器配置 须切换到root用户,再进行操作 检查ntp是否安装 [root@hadoop01 ~]# rpm -qa | grep ntp 如果没有安装,须安装 [root ...

  3. 线程池之ScheduledThreadPoolExecutor线程池源码分析笔记

    1.ScheduledThreadPoolExecutor 整体结构剖析. 1.1类图介绍 根据上面类图图可以看到Executor其实是一个工具类,里面提供了好多静态方法,根据用户选择返回不同的线程池 ...

  4. C# 爬虫相关的、可供参考的开源项目

    1. Abots https://github.com/sjdirect/abot/ 2. DotnetSpider https://github.com/dotnetcore/DotnetSpide ...

  5. 基于Spark的电影推荐系统(推荐系统~4)

    第四部分-推荐系统-模型训练 本模块基于第3节 数据加工得到的训练集和测试集数据 做模型训练,最后得到一系列的模型,进而做 预测. 训练多个模型,取其中最好,即取RMSE(均方根误差)值最小的模型 说 ...

  6. laravel 广播细节讲解

    1.应用场景 1.通知(Notification) 或 信号(Signal) 2.通知是最简单的示例,也最经常用到.信号也可看作是通知的一种展现形式,只不过信号没有UI而已. 3.Activity S ...

  7. SQL Server温故系列(0):导航目录

    创建本系列博文通用库表及数据的 SQL 语句:下载 SQL Server温故系列(0):导航目录 SQL Server温故系列(1):SQL 数据操作 CRUD 之增删改合 SQL Server温故系 ...

  8. CSS3 transform 属性(2D,3D旋转)

    一.语法 div{ transform:rotate(7deg); -ms-transform:rotate(7deg); /* IE 9 */ -moz-transform:rotate(7deg) ...

  9. Linux用户和权限——管理用户和用户组的命令

    Linux用户和权限——管理用户和用户组的命令 摘要:本文主要学习了在Linux系统中管理用户和用户组的命令. useradd命令 useradd命令可以用来创建新用户. 基本语法 useradd [ ...

  10. Flutter 安装笔记

    一. 安装镜像(有vpn的不用理) 1  打开终端 输入 open ~  ,回车 2  双击 .bash_profile  3  添加以下代码 后保存关闭即可(代码可能会变请直接到https://fl ...