zoukankan      html  css  js  c++  java
  • 数列分块入门 5 总结

    在这里插入图片描述
    这题我得着重给一给数据范围,嗯嗯

    数据范围!!!

    在这里插入图片描述
    哈哈,我们发现a[i]最大是231-1。
    好,我们开开方先:
    2147483647
    46340(取整的
    215
    14
    3
    1
    1

    我们再试几个数,发现最终会变成0或1,然后就不会在变了。
    所以,它最多会开方5次,然后便相当于不变了。
    这样子,我们一开始全部暴力改。
    每当一个块的全部a[]都变成了0或1的话,就标记一下,表示下次不用再搞了。

    到此,opt==0的就解决了

    现在来看一下opt==1的

    对于每个块,我们用个d[]来存它的和。
    求答案的话便和以前那些差不多,
    分成三块。
    左边凸出来的,右边凸出来的,以及中间的完整的块。
    嘻嘻,两边暴力,中间就用到d[]即可。
    上标:

    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int a[50010],d[321],n,b[321];
    int opt,l,r,c,st;
    int bl[50010],le[321],ri[321];
    bool check[321]; 
    
    inline int read()
    {
    	int x=0,f=0; char c=getchar();
    	while (c<'0' || c>'9') f=(c=='-') ? 1:f,c=getchar();
    	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    	return f ? -x:x;
    }
    
    void solve(int x)
    {
    	if (check[x]) return;
    	check[x]=1,d[x]=0;
    	for (int i=le[x];i<=ri[x];i++)
    	{
    		a[i]=sqrt(a[i]),d[x]+=a[i];
    		if (a[i]>1) check[x]=0;
    	}
    }
    
    void open_square(int l,int r)
    {
    	for (int i=l;i<=min(ri[bl[l]],r);i++)
    		d[bl[l]]-=a[i],a[i]=sqrt(a[i]),d[bl[l]]+=a[i];
    	if (bl[l]!=bl[r])
    	{
    		for (int i=le[bl[r]];i<=r;i++)
    			d[bl[r]]-=a[i],a[i]=sqrt(a[i]),d[bl[r]]+=a[i];
    	}
    	for (int i=bl[l]+1;i<=bl[r]-1;i++) solve(i);
    }
    
    int query(int l,int r)
    {
    	int ans=0;
    	for (int i=l;i<=min(ri[bl[l]],r);i++) ans+=a[i];
    	if (bl[l]!=bl[r])
    		for (int i=le[bl[r]];i<=r;i++) ans+=a[i];
    	for (int i=bl[l]+1;i<=bl[r]-1;i++) ans+=d[i];
    	return ans;
    }
    
    int main()
    {
    	freopen("6281.in","r",stdin);
    	freopen("6281.out","w",stdout);
    	n=read(),st=sqrt(n);
    	for (int i=1;i<=n;i++) a[i]=read();
    	for (int i=1;i<=n;i++)
    	{
    		bl[i]=(i-1)/st+1;
    		d[bl[i]]+=a[i];
    		if (!le[bl[i]]) le[bl[i]]=i;
    		ri[bl[i]]=i;
    	}
    	for (int i=1;i<=n;i++)
    	{
    		opt=read(),l=read(),r=read(),c=read();
    		if (opt==0) open_square(l,r);
    		else printf("%d
    ",query(l,r));
    	}
    	return 0;
    }
    
    转载需注明出处。
  • 相关阅读:
    JVM相关小结
    Tachyon框架的Worker心跳及Master高可用性分析
    Yarn中的几种状态机
    Spark on Yarn遇到的几个问题
    Spark1.0.x入门指南
    Mapreduce执行过程分析(基于Hadoop2.4)——(三)
    Mapreduce执行过程分析(基于Hadoop2.4)——(二)
    Mapreduce执行过程分析(基于Hadoop2.4)——(一)
    使用HttpClient实现文件的上传下载
    Hadoop2.3+Hive0.12集群部署
  • 原文地址:https://www.cnblogs.com/jz929/p/11817632.html
Copyright © 2011-2022 走看看