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;
    }
    
    转载需注明出处。
  • 相关阅读:
    [转]oracle in 多个字段
    [转][MVC4]ASP.NET MVC4+EF5(Lambda/Linq)读取数据
    SQL Server “复制”表结构,创建_Log表及触发器
    [转]WordPress主题开发:主题初始化
    struts2请求过程源码分析
    java调优
    websocket之四:WebSocket 的鉴权授权方案
    高可用性及容灾的几个衡量指标
    Struts2返回JSON对象的方法总结
    java websocket @ServerEndpoint注解说明
  • 原文地址:https://www.cnblogs.com/jz929/p/11817632.html
Copyright © 2011-2022 走看看