【Luogu】P2801教主的魔法(分块)
激动qwq。这是我A的第一道分块。
分块之后对块内元素暴力sort。修改的时候对于整块打个标记,查询的时候只需要查C-tag就行了
对于非整块,暴力修改,改完之后sort
对于查询……非整块暴力查询,整块二分C-tag的位置就好啦
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define maxn 1000010
#define sqtn 1200
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Node{
int dat,id;
bool operator <(const Node a)const{
return dat<a.dat;
}
}; struct Block{
Node q[sqtn];
int tag,tot;
Block(){memset(q,,sizeof(q)); tag=tot=; }
}que[sqtn];
int d[maxn];
int s[maxn];
int w[maxn];
int le[sqtn],ri[sqtn]; void sorten(int x){
Block &o=que[x];
sort(o.q+,o.q+o.tot+);
for(int i=;i<=o.tot;++i){
w[o.q[i].id]=i;
}
} int main(){
int n=read(),m=read();
int sqt=sqrt(n),blo=;
for(int i=;i<=n;++i){
d[i]=read();
s[i]=(i-)/sqt+;
if(s[i]>blo) blo=s[i];
ri[s[i]]=i;
}
for(int i=n;i>=;--i){
le[s[i]]=i;
que[s[i]].q[++que[s[i]].tot]=(Node){d[i],i};
}
for(int i=;i<=blo;++i) sorten(i);
for(int i=;i<=m;++i){
char c[];int x,y,z;
scanf("%s%d%d%d",c,&x,&y,&z);
if(c[]=='M'){
int to=min(ri[s[x]],y);
for(int j=x;j<=to;++j) que[s[x]].q[w[j]].dat+=z;
sorten(s[x]);
if(s[x]==s[y]) continue;
int from=max(le[s[y]],x);
for(int j=from;j<=y;++j) que[s[y]].q[w[j]].dat+=z;
sorten(s[y]);
for(int j=s[x]+;j<s[y];++j) que[j].tag+=z;
}
else if(c[]=='A'){
int to=min(ri[s[x]],y),ans=;
for(int j=x;j<=to;++j)
if(que[s[x]].q[w[j]].dat>=z) ans++;
if(s[x]==s[y]){
printf("%d\n",ans);
continue;
}
int from=max(le[s[y]],x);
for(int j=from;j<=y;++j){
//printf("%d\n",que[s[y]].q[w[j]].dat);
if(que[s[y]].q[w[j]].dat>=z) ans++;
}
for(int j=s[x]+;j<s[y];++j){
Block now=que[j];
int l=,r=now.tot,lim=r+;
while(l<=r){
int mid=(l+r)>>;
if(now.q[mid].dat>=z-now.tag){
lim=mid;
r=mid-;
}
else l=mid+;
}
ans+=now.tot-lim+;
}
printf("%d\n",ans);
}
}
return ;
}
/*
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
*/
【Luogu】P2801教主的魔法(分块)的更多相关文章
- Luogu 2801 教主的魔法 | 分块模板题
Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- luogu P2801 教主的魔法
题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...
- P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...
- 洛谷P2801 教主的魔法 分块
正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...
- P2801 教主的魔法 (分块)
题目传送 长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作.修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少 ...
- P2801 教主的魔法(分块)
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...
- 洛谷——P2801 教主的魔法(线段树or分块)
P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...
- 洛谷 P2801 教主的魔法 解题报告
P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
随机推荐
- 微软分布式机器学习工具包DMTK——初窥门径
在现在机器学习如日中天的大背景下,微软亚洲研究院的实习岗位中,机器学习组的工作也是维护DMTK,参与算法改进,那么在此之前我们得了解DMTK是个啥. DMTK由一个服务于分布式机器学习的框架和一组分布 ...
- ucos-ii核心算法分析(转)
μC/OS-Ⅱ是一种免费公开源代码.结构小巧.具有可剥夺实时内核的实时操作系统.其 内核提供任务调度与管理.时间管理.任务间同步与通信.内存管理和中断服务等功能.适合小型控制系统,具有执行效率高.占用 ...
- Android(java)学习笔记112:Activity中的onCreate()方法分析
1.onCreate( )方法是android应用程序中最常见的方法之一: 翻译过来就是说,onCreate()函数是在activity初始化的时候调用的,通常情况下,我们需要在onCreate()中 ...
- Android(java)学习笔记136:利用谷歌API对数据库增删改查(推荐使用)
接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1. 首先项目图: 2. 这里的布局文件activity_main.xml: <LinearLayout xmlns:andro ...
- 多线程程序设计-Thread的一些方法
run():是程序中会和会和其他线程“同时”执行的部分. wait():使得当前线程进入等待状态,等待的线程不会主动进入到线程队列中排队等待cpu资源,必须由其他线程调用notify()方法通知它 ...
- Vue中使用computed与watch结合实现数据变化监听
目的:当数据变化时,为其中重要数据增加边框,实现闪烁以达到提醒目的.数据格式如下,只有在未处理火警/故障时增加闪烁边框.可以使用watch进行深度监听.数据格式已定,也非常明确要监听的数据是有两个.既 ...
- 【转】OS X 中快速调出终端
作者:Frank Pu链接:https://www.zhihu.com/question/20692634/answer/37152883来源:知乎著作权归作者所有,转载请联系作者获得授权. 来至 M ...
- java8关于LocalDate,Date
关于java8中的新的时间日期类 public static void main(String[] args) { Date date = new Date(); LocalDate localDat ...
- 在Vue将第三方JS库封装为组件使用
第三方JS库地址:https://github.com/inorganik/CountUp.js 使用NPM进行安装: npm install --save countup 根据官方回答,CountU ...
- 状态压缩dp 状压dp 详解
说到状压dp,一般和二进制少不了关系(还常和博弈论结合起来考,这个坑我挖了还没填qwq),二进制是个好东西啊,所以二进制的各种运算是前置知识,不了解的话走下面链接进百度百科 https://baike ...