【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: ...
随机推荐
- rhythmbox插件开发笔记3:安装 makefile && schema && po
本篇主要讲通过makefile方式来安装rhythmbox插件的相关知识. makefile 如果makefile是什么,请自行谷歌 参考了pandasunny同学的rhythmbox-baidu-m ...
- SG函数入门&&HDU 1848
SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...
- 01_4_Struts路径问题
01_4_Struts路径问题 1. Struts路径问题说明 struts2中的路径问题是根据action的路径而不是jsp路径来确定,所有尽量不要使用相对路径. 虽然可以使用redirect方式解 ...
- poj3335 Rotating Scoreboard
题目描述: vjudge POJ 题解: 半平面交判核的存在性. 重点在于一个点的核也算核. 这样的话普通的求多边形的版本就要加一个特判. 就是把剩下的一个节点暴力带回所有直线重判,这时判叉积是否$\ ...
- 【NOIP2017提高组模拟7.3】B
树上路径统计,点分治解决. 统计一段区间,naive地用了set解决,这样的复杂度是O(nlog^2n)的 考场代码出了个问题,统计答案时找到了之前的最优答案,但是没有加上新的一段,导致60分 #in ...
- (68)zabbix windows性能计数器使用详解
概述 windows下的性能计数器让zabbix监控更加轻松,直接获取性能计数器的数值即可完成windows监控.性能计数器如下: 1 perf_counter["\Processor( ...
- Springboot @Autowired 无法注入问题
特别提醒:一定要注意文件结构 WebappApplication 一定要在包的最外层,否则Spring无法对所有的类进行托管,会造成@Autowired 无法注入. 1. 添加工具类获取在 Sprin ...
- GOPATH和GOROOT
安装指定版本golang apt-get purge golang* //删除之前安装的文件 add-apt-repository ppa:evarlast/golang-1.8 apt-get up ...
- day24 01 初识继承
day24 01 初识继承 面向对象的三大特性:继承,多态,封装 一.继承的概念 继承:是一种创建新类的方式,新建的类可以继承一个或者多个父类,父类又可称基类或超类,新建的类称为派生类或者子类 cla ...
- jsp内置对象及其方法
JSP中一共预先定义了9个这样的对象,分别为: request. response. session. application. out. pagecontext. con ...