LOJ 数列分块入门系列
目录
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 数列分块入门系列的更多相关文章
- [Loj] 数列分块入门 1 - 9
数列分块入门 1 https://loj.ac/problem/6277 区间加 + 单点查询 #include <iostream> #include <cstdio> #i ...
- loj 数列分块入门 6 9(区间众数)
6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...
- loj 数列分块入门 5 7 8
5 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间开方,区间求和. 思路 用\(tag\)记录这一块是否已全为\(1\). 除分块外,还可用 树状数组+并查集(链表) 或者 线 ...
- LOJ 6277:数列分块入门 1(分块入门)
#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计讨论 3 测试数据 题目描述 给出一 ...
- LOJ #6285. 数列分块入门 9-分块(查询区间的最小众数)
#6285. 数列分块入门 9 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给 ...
- LOJ #6284. 数列分块入门 8-分块(区间查询等于一个数c的元素,并将这个区间的所有元素改为c)
#6284. 数列分块入门 8 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)
#6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1 题目描述 给出 ...
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
随机推荐
- 腾讯云短信服务+Node.js给手机发送验证码
最近公司需要些一个登陆验证和修改密码验证,需要用到验证码,我用Node.js写了一个给手机发验证码的代码,下面实现的功能有:生产验证码,(计时器)验证码失效时间,给手机发送短信. 首先看官方文档,在给 ...
- ORB-SLAM2初步(源码逻辑分析)
今天主要是梳理一下ORB-SLAM2源码的逻辑关系,GitHub和泡泡机器人上有很好的注释版本(吴博),大神请(轻)板砖. 一.文件 如图所示,Examples里面存放的分别是基于单目.双目.RGBD ...
- 小米笔试题:无序数组中最小的k个数
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...
- 送书『构建Apache Kafka流数据应用』和『小灰的算法之旅』和『Java并发编程的艺术』
读书好处 1.可以使我们增长见识. 2.可提高我们的阅读能力和写作水平. 3.可以使我们变的有修养. 4.可以使我们找到好工作. 5.可以使我们在竞争激烈的社会立于不败之地. 6.最大的好处是可以让你 ...
- PHP 中的关于 trait 的简单
什么是 trait 看看 PHP 官网的介绍. 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.T ...
- 搜索旋转排序数组II
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [,,,,,,] 可能变为 [,,,,,,] ). 编写一个函数来判断给定的目标值是否存在于数组中.若存在返回 true, ...
- sap和OA之间数值传递1(环境准备)
1.本公司使用的是致远A8,首先在本机上准备好A8环境,java环境(jre1.8.0_131),eclipse版本(建议用eclipseInstaller下载最新的NEON版本),安装致远ide插件 ...
- Ubuntu1404配置jdk-12.0.2并安装Android Studio教程
最近在学习Android Studio 移动应用程序开发,但Android Studio好像对win10不太友好,所以小帅想在Ubuntu上安装Android Studio.为此小帅还去网上找了相关教 ...
- mysql报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
一.问题 运行java代码时报如下的错误: You have an error in your SQL syntax;Cause:com.mysql.jdbc.exceptions.jdbc4.MyS ...
- CSS样式表及选择器相关内容(二)-伪类与伪元素选择器
伪类与伪元素选择器归纳: 一.伪类选择器(伪类以":"开头,用在选择器后,用于指明元素在某种特殊的状态下才能被选中) 1.a标签伪类选择器,其他标签类似 eg: ...