题目

题目链接

题意

  • 修改:将一个区间内所有的数+C。
  • 查询:查询一个区间内>C的数字有多少个。

题解

很经典的分快算法题目。
将数列分块以后,对块内的元素进行排序。

  • 当我们要做修改操作的时候:遇到要修改的完整的块的时候,我们给它在addmark数组的相应的位置+C,标记为我对整个区间做了一个修改操作,有点类似于带lazy标记的线段树的操作。当要修改的部分区间不是完整的块的时候,我们检查这部分区间所在的块的addmark有没有被标记,如果有就对这个块整个进行更新操作,然后把addmark清零,并且暴力把这部分区间的元素+C。时间复杂度为O(n‾√+n‾√∗logn‾√))O(n+n∗logn))O(\sqrt{n} + \sqrt{n}*log\sqrt{n}))。
  • 当我们遇到查询操作的时候:当我们要查询的部分区间不属于完整的块的时候,如果块的addmark被标记过了,那么更新这个块,然后再暴力查询这个“部分区间”。当我们要查询的区间属于完整的块的时候,由于这个区间是有序的,我们只需要使用二分搜索结合addmark,就可以确定出该块内>C的元素有多少个。时间复杂度O(n‾√+n‾√∗logn‾√))O(n+n∗logn))O(\sqrt{n} + \sqrt{n}*log\sqrt{n}))。

因此总的时间复杂度就是:O((n‾√+n‾√∗logn‾√)∗m)O((n+n∗logn)∗m)O((\sqrt{n} + \sqrt{n}*log\sqrt{n})*m)

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
#define pr(x) cout<<#x<<":"<<x<<endl
int Base = 1000;
ll a[1000007],addmark[1007],C;
int n,q,L,R;
char op;
vector<ll> vec[1007];inline void read(ll &x){scanf("%lld",&x);
}inline void read(int &x){scanf("%d",&x);
}inline void read(char &c){scanf(" %c",&c);
}void work(int bl){if(addmark[bl]){for(int t = bl*Base;t < (bl+1)*Base && t < n;++t){a[t] += addmark[bl];}for(auto &i : vec[bl]){i += addmark[bl];}addmark[bl] = 0;}
}void buildvec(int bl){vec[bl].clear();for(int t = bl*Base;t < (bl+1)*Base && t < n;++t){vec[bl].push_back(a[t]);}sort(vec[bl].begin(),vec[bl].end());
}int main(){scanf("%d%d",&n,&q);for(int i = 0;i < n;++i){int bl = i/Base;read(a[i]);vec[bl].push_back(a[i]);if((i+1)%Base == 0 || i == n-1){sort(vec[bl].begin(),vec[bl].end());}}for(int i = 0;i < q;++i){read(op);read(L);read(R);read(C);L--;R--;ll rep = 0;if(op == 'A'){if(L % Base != 0 && addmark[L/Base]) {work(L / Base);}if((R+1)%Base != 0 && addmark[R/Base]){work(R / Base);}int ans = 0;for(;L <= R && L % Base != 0;L++){ans += a[L] >= C;}for(;L <= R && (R+1)%Base != 0;R--){ans += a[R] >= C;}if(L > R){printf("%d\n",ans);continue;}int bl = L / Base;int br = R / Base;for(;bl <= br;++bl){auto loc = lower_bound(vec[bl].begin(),vec[bl].end(),C-addmark[bl]);int ad = vec[bl].size() - (loc - vec[bl].begin());ans += max(0,ad);}printf("%d\n",ans);}else{int bl,br;if(L % Base != 0){work(L / Base);bl = L / Base;for(;L <= R && L % Base != 0;++L){a[L] += C;//pr(L);//pr(a[L]);}buildvec(bl);}if((R+1) % Base != 0){work(R / Base);br = R / Base;for(;L <= R && (R+1) % Base != 0;--R)a[R] += C;buildvec(br);}if(L < R){bl = L / Base;br = R / Base;for(;bl <= br;++bl){addmark[bl] += C;}}}}return 0;
}

洛谷-P2801 教主的魔法 分块相关推荐

  1. BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3343  ||  https://www.luogu.org/problem/show?pid=280 ...

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

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

  3. luogu P2801 教主的魔法

    luogu P2801 教主的魔法 谜之分块 初学分块,找题练练手 大概分块示意图: 分块大法好! std: #include<bits/stdc++.h> using namespace ...

  4. 洛谷P1133 教主的花园 动态规划

    洛谷P1133 教主的花园 动态规划 这里是环状的,但是我们并不用将他破环成链 只要枚举第一个点 根据第一个点选择最后一个选择什么就行了 然后我们进行DP 注意如果当前是 2 的话要分情况 上一次是上 ...

  5. 【题解】洛谷P4168 [Violet]蒲公英 (分块)

    [题解]洛谷P4168 [Violet]蒲公英 (分块)     D e s c r i p t i o n \rm Description Description 我们把所有的蒲公英看成一个长度为 ...

  6. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  7. P2801 教主的魔法

    算是分块第一题了吧,抄题解过的. 简化版的题意:给你n个数的序列,支持区间加的修改,同时支持查询区间内大于等于w的数字的多少. 分块题的基本标志就是:xjb查询,普通修改.(来自qsc大佬的一句话) ...

  8. 洛谷P2483 Bzoj1975 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  9. 洛谷-P3203 弹飞绵羊 分块

    题目 题目链接 题意 据说这道题要用一道叫做LCT的数据结构,然而我不会... 一排有n个弹簧装置,从第iii个可一往后跳k[i]" role="presentation" ...

最新文章

  1. redis实现对账(集合比较)功能
  2. java读取本地文件下载_java 读取本地的json文件
  3. 5G是卡位未来的重要基础设施 物联网已成为新的攻击入口
  4. python 文件分割 按大小_python处理分隔大文件
  5. Android Studio导出jar包
  6. (pytorch-深度学习系列)简单实现kaggle房价预测-学习笔记
  7. 【华为云技术分享】智能诊断和优化,华为云DAS服务云DBA平台让您无忧运维
  8. ie浏览器样式兼容写法_IE浏览器兼容问题-----html和css的兼容写法
  9. C#部分类与部分方法
  10. 数据科学包8-pandas高级内容之聚合统计
  11. 正反转信号判别原理以及数字鉴相器原理
  12. 基于 RFID 与 ZigBee 智能汽车装配生产线车模追溯系统设计
  13. web页面设计实训——03.12
  14. 快速实现ML302 GPS+4G发送定位信息详解
  15. HAUT校赛 魔法宝石 暴力
  16. 控制系统的复域数学模型
  17. 2016微软校招笔试题
  18. 打鸟Style 经典游戏再现
  19. python--摄氏温度和华氏温度的互相转换
  20. 阿里工业互联网平台白皮书 – 数据驱动的新价值网络 - 0910.zip阿里工业互联网平台白皮书 – 数据驱动的新价值网络 -

热门文章

  1. python统计字符串中字母个数字母无视大小写_判断一个字符串中字母的个数(无视大小写)...
  2. python rsa加密二进制文件_用Python中的RSA加密文件
  3. thinkpad笔记本散热风扇_十代酷睿笔记本低至2999元 你可以入手了_笔记本新闻
  4. ai的预览模式切换_AI字体制作,用AI制作创意阶梯式文字
  5. 35. 搜索插入位置011(二分查找)
  6. 图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)
  7. C++实现具有[数组]相似特征的类DoubleSubscriptArray
  8. 对象的单数组表示(用单数组实现链表-不一样的链表实现)
  9. Honest Coach CodeForces - 1360B(简单贪心)
  10. 计算机组成原理期末复习往年卷子