洛谷P2801 教主的魔法 分块
正解:分块
解题报告:
哇之前的坑还没填完就又写新博客?
不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢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 教主的魔法 分块的更多相关文章
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- 洛谷——P2801 教主的魔法(线段树or分块)
P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...
- 洛谷 P2801 教主的魔法 解题报告
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]教主的魔法
题目大意:有$n$个数,$q$个操作.两种操作: $M\;l\;r\;w:$把$[l,r]$所有数加上$w$ $A\;l\;r\;c:$查询$[l,r]$内大于等于$c$的元素的个数. 题解:分块,对 ...
- 洛谷 P2801 教主的魔法 题解
题面 刚看到这道题的时候用了个树状数组优化前缀和差分的常数优化竟然AC了?(这数据也太水了吧~) 本人做的第一道分块题,调试了好久好久,最后竟然没想到二分上还会出错!(一定要注意)仅此纪念: #inc ...
- P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...
- P2801 教主的魔法 (分块)
题目传送 长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作.修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少 ...
随机推荐
- Django SimpleCMDB WSGI
一.WSGI 介绍 (1) 在前面的学习中,我们是通过 python manage.py runserver 0.0.0.0:8000 来启动并访问开发服务器的:(2) 但在实际中我们是通过直接访问 ...
- Github上star数超1000的Android列表控件
Android开发中,列表估计是最最常使用到的控件之一了.列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FAB等等都是十分常见的体验.Github中 ...
- 获取访客IP、地区位置信息、浏览器、来源页面
<?php //这个类似用来获取访客信息的 //方便统计 class visitorInfo { //获取访客ip public function getIp() { $ip=false; if ...
- echarts - 特殊需求实现方案汇总
五分钟上手echarts echarts中 设置x||y轴文案.提示文字等为固定字数,超出显示"..." 关于echarts下钻功能的一些总结.js echarts - 特殊需求实 ...
- SpringBoot学习之Helloworld
1. 如果使用Spring开发一个"HelloWorld"的web应用 创建一个web项目并且导入相关jar包.SpringMVC Servlet 创建一个web.xml 编写一个 ...
- mint下截图工具shutter的安装和使用设置
[原创作品,技术交流.允许转载,转载时请务必以超链接形式标明文章原始出处 .作者信息.如有错误,请指正] /** author: lihaibo date: 1/25/2016 */ 今天安装了双系统 ...
- JVM工具jcmd实践
暂时参考以下链接,后续补充自己的实践. https://www.jianshu.com/p/388e35d8a09b
- JVM工具jinfo实践
一.jinfo命令格式 命令格式: jinfo [option] <pid> Usage: jinfo [option] <pid> (to connect to runnin ...
- 一个不错的工具推荐:JMeter
在开发中可能会遇到一些场景需要对程序的性能,并发能力等进行度量,就是对一些程序的性能进行度量,生成一些报告等,最近遇到了一个不错的工具 apache JMeter,它是用java的swing开发的,功 ...
- GDI+绘制半圆按钮
新建一个用户控件: public partial class UserControl1 : UserControl { public UserControl1() { InitializeCompon ...