目录

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. C#中Stack集合

    Stact<T>集合 特点:后进先出,简单来说就是就是新添加的元素都放到第一位,而且顺序移除元素也是从第一位开始移除. 三个方法: Push(T value);//添加一个值到集合顶部位置 ...

  2. bzoj4520 K远点对

    题目链接 思路 这个"\(K\)远"点对一直理解成了距离第\(K\)大的点对\(233\). 要求第\(K\)远,那么我们只要想办法求出来最远的\(K\)个点对就可以了. 用一个大 ...

  3. vscode配置编译运行调试C/C++文件-windows环境

    在windows环境下,编译运行小文件的C/C++环境 软件准备: vscode mingw64(官网下特别慢,可以在devc++安装软件里中找,放到全局变量中) 插件下载: Run Code C/C ...

  4. Visual Studio 2015 Tools for Unity使用基础

    Unity4.x编辑器侧 具体版本号:Visual Studio 2015 Tools for Unity 3.7.0.1 该插件在:Microsoft Visual Studio Tools for ...

  5. 手把手教你如何用Fiddler抓取手机数据包(iOS+Android)

    本文主要教你如何通过 Fiddler 来抓取手机端的数据包,包括 iOS 和 Android 端的配置和抓取. 一.Fiddler下载安装 访问 Fiddler 官网:https://www.tele ...

  6. Python连载36-线程数量限制、Timer、可重入锁

    一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 import threading import time #参数定义 ...

  7. LeetCode 232:用栈实现队列 Implement Queue using Stacks

    题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是 ...

  8. let/const特性

        let: 1.声明的变量不存在预解析: console.log(a); let a=1; 2.变量名不允许重复(在同一作用域下): { let a=1; let a=2; console.lo ...

  9. 图解Hyperf框架:Hyperf 的初始化

  10. javascript模块化编程的cmd规范(sea.js)

    CMD(Common Module Definition,通用模块定义)是一种模块定义规范,规范中明确了模块的基本书写格式和基本交互规则.SeaJS就是遵循的这个规范. define函数 在CMD规范 ...