P2801 教主的魔法

区间加法,区间查询

显然就是分块辣

维护一个按块排好序的数组。

每次修改依然是整块打标记,零散块暴力。蓝后对零散块重新排序。

询问时整块二分,零散块暴力就好辣

注意细节挺多和边界问题TAT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int Min(int a,int b){return a<b?a:b;}
void read(int &x){
static char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 1000005
int n,Len,m,a[N],b[N],add[];
inline int Bel(int x){return (x-)/Len+;}
void Add(int l,int r,int v){
register int i,p;
if(Bel(l)==Bel(r)){//注意l,r在同一块内,下同
p=Bel(l)*Len;
for(i=l;i<=r;++i) a[i]+=v;
for(i=p-Len+;i<=p;++i) b[i]=a[i];
sort(b+p-Len+,b+p);
return ;
}
p=Bel(l)*Len;
for(i=l;i<=p;++i) a[i]+=v;
for(i=p-Len+;i<=p;++i) b[i]=a[i];
sort(b+p-Len+,b+p);
for(i=Bel(l)+;i<Bel(r);++i) add[i]+=v;
p=(Bel(r)-)*Len+;
for(i=p;i<=r;++i) a[i]+=v;
for(i=Min(n,p+Len);i>=p;--i) b[i]=a[i];
sort(b+p,b+Min(n,p+Len));//注意最后一块右端不超过n
}
int Ask(int l,int r,int v){
register int i,p,re=;
if(Bel(l)==Bel(r)){
for(i=l;i<=r;++i) re+=(a[i]>=v-add[Bel(l)]);
return re;
}
p=Bel(l)*Len;
for(i=l;i<=p;++i) re+=(a[i]>=v-add[Bel(l)]);
for(i=Bel(l)+;i<Bel(r);++i){
int tmp=lower_bound(b+(i-)*Len+,b+i*Len,v-add[i])-b;
re+=i*Len-tmp+(b[tmp]>=v-add[i]);//如果整块都>v-add[i],注意lower_bound找到的tmp仍指向块的开头
}
p=(Bel(r)-)*Len+;
for(i=p;i<=r;++i) re+=(a[i]>=v-add[Bel(r)]);
return re;
}
int main(){
register int i;
char opt[]; int q1,q2,q3;
read(n);read(m); Len=sqrt(n);
for(i=;i<=n;++i) read(a[i]),b[i]=a[i];
for(i=;i+Len<=n;i+=Len) sort(b+i,b+i+Len);
sort(b+i,b+n+);
while(m--){
scanf("%s%d%d%d",opt,&q1,&q2,&q3);
if(opt[]=='M') Add(q1,q2,q3);
else if(opt[]=='A') printf("%d\n",Ask(q1,q2,q3));
}return ;
}

P2801 教主的魔法(分块)的更多相关文章

  1. 洛谷P2801 教主的魔法 [分块,二分答案]

    题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...

  2. P2801 教主的魔法(分块入门)

    两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...

  3. 洛谷P2801 教主的魔法 分块

    正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...

  4. P2801 教主的魔法 (分块)

    题目传送 长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作.修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少 ...

  5. 洛谷——P2801 教主的魔法(线段树or分块)

    P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...

  6. 洛谷 P2801 教主的魔法 解题报告

    P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...

  7. Luogu 2801 教主的魔法 | 分块模板题

    Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...

  8. BZOJ 3343: 教主的魔法(分块+二分查找)

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

  9. P2801 教主的魔法 (线段树)

    题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...

随机推荐

  1. 20-Python3 数据结构

    2018-11-30 15:45:55 ''' 列表 ''' # list.count(x): 返回x在列表中出现的次数 a1 = [1,123.25,333,333,456.5] print(a1. ...

  2. matplotlib画的图保存为emf格式

    在用matplotlib保存图片时,发现不能直接保存为emf格式.百度有人说要先另存为svg格式,再使用INKSCAPE软件转换成emf格式.我试了一下,发现还是不行,后来,发现先用matplotli ...

  3. Ubuntu中使用pip3报错

    使用pip3 出现以下错误: Traceback (most recent call last): File “/usr/bin/pip3”, line 9, in from pip import m ...

  4. UI界面之淡入淡出

    1.using UnityEngine; using System.Collections; using UnityEngine.UI; public class danrudanchu : Mono ...

  5. FutureTask demo

    package com.xinwei.order.entity; import java.util.concurrent.ExecutorService; import java.util.concu ...

  6. HighCharts插件学习(二)

    HighCharts属性 credits: {版权信息} data: {数据功能模块} drilldown: {钻取} exporting: {导出}   labels: {标签}   legend: ...

  7. asp.net GridView增加删除功能

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)    {        string id ...

  8. html5-样式表的使用-初步

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  9. CodeReview实践与总结

    CodeReview 是大型软件工程中公认的必不可少的保证工程质量的重要手段之一.但凡正规软件作战军团都是非常重视 CodeReview 的作用和意义的.那么,如何做好 CodeReview 呢?这里 ...

  10. 谈谈Groovy闭包

    A closure is a function with variables bound to a context or environment in which it executes. 概述 闭包 ...