正解:分块

解题报告:

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

不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢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. hibernate sqlite jdbctemplate 待研究

    http://my.oschina.net/lldy/blog/39058                                   hibernate sqlite http://foru ...

  2. Python查找文件

    1. 利用字符串的前缀和后缀匹配查找文件 str.startswith() star.endswith() 2.使用fnmatch fnmatch              判断文件名是否符合特定模式 ...

  3. Python对文件和文件路径的管理

    1. 使用os.path进行路径和文件管理 1.1 拆分路径 os.path.split                   返回一个二元组,包含文件路径和文件名 os.path.dirname    ...

  4. 中文解码Unicode

    package com.j1.search.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder ...

  5. 微信公众号access_token的获取与存储

    如果是一个用户触发,那么只要将access_token放在数据库,文件,nosql就行,取时判断时间是否过期,过期重新去微信获取再放入. 如果是很多用户,多进程并发,特别是分布式那种架构呢?进程A判断 ...

  6. Use Reentrant Functions for Safer Signal Handling(译:使用可重入函数进行更安全的信号处理)

    Use Reentrant Functions for Safer Signal Handling 使用可重入函数进行更安全的信号处理 How and when to employ reentranc ...

  7. 【HIbernate异常】could not initialize proxy - no Session (已解决)

    异常信息: org.hibernate.LazyInitializationException: could not initialize proxy - no Session 解决方法: 用 get ...

  8. 关于android性能,内存优化

    转:http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost& ...

  9. Android Studio 3.0.1 版本包下载

    Android Studio 3.0.1 发布了,这是对 Android Studio 3.0 的一个小的更新,包括一般错误修复和性能改进 下载地址: Windows 64 位:https://dl. ...

  10. mysql索引覆盖之innodb和myisam效率问题

    问题: create table A (    id varchar(64) primary key,    ver int,    ... ) 我的表有几个很长的字段varchar(3000) 在i ...