题解——loj6277 数列分块入门1(分块)
分块裸题
然后就是记得左右边界处理和分块的初始化
忘了初始化会被卡成暴力
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int a[],belong[],lm[],rm[],num,sz,tag[],n;
inline int qread(void){
int x=;
int f=;
char s;
s=getchar();
while((s>''||s<'')&&s!='-')
s=getchar();
if(s=='-'){
f=-;
s=getchar();
}
while(s>=''&&s<=''){
x*=;
x+=s-'';
s=getchar();
}
return x*f;
}
void calbe(int n){
for(int i=;i<=n;i++)
belong[i]=((i-)/sz)+;
}
void modify(int l,int r,int w){
int xsl=belong[l];
int xsr=belong[r];
for(int i=l;i<=min(sz*xsl,r);i++)
a[i]+=w;
if(xsl!=xsr){
for(int i=(xsr-)*sz+;i<=r;i++)
a[i]+=w;
for(int i=xsl+;i<=xsr-;i++)
tag[i]+=w;
}
}
int query(int r){
return a[r]+tag[belong[r]];
}
int main(){
n=qread();
sz=sqrt(n);
calbe(n);
for(int i=;i<=n;i++)
a[i]=qread();
for(int i=;i<=n;i++){
int mode,l,r,c;
mode=qread();
if(mode==){
l=qread();
r=qread();
c=qread();
modify(l,r,c);
}
else{
l=qread();
r=qread();
c=qread();
printf("%d\n",query(r));
}
}
return ;
}
题解——loj6277 数列分块入门1(分块)的更多相关文章
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- LibreOJ 6280 数列分块入门 4(分块区间加区间求和)
题解:分块的区间求和比起线段树来说实在是太好写了(当然,复杂度也高)但这也是没办法的事情嘛.总之50000的数据跑了75ms左右还是挺优越的. 比起单点询问来说,区间询问和也没有复杂多少,多开一个su ...
- LibreOJ 6278 数列分块入门 2(分块)
题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...
- [Libre 6281] 数列分块入门 5 (分块)
水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...
- LOJ.6284.数列分块入门8(分块)
题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...
- LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...
- LibreOJ 6279 数列分块入门 3(分块+排序)
题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...
- LOJ.6281.数列分块入门5(分块 区间开方)
题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...
- [Libre 6282] 数列分块入门 6 (分块)
原题:传送门 code: //By Menteur_Hxy #include<cstdio> #include<iostream> #include<algorithm& ...
随机推荐
- c扩展开发
为什么要用C扩展 C是静态编译的,执行效率比PHP代码高很多.同样的运算代码,使用C来开发,性能会比PHP要提升数百倍.IO操作如CURL,因为耗时主要在IOWait上,C扩展没有明显优势. 另外C扩 ...
- python安装cv2
pip install opencv-python
- Linux基础命令---显示域名ypdomainname
ypdomainname ypdomainname指令显示由函数“getdomainname”返回的主机域名,使用这个指令也可以设置一个主机NIS/YP域名. 此命令的适用范围:RedHat.RH ...
- springboot 接收post和get请求
接收post请求: @RequestMapping(value = "/api/v1/create_info", method = RequestMethod.POST) publ ...
- AtCoder Beginner Contest 044 A - 高橋君とホテルイージー / Tak and Hotels (ABC Edit)
Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There is a hotel with ...
- 每天学点Linux命令之grep 和 wc命令
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expr ession Print,表示全局正则表 ...
- Mongo第三个参数的用法
Mongo update的用法 Update( array $criteria , array $new_object [, array $options = array() ] ) 第一个参数是条件 ...
- MySQL笔记(七)远程连接MySQL
mysql 默认只允许 localhost 连接,因此在远程连接服务器上的 mysql 之前,需要做一些设置.在没有设置前,默认是下面的状况,mysql 只能由 localhost(127.0.0.1 ...
- 作为php了解一下共享内存的概念及优缺点
共享内存是一种在相同机器中两个正在运行的进程之间共享和传递数据的有效方式,不同进程之间共享的内存通常安排为同一段物理内存:顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.一个进程可创建一 ...
- 常用MarkDown标记
1:加粗 两个*号 加粗 2:代码段 三个` 代码段