传送门

$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 教主的魔法的更多相关文章

  1. P2801 教主的魔法(分块)

    P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...

  2. 洛谷 P2801 教主的魔法 解题报告

    P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...

  3. 洛谷——P2801 教主的魔法(线段树or分块)

    P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...

  4. P2801 教主的魔法 (线段树)

    题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...

  5. 洛谷P2801 教主的魔法 [分块,二分答案]

    题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...

  6. luogu P2801 教主的魔法

    题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...

  7. 洛谷 P2801 教主的魔法

    题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...

  8. BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3343  ||  https://www.luogu.org/problem/show?pid=280 ...

  9. P2801 教主的魔法(分块入门)

    两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...

  10. 洛谷P2801 教主的魔法 分块

    正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...

随机推荐

  1. 自制模仿apache访问日志文件格式的php日志类

    <?php // 访问日志写入类 @author 王伟 2011.12.14class Log{        //项目跟路径    private $root_path;        //日 ...

  2. 1-如何自己在eclipse上配置Andriod环境

    转载:http://blog.csdn.net/dr_neo/article/details/49870587 最新鲜最详细的Android SDK下载安装及配置教程 2015年11月16日 19:2 ...

  3. Python学习笔记_操作Excel

    Python 操作Exel,涉及下面几个库: 1.xlrd 读取Excel文件 2.xlwt 向Excel文件写入,并设置格式 3.xlutils 一组Excel高级操作工具,需要先安装xlrd和xl ...

  4. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

  5. Luogu 4784 [BalticOI 2016 Day2]城市

    斯坦纳树复习,我暑假的时候好像写过[JLOI2015]管道连接来着. 设$f_{i, s}$表示以$i$为根,$k$个重要点的连通状态为$s$,($0$代表没有连进最小生成树里面去,$1$代表连进了最 ...

  6. QGIS编译教程

    注意更新时间:Thursday November 02, 2017 1. Introduction 简介 This document is the original installation guid ...

  7. MongoDB整理笔记の性能监控

    方法一:Mongostat 此工具可以快速查看某组运行中的mongodb实例的统计信息,用法如下: [root@localhost bin]# ./mongostat insert query upd ...

  8. SharePoint Server 2013 Excel Web Access无法显示

    环境信息:SharePoint Server 2013 中文版,版本为15.0.4420.1017 Windows Server 2008 r2中文版 Sql Server 2012 问题描述:在Sh ...

  9. SICP练习1.6的解答

    cond和if有着同样的效果,为啥用cond实现的new-if不能用于一些函数? 我自己没想明白,在网上搜集了一下答案,部分解答觉得有道理,整理如下: 解答1: if和cond都是特定的求值顺序, 即 ...

  10. js作用域解析原理

    当代码进入到<script>标签或者在调用一个方法,那么就会进入作用域,在解析代码的时候就会做以下两件事情: ①去找var 和function关键字进行js预解析如果有var把值全部定义成 ...