[LOJ] 分块九题 5
区间开平方,区间查询。
lazy标记改为区间是否全是1或者0,这样的区间是没有更新价值的。
//Stay foolish,stay hungry,stay young,stay simple
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cctype>
#define sq(x) (floor(sqrt(x)))
using namespace std;
const int MAXN=500005;
inline int read_d(){
int ret=0,op=1;char c;
while(c=getchar(),!isdigit(c))op=c=='-'?-1:1;
while(isdigit(c)){
ret=ret*10+c-'0';
c=getchar();
}
return ret*op;
}
int n;
int sum[MAXN],a[MAXN];
bool lazy[MAXN];
int l[MAXN],r[MAXN],bl[MAXN];
int block,num;
void build(){
block=sqrt(n);
num=n/block;
if(n%block) num++;
for(int i=1;i<=n;i++){
l[i]=(i-1)*block+1;
r[i]=i*block;
bl[i]=(i-1)/block+1;
sum[bl[i]]+=a[i];
}
}
void updata_block(int id){
lazy[id]=1;sum[id]=0;
for(int i=l[id];i<=r[id];i++){
if(a[i]>=2) lazy[id]=0;
a[i]=sq(a[i]);
sum[id]+=a[i];
}
}
void updata(int x,int y){
if(bl[x]==bl[y]){
if(lazy[bl[x]]) return;
for(int i=x;i<=y;i++){
sum[bl[i]]-=a[i];
a[i]=sq(a[i]);
sum[bl[i]]+=a[i];
}
return;
}
for(int i=x;i<=r[bl[x]];i++){
sum[bl[i]]-=a[i];
a[i]=sq(a[i]);
sum[bl[i]]+=a[i];
}
for(int i=l[bl[y]];i<=y;i++){
sum[bl[i]]-=a[i];
a[i]=sq(a[i]);
sum[bl[i]]+=a[i];
}
for(int i=bl[x]+1;i<=bl[y]-1;i++){
if(lazy[i]) continue;
updata_block(i);
}
}
int query(int x,int y){
int ret=0;
if(bl[x]==bl[y]){
for(int i=x;i<=y;i++) ret+=a[i];
return ret;
}
for(int i=x;i<=r[bl[x]];i++) ret+=a[i];
for(int i=l[bl[y]];i<=y;i++) ret+=a[i];
for(int i=bl[x]+1;i<=bl[y]-1;i++) ret+=sum[i];
return ret;
}
int main(){
n=read_d();
for(int i=1;i<=n;i++) a[i]=read_d();
build();
for(int i=1;i<=n;i++){
int q=read_d(),x=read_d(),y=read_d(),z=read_d();
if(q==0) updata(x,y);
else printf("%d\n",query(x,y));
}
return 0;
}
[LOJ] 分块九题 5的更多相关文章
- [LOJ] 分块九题 6
单点插入,单点查询. 优化了的链表. 链表老写错,干脆用vector,也不算慢. 注意链表退化的问题,及时(比如操作根号n次)就重新建块,实测速度可以提高一倍,这还是数据随机的情况,若涉及大量同一位置 ...
- [LOJ] 分块九题 4
https://loj.ac/problem/6280 区间修改,区间求和. 本来线段树的活. //Stay foolish,stay hungry,stay young,stay simple #i ...
- [LOJ] 分块九题 3
https://loj.ac/problem/6279 区间修改,区间查询前驱. TLE无数,我觉得这代码最精髓的就是block=1000. 谜一样的1000. 两个启示: 块内可以维护数据结构,比如 ...
- [LOJ] 分块九题 2
https://loj.ac/problem/6278 区间修改,查询区间第k大. 块内有序(另存),块内二分. 还是用vector吧,数组拷贝排序,下标搞不来.. //Stay foolish,st ...
- [LOJ] 分块九题 1
https://loj.ac/problem/6277 区间修改,单点查询. //Stay foolish,stay hungry,stay young,stay simple #include< ...
- [LOJ] 分块九题 8
区间查询数值+整体赋值 维护tag代表整个区间被赋成了tag[i] 用pushdown操作,而不是修改了再check. 不压缩代码了,调起来心累,长点有啥不好. //Stay foolish,stay ...
- [LOJ] 分块九题 7
区间加法,区间乘法,单点查询. 洛谷线段树2 屡清加法乘法的关系,定义答案为 a*mut+add 对于整块: 新的乘w,mut和add都要乘w 新的加w,add加w //Stay foolish,st ...
- 数列分块总结——题目总版(hzwer分块九题及其他题目)(分块)
闲话 莫队算法似乎还是需要一点分块思想的......于是我就先来搞分块啦! 膜拜hzwer学长神犇%%%Orz 这九道题,每一道都堪称经典,强力打Call!点这里进入 算法简述 每一次考试被炸得体无完 ...
- hzwer分块九题(暂时持续更新)
hzwer分块9题 分块1:区间加法,单点查询 Code #include<bits/stdc++.h> #define in(i) (i=read()) using namespace ...
随机推荐
- MFC类别概述
MFC 类别主要可分为下列数大群组: ■ General Purpose classes - 提供字符串类别.数据处理类别(如数组与串行),异 常情况处理类别.文件类别...等等. ■ Windows ...
- 安装截图软件shutter
直接进入软件中心安装吧 不知道软件中心安装的软件可以apt upgrade 命令更新么 应该是可以的,感觉软件中心就是个图形化的apt和新立得差不多 shutter可以放大缩小截图, ctrl + 鼠 ...
- Android 暗码表
转自: http://blog.csdn.net/jiangshide/article/details/8192834 不同手机厂商可能会隐藏或修改暗码,部份暗码要谨慎使用,因为可能令手机失去原有的功 ...
- rac 添加 资源
10g : 自动化.监控.os,存储,底成,网络,规范
- vue中引入字体图标报错,找不到字体文件
在用vue + webpack进行开发的时候,在引用字体图标遇到字体无法加载的问题: 报以下错误 搞了好久没搞定,最后才找到解决方法(还是没有找到原因) 修改字体图标的css中引入字体文件的路径 以前 ...
- Keil简介
最早接触Keil是学习开发8051系列的单片机.Keil C51是Keil公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易 ...
- js中json处理总结之JSON.parse
踩过的坑都将成为路上的风景.队友在cookie中已存以下值: address_info {"address_name":"人民大会堂","...lng ...
- 消息中间件与RPC的区别
消息中间件和消息通信与RPC各自具有怎样的优势,如何互补消息中间件主要实现的是异步.弹性消息以及队列,弹性消息有时可以借助于外存从而一定程度上可以实现峰值缓存,有效均衡服务器端压力,同时消息可以进行一 ...
- win驱动安装记录
工具:devcon64.exe 安装/更新/删除等记录:c:\windows\inf\setupapi.dev.log
- win应用只允许单个实例运行,并将已运行实例窗口置顶
关键词:windows,c++,桌面应用,单个实例,窗口置顶 目标:1.判断本程序是否已有一个实例在运行.2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行. 1.使用semaphore来 ...