洛谷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大于等于的数有多少 ...
随机推荐
- RF失败案例重跑
1.1 失败案例重跑 该功能主要是针对上次连跑失败的案例需要重新执行测试的情况,可自动识别上次执行失败的案例并进行重跑,无需手动选择相应的案例,简单高效. 1.5.1. 重 ...
- 计算直线与WGS84椭球的交点
/************************************************************************/ /*线段与WGS84椭球求交 x^2/a^2+y^ ...
- session会话保持
#coding=utf-8 from flask import Flask from flask import request from flask import redirect from flas ...
- 使用IEDA新建jsp项目以后使用javax.servlet.*报错
新建一个jsp项目,然后再里面配置完了一切写了一个servlet的文件: 点击运行的时候出现了javax程序包不存在的错误,百度了许多都在说是tomcat的事情,吧tomcat/lib下面的servl ...
- iOS应用内支付(IAP)的那些坑
本文转载至 http://blog.devtang.com/2013/04/07/tricks-in-iap/ 前言 udacity 中的在线课程 <How to build a startup ...
- 【Spring系列】Spring IoC
前言 IoC其实有两种方式,一种是DI,而另一种是DL,即Dependency Lookup(依赖查找),前者是当前软件实体被动接受其依赖的其他组件被IOc容器注入,而后者是当前软件实体主动去某个服务 ...
- C# EF中调用 存储过程并调回参数
TourEntities db = new TourEntities(); List<v_product> v = new List<v_product>(); SqlPara ...
- 问题记录,如何解决confluence的office预览的时候的乱码问题
在新的服务器(ubuntu16.04)上安装confluence,预览office的附件的时候,发现中文无法正确显示 在网上搜了一下,搜到一篇官方的文档,是关于这个问题的 问题原因: 在服务器上没有安 ...
- 【咸鱼教程】一个简单的弹出二级菜单UIPopupMenu
一. 实际效果 演示地址 二.实现原理主要用Button+List组件,和遮罩实现. 1. 点击Button时,将List下移展开.2. 再次点击Button,或者选中List中的某一项时,将List ...
- 在pycharm中运行nose测试框架
之前一直在pydev上或命令行上运行nosetests. pycharm上如果运行nosetests,在看了管网后,总结果如下: 全新的pycharm: 填加完成后,打开你要的脚本,运行,即可以以no ...