LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.
- 分块1
- 分块2
- 分块4
模板一共有九个.我试着在三天内做了3个.
应该不用超链接吧.
分块1
区间加,单点询问.
这不是裸的改版树状数组吗?用树状数组处理前缀和水过.
#include<bits/stdc++.h>
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
inline int read(){re0 x=0,f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';return x*(f?1:-1);}
inline void read(rel &x){x=0;re0 f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';x*=f?1:-1;}
inline int write(rel x){if (!x) return pc(48);if (x<0) x=-x,pc('-');re0 bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);}
}
using namespace chtholly;
using namespace std;
#define lowbit(x) (x&-x)
const int karen=5e5;
int n=read();
ll a[karen|10],c[karen|10];
inline void add(int x,int k){for (;x<=n;x+=lowbit(x)) c[x]+=k;}
inline int query(int x){int sum=0;for (;x>0;x-=lowbit(x)) sum+=c[x];return sum;}int main()
{
re0 i;
for (i=1;i<=n;++i) a[i]=read();
for (i=1;i<=n;++i){re0 k=read(),x=read(),y=read(),z=read();if (!k) add(x,z),add(y+1,-z);else write(a[y]+query(y)),pl;}
}
分块2
区间加,区间查询小于c^2的数的个数.
好题.线段树是搞不定的,考虑玄学分块.
数组开了5e4,莫名RE30分.我开成了1e5,A掉了.我不知道怎么回事.
/*
分块处理.
对于修改,左右两个不包含整块的部分,我们就暴力修改并重构整个块.
中间的整块的部分我们维护一个延迟标记,询问的时候减去标记即可.
至于询问,左右两个部分暴力扫一下,中间对每一块进行二分求出答案.
我写的分块实在丑了点.
*/
#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
inline int read(){re0 x=0,f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';return x*(f?1:-1);}
inline void read(rel &x){x=0;re0 f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';x*=f?1:-1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return pc(48);if (x<0) x=-x,pc('-');re0 bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);}
}
using namespace chtholly;
using namespace std;
#define belong(x) (((x)-1)/block+1)//这个位置所属的块.
#define all(u) v[u].begin(),v[u].end()
const int karen=1e5;
typedef int fuko[karen|10];//定义了fuko类型是大小为karen+10的数组.
fuko a,l,r,lazy;
int n=read(),block,num;
vector<int> v[karen|10];
/*
block是每一块的大小,num是一共的块数.
l,r分别是每一块的左边界和右边界,belong是每一个位置所属的块.
lazy是给某一块的所有数加上的值.(询问的时候用c减去就可以了.)
*/void buildblock()//预处理每个块的信息.
{
re0 i;
block=sqrt(n),num=n/block+n%block;
for (i=1;i<=num;++i) l[i]=(i-1)*block+1,r[i]=i*block;r[num]=n;//处理每个块的左边界和右边界.注意特判最后一块的右边界是n.
for (i=1;i<=n;++i) v[belong(i)].push_back(a[i]);//vector从小到大存放每一个块内的数.
for (i=1;i<=num;++i) sort(all(i));
}void readd(int x)//直接重构块.
{
v[x].clear();
for (re0 i=l[x];i<=r[x];++i)v[x].push_back(a[i]);
sort(all(x));
}void update(int ql,int qr,int k)//区间修改.
{
re0 i;
for (i=ql;i<=min(r[belong(ql)],qr);++i)//暴力扫从l到它所在块右边界的部分.a[i]+=k;
readd(belong(ql));
if (belong(ql)!=belong(qr))//如果l和r不在同一块内,处理r所在的部分.{for (i=l[belong(qr)];i<=qr;++i)a[i]+=k;readd(belong(qr));}
for (i=belong(ql)+1;i<belong(qr);++i) lazy[i]+=k;//处理一下延迟标记.
}int query(int ql,int qr,int c)
{
re0 ans=0,i;
for (i=ql;i<=min(qr,r[belong(ql)]);++i)ans+=a[i]+lazy[belong(i)]<c;//暴力
if (belong(ql)!=belong(qr)) {for (i=l[belong(qr)];i<=qr;++i) ans+=a[i]+lazy[belong(i)]<c;//暴力}
for (i=belong(ql)+1;i<belong(qr);++i)ans+=lower_bound(all(i),c-lazy[i])-v[i].begin();//二分求每一个块的答案.
return ans;
}int main()
{
re0 i;
for (i=1;i<=n;++i) a[i]=read();
buildblock();
for (i=1;i<=n;++i){re0 op=read(),l=read(),r=read(),k=read();if (op) write(query(l,r,k*k)),pl;else update(l,r,k);}
}
分块4
区间加,区间求和.
这个显然是线段树,不用说了.
#include<bits/stdc++.h>
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
inline int read(){re0 x=0,f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';return x*(f?1:-1);}
inline void read(rel &x){x=0;re0 f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';x*=f?1:-1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return pc(48);if (x<0) x=-x,pc('-');re0 bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);}
}
using namespace chtholly;
using namespace std;
const int karen=5e4;
typedef ll fuko[karen<<2];
int n=read();struct segtree{
#define le rt<<1
#define ri le|1
#define ls le,l,mid
#define rs ri,mid+1,r
fuko val,lazy;
void build(int rt,int l,int r){if (l==r) val[rt]=read();else{int mid=l+r>>1;build(ls),build(rs);val[rt]=val[le]+val[ri];}}
void push_down(int rt,int l,int r){if (lazy[rt]){int mid=l+r>>1;lazy[le]+=lazy[rt],lazy[ri]+=lazy[rt];val[le]+=(mid-l+1)*lazy[rt],val[ri]+=(r-mid)*lazy[rt];lazy[rt]=0;}}
void update(int rt,int l,int r,int ql,int qr,int v){if (ql>r||qr<l) return;if (ql<=l&&qr>=r){val[rt]+=1ll*(r-l+1)*v;lazy[rt]+=v;} else{int mid=l+r>>1;push_down(rt,l,r);update(ls,ql,qr,v),update(rs,ql,qr,v);val[rt]=val[le]+val[ri];}}
ll query(int rt,int l,int r,int ql,int qr){if (ql>r||qr<l) return 0;if (ql<=l&&qr>=r) return val[rt];int mid=l+r>>1;push_down(rt,l,r);return query(ls,ql,qr)+query(rs,ql,qr);}
}my_;int main()
{
my_.build(1,1,n);
for (re0 i=1;i<=n;++i){re0 t=read(),l=read(),r=read(),k=read();if (t) write((my_.query(1,1,n,l,r)%(k+1)+k+1)%(k+1)),pl;else my_.update(1,1,n,l,r,k);}
}
Thank you.
LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.相关推荐
- 树状数组、线段树、分块 在同一题目中的应用(Acwing 243)
Acwing 243 输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 输出样例: 4 55 9 15 树状数组做法 # ...
- 树状数组及线段树入门(SDNU1665-1668)
目录 前言 树状数组 先导 单点修改区间查询 区间修改区间查询 线段树 先导 单点修改区间查询--递归形式 单点修改区间查询--非递归形式 区间修改区间查询--递归形式 区间修改区间查询--非递归形式 ...
- 牛客23054 华华开始学信息学 树状数组分块
题目链接:牛客23054 华华开始学信息学 题目描述 因为上次在月月面前丢人了,所以华华决定开始学信息学.十分钟后,他就开始学树状数组了.这是一道树状数组的入门题: 给定一个长度为N的序列A,所有元素 ...
- POJ3468-A Simple Problem with Integers【线段树,树状数组,分块】
正题 题目链接:我是链接 其实洛谷线段树模板也是一样的:三种方法AC评测链接 题目大意 要求支持区间修改,区间求和. 线段树 直接用一个lazy标记,在之前的博客里有说 code1 #include& ...
- LibreOJ 6282,6284,6285 数列分块入门6,8,9 树状数组,分块,线段树等.
分块6 分块8 分块9 终于结尾了. 诶?我定义的常量变成yuzu了?我不要可怜了? 可怜有剧毒!我再用可怜我要爆零了. 好吧其实是因为我研究了橘学.这里我推荐一下Citrus. 分块6 支持插入一个 ...
- ACM入门之【树状数组】
树状数组和线段树具有相似的功能,但他俩毕竟还有一些区别:树状数组能有的操作,线段树一定有:线段树有的操作, 树状数组不一定有.但是树状数组的代码要比线段树短,思维更清晰,速度也更快,在解决一些单点修改 ...
- 20220725树状数组入门反思
最近学习了树状数组和线段树,图论一点点啃吧,然后首先介绍一下树状数组的原理: 借用acwing一老哥的题解了. 树状数组的本质思想是使用树结构维护"前缀和",从而把时间复杂度降为O ...
- 小魂和他的数列(dp+树状数组优化)
链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...
- 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)
链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...
最新文章
- java 获取聚合vo_NC57聚合VO写法
- ASP.NET页面通过URL传递参数(一)(转载)
- L2-001 紧急救援-团体程序设计天梯赛GPLT
- 字符串转16进制字节数组,字节数组转16进制字符串
- 【BZOJ】【1086】 【SCOI2005】王室联邦
- Tips for vcpkg
- 如何使textarea显示滚动条
- 美国国家人工智能研发战略规划2019
- 十三、Linux驱动之触摸屏驱动
- Java医院网上预约挂号系统源码
- 手机数据网络慢怎么修改服务器,手机网速慢怎么回事 这三种方法可以一试
- Navicat Premium 用于增强您的数据库管理系统
- 计算机网络人工智能论文,浅析计算机网络中人工智能的应用论文
- 嵌入式软件学习问题汇总(一)什么是嵌入式?
- ubuntu终端字体大小调整方法
- 怎样将表格拆分为两个
- MII与RMII接口的区别
- js IP地址正则校验
- WPF 触发器Triggers
- DSP关键字cregister (关于IER,IFR找不到定义)
热门文章
- python ffmpeg模块mp4岀错_Python 调用 FFmpeg 提示 module 'ffmpeg' has no attribute 'input' 的解决方法-老唐笔记...
- 网件路由器R6400 梅林固件折腾篇
- 查看linux驱动使用的头文件,[转载]linux下usb驱动头文件的usb.h(二)
- Unity为物体施加力笔记
- 汇编语言复习题及详细答案1(老师给的题 自己写的答案)
- 赛迪研究院发布《2019中国大数据产业发展白皮书》
- 知识图谱学习与实践(6)——从结构化数据进行知识抽取(D2RQ介绍)
- 说好的30天直播生死呢?--第三章 我所理解的打击感(一)
- Unity3D 场景切换异步加载进度
- vue 错误building 2/2 modules 0 activeevents.js: 187 throw er; // unhandled 'error' event..... 解决