正解:分块

解题报告:

哇之前的坑还没填完就又写新博客?

不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样布星呢

好辣先放个传送门哦QAQ

然后就说说这题,其实在知道这题是个分块的情况下再去做就感觉,没有那么难?因为有个思考的方向了鸭qwq

昂那知道是分块之后就按照分块的套路想呗,只要想明白那两个操作怎么搞这题就差不多了嘛qwq

首先思考add?按照分块的套路显然是大端用个add小端暴力修改嘛,没太多难点什么的

关键在于aswer的回答?显然好像没有太多可以优化的地方.于是想到,二分搜索

然后二分显然是要排序的,这时候我们就差不多可以明白这个题目的套路了?先理一下

首先我们要确保每个块内部是有序的,这样对于每个A就可以二分查找辽

那在M时,如果是对整个块进行修改,就不会改变块内部元素的大小的相对位置,只用存到add里面辽,显然?

    如果是对小端进行修改就暴力修改然后排序一通

好滴那这题就完成辽?哇真实美好

好那放个代码就完美结束辣嘻嘻嘻

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rp(i,x,y) for(register ll i=x;i<=y;++i) const ll N=+,sqtN=+;
ll n,q,ht[N],bl[N],len,st[N],L[N],R[N],add[sqtN]; inline ll read()
{
char ch=getchar();ll x=;bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=getchar();
if(ch=='-')ch=getchar(),y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=getchar();
return y?x:-x;
}
inline char rdch()
{
char ch=getchar();
while(ch!='M' && ch!='A')ch=getchar();
return ch;
}
inline void update(int x){rp(i,L[x],R[x])ht[i]=st[i];sort(ht+L[x],ht+R[x]+);}
inline void ad()
{
ll l=read(),r=read(),w=read();
if(bl[l]==bl[r]){rp(i,l,r)st[i]+=w;update(bl[l]);return;}
rp(i,bl[l]+,bl[r]-)add[i]+=w;rp(i,l,R[bl[l]])st[i]+=w;rp(i,L[bl[r]],r)st[i]+=w;update(bl[l]);update(bl[r]);
}
inline ll fd(int x,int c)
{
int l=L[x],r=R[x],mid;
while(l<=r){ mid=(l+r)>>;if(ht[mid]<c)l=mid+;else r=mid-;}
return R[x]-l+;
}
inline ll qs()
{
ll l=read(),r=read(),c=read(),tmp=;
if(bl[l]==bl[r]){rp(i,l,r)if(st[i]+add[bl[i]]>=c)++tmppp;return tmppp;}
rp(i,l,R[bl[l]])if(st[i]+add[bl[i]]>=c)++tmppp;rp(i,L[bl[r]],r)if(st[i]+add[bl[i]]>=c)++tmppp;
rp(i,bl[l]+,bl[r]-){tmppp+=fd(i,c-add[i]);}
return tmppp;
} int main()
{
// freopen("jzdmf.in","r",stdin);
n=read();q=read();len=sqrt(n);rp(i,,n)st[i]=ht[i]=read(),bl[i]=(i-)/len+;
rp(i,,(n-)/len+)L[i]=(i-)*len+,R[i]=min(n,i*len),sort(ht+L[i],ht+R[i]+);
while(q--){char ch=rdch();if(ch=='M')ad();else printf("%lld\n",qs());}
return ;
}

洛谷P2801 教主的魔法 分块的更多相关文章

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

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

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

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

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

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

  4. 洛谷 P2801 教主的魔法

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

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

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

  6. [洛谷P2801]教主的魔法

    题目大意:有$n$个数,$q$个操作.两种操作: $M\;l\;r\;w:$把$[l,r]$所有数加上$w$ $A\;l\;r\;c:$查询$[l,r]$内大于等于$c$的元素的个数. 题解:分块,对 ...

  7. 洛谷 P2801 教主的魔法 题解

    题面 刚看到这道题的时候用了个树状数组优化前缀和差分的常数优化竟然AC了?(这数据也太水了吧~) 本人做的第一道分块题,调试了好久好久,最后竟然没想到二分上还会出错!(一定要注意)仅此纪念: #inc ...

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

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

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

    题目传送 长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作.修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少 ...

随机推荐

  1. javascript/css压缩工具---yuicompressor使用方法

    1. 下载 地址:https://github.com/yui/yuicompressor/downloads 2. 安装 yuicompressor是由java写成的一组jar文件,需要jdk环境支 ...

  2. Java枚举的小用法

    package com.lxc.wmb; public enum TestEnum { Success("200","成功!"), Faild("50 ...

  3. 六、K3 WISE 开发插件《直接SQL报表开发新手指导 - BOM成本报表》

    ======================== 目录: 1.直接SQL报表 ======================== 1.直接SQL报表 以BOM成本报表为例,在销售模块部署,需要购买[金蝶 ...

  4. C C++ 文件输入与输出

    C语言: 一 打开关闭文件 1 fopen函数 用于打开文件 FILE *fopen(char *filename, *type); fopen("c:\\ccdos\\clib" ...

  5. 关于ASP.NET和.NET的区别和联系

    对于一个新手,往往会被这些名字给搞蒙了,对不起(笨小孩我也被搞蒙过,见笑啦),这归根结底还是怪自己对知识掌握和了解的不够,废话不多,直接到主题. ASP.NET和.NET的区别和联系 .NET 一般所 ...

  6. ubuntu 14.04 LTS 右键菜单解压压缩包时出错

    先卸载rar sudo apt-get remove rar 再安装unrar sudo apt-get install unrar

  7. Elasticsearch学习之相关度评分TF&IDF

    relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...

  8. [转载]几个有趣的Linux命令

      本文给大家介绍几个有趣的Linux命令. 1. pv 命令 有时候我们在电影屏幕上看到一些字幕一个个匀速显示出来,像有人在边敲键盘,边显示一样.Linux上的pv命令可以实现这种效果. 默认情况下 ...

  9. jconsole连接远程Tomcat应用

    一.环境信息 远程tomcat:linux 64位 centos 7 上tomcat 8 本机:windows7 二.步骤 linux上,在tomcat安装目录的bin下,新建setenv.sh,内容 ...

  10. HDU 2199 Can you solve this equation(二分答案)

    Can you solve this equation? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...