博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解——loj6281 数列分块入门5 (分块)
阅读量:6429 次
发布时间:2019-06-23

本文共 1704 字,大约阅读时间需要 5 分钟。

分块

若块内最大值为0或1,则不用再开方

然后暴力修改

可以证明,如果开方后向下取整,则最多开方4次一个数就会变成0或1

#include 
#include
#include
#include
using namespace std;long long n,sz,num,belong[50010],a[50010],maxb[50010],sum[50010];void calbe(int n){ for(int i=1;i<=n;i++) belong[i]=(i-1)/sz+1;}void reset(int x){ maxb[x]=0; sum[x]=0; for(int i=(x-1)*sz+1;i<=min(sz*x,n);i++){ maxb[x]=max(maxb[x],a[i]); sum[x]+=a[i]; }}long long query(int l,int r){ int xl=belong[l]; int xr=belong[r]; long long ans=0; for(int i=l;i<=min(xl*sz,(long long)r);i++) ans+=a[i]; if(xl!=xr){ for(int i=(xr-1)*sz+1;i<=r;i++) ans+=a[i]; } for(int i=xl+1;i<=xr-1;i++) ans+=sum[i]; return ans;}void update(int l,int r){ int xl=belong[l]; int xr=belong[r]; for(int i=l;i<=min(xl*sz,(long long)r);i++){ a[i]=sqrt(a[i]); } reset(xl); if(xl!=xr){ for(int i=(xr-1)*sz+1;i<=r;i++){ a[i]=sqrt(a[i]); } reset(xr); } for(int i=xl+1;i<=xr-1;i++){ if(maxb[i]<=1) continue; for(int j=(i-1)*sz+1;j<=i*sz;j++) a[j]=sqrt(a[j]); reset(i); }}int main(){ scanf("%lld",&n); sz=sqrt(n); num=n/sz; if(n%sz) num++; calbe(n); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=1;i<=num;i++) reset(i); for(int i=1;i<=n;i++){ int opt,l,r,c; scanf("%d %d %d %d",&opt,&l,&r,&c); if(opt==0) update(l,r); else printf("%lld\n",query(l,r)); } return 0;}

 

转载于:https://www.cnblogs.com/dreagonm/p/9508144.html

你可能感兴趣的文章
linux系统安全设置
查看>>
golang 使用sql语句操作数据库的方法
查看>>
itext 中文乱码问题
查看>>
Lua4.0 正式开始
查看>>
我的友情链接
查看>>
Windows10如何开启鼠标显示指针轨迹
查看>>
配置H3C交换机实例(设置安全策略版,通过源IP地址对WEB登录用户进行控制)[连载之电子商务系统架构]...
查看>>
Mahout下个性化推荐引擎Taste介绍
查看>>
sql 语句 IP处理函数inet_aton()和inet_ntoa()
查看>>
《在实践中深入理解常见网络协议》
查看>>
bash并发
查看>>
Velocity初尝试
查看>>
浅谈IT技术支持
查看>>
js返回页面顶部常用方法
查看>>
改进fastjson的WriteClassName特性时的输出数据容量
查看>>
mysql, ssh实现非交互
查看>>
python学习小技巧分享(持续更新)
查看>>
Charles安装与使用
查看>>
XenApp5.3无法发现主机
查看>>
Kubernetes PV在Retain策略Released状态下重新分配到PVC恢复数据
查看>>