目录

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. pytest--生成HTML报告

    前戏 我们做自动化,测试报告是必不可少的.方便自己查看,也可以供领导查看,一个测试报告就可以说明我们做了哪些事情,pytest-html插件给我们提供了一个很简陋的测试报告,为什么说简陋,因为是真简陋 ...

  2. Ubuntu无法正常输入英文单引号符号 + 误删除package导致系统设置异常(解决方案)

    1 先说解决单引号的问题 写代码,遇到了输入英文单引号无法正常输入,需要按两次,而且不是竖向,而是斜的. 然后在寻找解决方案的过程中又遇到了把中文输入法搞得不能使用的问题.破费周折!!! 对Ubunt ...

  3. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  4. 【Java并发专题之二】Java线程基础

    使用线程更好的提高资源利用率,但也会带来上下文切换的消耗,频繁的内核态和用户态的切换消耗,如果代码设计不好,可能弊大于利. 一.线程 进程是分配资源的最小单位,线程是程序执行的最小单位:线程是依附于进 ...

  5. Django学习笔记(11)——开发图书管理页面

    一,项目题目: 开发图书管理页面 该项目主要练习Django对多个数据库进行增删改查的操作. 二,项目需求: 基础需求:75% 1. 列出图书列表.出版社列表.作者列表 2. 点击作者,会列出其出版的 ...

  6. pytz库时区的坑(转)

    add by zhj: 推荐使用标准库中的dateutil代替pytz 原文:https://www.hongweipeng.com/index.php/archives/1803/ 起步 在djan ...

  7. Ubuntu Err:1 http://us.archive.ubuntu.com/ubuntu bionic InRelease Could not resolve 'us.archive.ubuntu.com' 错误

    Ubuntu 更新 apt-get update 的时候 出现 Err: http://us.archive.ubuntu.com/ubuntu bionic InRelease Could not ...

  8. Winform 美化

    首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winform自带的MainForm窗体属性,第二步是添加窗体事件. 将主窗体FormBorderStyle更改为None,这样就得到了 ...

  9. maplotlib画柱状图并添加标签

    import json from collections import Counter import matplotlib.pyplot as plt import matplotlib as mpl ...

  10. Flask笔记:cookie

    在网站中,HTTP请求是无状态的:第一次请求成功后,第二次请求时服务器依然不知道这次请求的所属用户是谁.为了解决这个问题,在第一次请求成功后,服务器会生成并返回对应的cookie信息给浏览器,而浏览器 ...