P2801 教主的魔法
$N$ 太大了主席树过不了
考虑分块
对每个块内的元素排序,询问就对大块二分查找,对两边小的部分暴力枚举
修改时维护 $add[i]$ 标记,维护当前块内整块已经加的数
那么整块的就直接修改 $add$ ,两边小的部分就把那两个的块暴力修改然后重新排序
然后注意一下边界就完了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=2e6+,M=2e3+,INF=1e9+;
int n,m;
int a[N];
int bel[N],L[M];//bel[i]存位置i所在的块,L[i]存第i个块的左端点
int blk[M][M],tmp[M],add[M];//blk就是分出来的块排序后的东西
inline void change(int l,int r,int k)//修改
{
if(bel[l]==bel[r])//要特判只有小块的情况
{
int tot=,be=bel[l];
for(int i=L[be];i<l;i++) tmp[++tot]=a[i];//把数直接扔到tmp里
for(int i=l;i<=r;i++) a[i]+=k,tmp[++tot]=a[i];//有修改要修改a[i]
for(int i=r+;i<L[be+];i++) tmp[++tot]=a[i];
sort(tmp+,tmp+tot+);
memcpy(blk[be],tmp,sizeof(tmp));//排序后扔给blk
}
int pl=bel[l-]+,pr=bel[r+]-,tot=;//找到整块
for(int i=pl;i<=pr;i++) add[i]+=k;
if(pl>bel[])//处理左边小块
{
for(int i=L[pl-];i<l;i++) tmp[++tot]=a[i];
for(int i=l;i<L[pl];i++) a[i]+=k,tmp[++tot]=a[i];
sort(tmp+,tmp+tot+);
memcpy(blk[pl-],tmp,sizeof(tmp));
}
if(pr<bel[n])//右边
{
for(int i=L[pr+];i<=r;i++) a[i]+=k,tmp[++tot]=a[i];
for(int i=r+;i<L[pr+];i++) tmp[++tot]=a[i];
sort(tmp+,tmp+tot+);
memcpy(blk[pr+],tmp,sizeof(tmp));
}
}
inline int query(int l,int r,int k)//处理询问
{
if(bel[l]==bel[r])//特判没有整块
{
int res=;
for(int i=l;i<=r;i++) if(a[i]>=k-add[bel[i]]) res++;
return res;
}
int pl=bel[l-]+,pr=bel[r+]-,res=;
for(int i=pl;i<=pr;i++)//对大块的二分
res+=(L[i+]-L[i]) -( lower_bound(blk[i]+ , blk[i]+(L[i+]-L[i])+ , k-add[i]) -blk[i])+;
for(int i=l;i<L[pl];i++) if(a[i]>=k-add[bel[i]]) res++;//剩下的暴力计算
for(int i=L[pr+];i<=r;i++) if(a[i]>=k-add[bel[i]]) res++;
return res;
}
int main()
{
n=read(),m=read(); int t=sqrt(n);
for(int i=;i<=n;i++)
{
bel[i]=(i-)/t+;
if(bel[i]!=bel[i-]) L[bel[i]]=i;
else L[bel[i]]=L[bel[i-]];
a[i]=read();
}
bel[n+]=bel[n]+; L[bel[n+]]=n+;//注意可能会访问到n+1
for(int i=;i<=bel[n];i++)//预处理blk
{
int tot=;
for(int j=L[i];j<L[i+];j++) tmp[++tot]=a[j];
sort(tmp+,tmp+tot+);
memcpy(blk[i],tmp,sizeof(tmp));
}
char s[]; int x,y,z;
while(m--)
{
scanf("%s",s); x=read(),y=read(),z=read();
if(s[]=='M') change(x,y,z);
else printf("%d\n",query(x,y,z));
}
return ;
}
P2801 教主的魔法的更多相关文章
- P2801 教主的魔法(分块)
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...
- 洛谷 P2801 教主的魔法 解题报告
P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...
- 洛谷——P2801 教主的魔法(线段树or分块)
P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...
- P2801 教主的魔法 (线段树)
题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- luogu P2801 教主的魔法
题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...
- 洛谷 P2801 教主的魔法
题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...
- BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法
http://www.lydsy.com/JudgeOnline/problem.php?id=3343 || https://www.luogu.org/problem/show?pid=280 ...
- P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...
- 洛谷P2801 教主的魔法 分块
正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...
随机推荐
- Eclipse导入tomcat服务器
创建server
- 基于rank的优化
------------------siwuxie095 基于 rank 的优化 基于 size 的优化,在大多数情况下 ...
- 使用Dom4j操作XML数据
--------------siwuxie095 dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 ...
- Visual Studio + C# + Xamarin = iOS/Android/Windows Apps
Visual Studio 跨平台開發實戰 (1) -- Hello Xamarin! 前言 應用程式發展的腳步,從來沒有停過.從早期的 Windows 應用程式, 到網路時代的 web 應用程式,再 ...
- 455. Assign Cookies 满足欲望 分配饼干
[抄题]: Assume you are an awesome parent and want to give your children some cookies. But, you should ...
- 13-爬取百度贴吧中的图片(python+xpath)
通过xpath分析页面,爬取页面中的图片: #_*_ coding: utf-8 _*_ ''' Created on 2018年7月15日 @author: sss function: 使用xpat ...
- 面试题:volatile关键字的作用、原理
在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例. 而发挥神奇作用的volatile,可以当之无愧的被称为Java ...
- Django--登录实例
1.准备工作 创建必要的目录和文件,导入js,css,bootstrap等,目录结构如下: 2.配置文件添加static路径 settings.py 1 2 3 4 STATIC_URL = '/st ...
- MagicNotes:突破来自外界的脑力压制
MagicNotes,思绪随风飞扬,偶尔在这里停留. 在前面的<MagicNotes:如何迈向工作的坦途>里面,我们提到了在工作中应该发挥好个人的主观能动性,简单来说就是要学会主动出击.但 ...
- 一步一步带你构建第一个 Laravel 项目
参考链接:https://laravel-news.com/your-first-laravel-application 简介 按照以下的步骤,你会创建一个简易的链接分享网站. 安装 Laravel ...