分块板子题

news/2024/11/19 19:24:03/

区间加法,区间求和

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
#define int long long
ll s[N], b[N], w[N], add[N];
ll l[N], r[N], belong[N];
ll len, tot, n, q;inline void init() {len = sqrt(n), tot = (n + len - 1) / len;for (int i = 1; i <= tot; ++i)l[i] = r[i - 1] + 1, r[i] = i * len;r[tot] = n;for (int i = 1; i <= tot; ++i) {for (int j = l[i]; j <= r[i]; ++j)b[i] += w[j], belong[j] = i;s[i] = s[i - 1] + b[i];}
}inline void modify(int ql, int qr, int c) {int p = belong[ql], q = belong[qr];if (p == q) {for (int i = ql; i <= qr; ++i)w[i] += c, b[p] += c;for (int i = p; i <= tot; ++i)s[i] = s[i - 1] + b[i];return;}for (int i = ql; i <= r[p]; ++i)w[i] += c, b[p] += c;for (int i = qr; i >= l[q]; --i)w[i] += c, b[q] += c;for (int i = p + 1; i <= q - 1; ++i)add[i] += c, b[i] += (r[i] - l[i] + 1) * c;for (int i = p; i <= tot; ++i)s[i] = s[i - 1] + b[i];
}inline ll query(int ql, int qr,ll c) {int p = belong[ql], q = belong[qr];ll res = 0;if (p == q) {for (int i = ql; i <= qr; ++i)res = (res+ w[i] + add[p])%c;return res;}res = s[q - 1] - s[p];for (int i = ql; i <= r[p]; ++i)res = (res+ w[i] + add[p])%c;for (int i = qr; i >= l[q]; --i)res = (res+ w[i] + add[q])%c;return res;}signed main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >>n;q = n;for (int i = 1; i <= n; i++)cin >> w[i];init();while (q--) {int op, ql, qr, c;cin >> op >> ql >> qr>>c;if (!op){modify(ql, qr, c);}elsecout << query(ql,qr,c+1) << "\n";}return 0;}

分块 + 二分查询 查询区间小于或者大于某个数的个数

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6+10;
ll b[N],lz[N],w[N];
int l[N],r[N],belong[N];
int len,tot,ql,qr,n,q;inline void Sort(int k){for(int i=l[k];i<=r[k];++i)b[i] = w[i];sort(b+l[k],b+r[k]+1);
}inline void init()
{len = sqrt(n),tot = (n+len-1)/len;r[tot] = n;for(int i=1;i<=tot;i++)l[i] = r[i-1]+1,r[i] =i*len;for(int i=1;i<=tot;++i){for(int j=l[i];j<=r[i];++j)belong[j] = i;Sort(i);}
}inline void modify(int ql,int qr,int c){int p = belong[ql],q=belong[qr];if(p==q){for(int i=ql;i<=qr;++i)w[i]+=c;Sort(p);return;}for(int i=ql;i<=r[p];++i)w[i]+=c;for(int i=qr;i>=l[q];--i)w[i]+=c;Sort(p),Sort(q);for(int i=p+1;i<=q-1;++i)lz[i]+=c;// for(int i=p+1;i<=q-1;++i)Sort(i);}inline int query(int ql,int qr,ll c){int p =belong[ql],q = belong[qr];int res = 0;if(p==q){for(int i=ql;i<=qr;++i)if(w[i]+lz[p]<c)res++;return res;}for(int i=ql;i<=r[p];++i)if(w[i]+lz[p]<c)res++;for(int i=qr;i>=l[q];--i)if(w[i]+lz[q]<c)res++;for(int i=p+1;i<=q-1;++i)res+=lower_bound(b+l[i],b+r[i]+1,c-lz[i])-b-l[i];return res;}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;q=n;for(int i=1;i<=n;++i)cin>>w[i];init();while(q--){int op,c;cin>>op>>ql>>qr>>c;if(!op)modify(ql,qr,c);else cout<<query(ql,qr,c*c)<<"\n";}}

分块 + 二分 查询区间内某个数的前驱或者后驱

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6+10;
ll w[N],b[N],lz[N];
int l[N],r[N],belong[N];
int n,q,len,tot,ql,qr,op,c;inline void Sort(int k){for(int i=l[k];i<=r[k];++i)b[i] = w[i];sort(b+l[k],b+r[k]+1);
}inline void init()
{len = sqrt(n),tot = (n+len-1)/len;r[tot] = n;for(int i=1;i<=tot;i++)l[i] = r[i-1]+1,r[i] =i*len;for(int i=1;i<=tot;++i){for(int j=l[i];j<=r[i];++j)belong[j] = i;Sort(i);}
}inline void modify(int ql,int qr,int c){int p = belong[ql],q = belong[qr];if(p==q){for(int i=ql;i<=qr;++i)w[i]+=c;Sort(p);return;}for(int i=ql;i<=r[p];++i)w[i]+=c;for(int i=qr;i>=l[q];--i)w[i]+=c;for(int i=p+1;i<=q-1;i++)lz[i]+=c;Sort(p),Sort(q);}inline int query(int ql,int qr,int c){int p = belong[ql],q = belong[qr];ll res = -1e12;if(p==q){for(int i=ql;i<=qr;++i)if(w[i]+lz[p]<c)res = max(res,w[i]+lz[p]);if(res!=-1e12)return res;return -1;}for(int i=ql;i<=r[p];++i)if(w[i]+lz[p]<c)res = max(res,w[i]+lz[p]);for(int i=qr;i>=l[q];--i)if(w[i]+lz[q]<c)res = max(res,w[i]+lz[q]);for(int i=p+1;i<=q-1;++i){int  t = lower_bound(b+l[i],b+r[i]+1,c-lz[i])-b-l[i];if(t>=1)res = max(res,b[l[i]+t-1]+lz[i]);}if(res!=-1e12)return res;return -1;
}int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n;q = n;for(int i=1;i<=n;i++)cin>>w[i];init();while(q--){cin>>op>>ql>>qr>>c;if(!op)modify(ql,qr,c);else cout<<query(ql,qr,c)<<"\n";}
}


http://www.ppmy.cn/news/1260400.html

相关文章

Linux---逻辑卷管理

本章主要介绍逻辑卷的管理。 了解什么是逻辑卷创建和删除逻辑卷扩展逻辑卷缩小逻辑卷逻辑卷快照的使用 前面介绍了分区的使用&#xff0c;如果某个分区空间不够&#xff0c;想增加空间是非常困难的。所以&#xff0c;建议尽可能使用逻辑卷而非普通的分区&#xff0c;因为逻辑卷…

PPOCRv3检测模型和识别模型的训练和推理

PPOCRv3检测模型和识别模型的训练和推理 文章目录 PPOCRv3检测模型和识别模型的训练和推理前言一、环境安装1&#xff0c;官方推荐环境&#xff1a;2&#xff0c;本机GPU环境 二、Conda虚拟环境1.Win10安装Anaconda32.使用conda创建虚拟环境 三、安装PPOCR环境1&#xff0c;安装…

Golang实践录:读取toml配置

本文对 toml 文件进行解析。 下载 对于toml格式文件&#xff0c;golang 有很多库可以解释 yaml 文件&#xff0c;如toml、viper。由于 viper 可解析格式较多&#xff0c;本文采用该库。 toml语法规则 toml语法规则在官方中文文档上有说明&#xff0c;这里直接使用。 TOML 是…

【PID学习笔记 4 】控制系统基础之三

写在前面 上一篇以一个经典的水温调节系统为案例&#xff0c;学习怎样对一个实际的应用进行数学建模。本文重点介绍负反馈原理的概念、控制系统的组成与分类、控制系统的基本要求。 一、负反馈原理 将系统的输出信号引回输入端&#xff0c;与输入信号相比较&#xff0c;利用…

16个UI设计小规则,但是却能产生巨大影响

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 文章目录 1.使用空间对相关元素进行分组2.保持一致3.确保外观相似的元素功能相似4.创建清晰的视觉层次5.删除不必要的样式6.有目的地使用颜色7.确保界面元素的对比…

Python读写txt文件数据

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;如喜欢麻烦您点个&#x1f44d;或者点个⭐&#xff01; &#x1f…

2 文本分类入门:TextCNN

论文链接&#xff1a;https://arxiv.org/pdf/1408.5882.pdf TextCNN 是一种用于文本分类的卷积神经网络模型。它在卷积神经网络的基础上进行了一些修改&#xff0c;以适应文本数据的特点。 TextCNN 的主要思想是使用一维卷积层来提取文本中的局部特征&#xff0c;并通过池化操…

Day64.算法训练

47. 全排列 II class Solution {List<List<Integer>> result new ArrayList<>();List<Integer> path new ArrayList<Integer>();public List<List<Integer>> permuteUnique(int[] nums) {Arrays.sort(nums);boolean[] used new …