[luoguP2801] 教主的魔法(二分 + 分块)

传送门

 

以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的。

对于这个题,先分块,然后另开一个数组对于每个块内排序。

区间加的话,加一个标记,每一个整块区间加,里面的数的相对大小不变,而左右两边零散的块直接暴力重构。

查询可以对于每个块二分查找。

时间复杂度应该是 nlogn + Q√nlog√n,刚好卡过。。

 

注意:第10个点会被卡,手写二分比stl的lower_bound快一点,可以避免被卡。

   也可以在 S = sqrt(n) 后面 + x,x 不要太大也不要太小,不知道为什么,速度也会快点,玄学啊。

%%%有些dalao不知道怎么写的,1000ms

 

——代码(最终只能优化到1600ms)

  1 #include <cmath>
  2 #include <cstdio>
  3 #include <iostream>
  4 #include <algorithm>
  5 #define LL long long
  6 
  7 const int MAXN = 1000001;
  8 int n, q, S, C;
  9 int belong[MAXN], st[MAXN], ed[MAXN];
 10 LL a[MAXN], b[MAXN], add[MAXN];
 11 
 12 inline LL read()
 13 {
 14     LL x = 0, f = 1;
 15     char ch = getchar();
 16     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
 17     for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
 18     return x * f;
 19 }
 20 
 21 inline int find(int x, int y, int z)
 22 {
 23     int mid;
 24     while(x < y)
 25     {
 26         mid = (x + y) >> 1;
 27         if(b[mid] >= z) y = mid;
 28         else x = mid + 1;
 29     }
 30     return x;
 31 }
 32 
 33 inline void retreat(int x, int y)
 34 {
 35     int i;
 36     for(i = x; i <= y; i++) b[i] = a[i];
 37     std::sort(b + x, b + y + 1);
 38 }
 39 
 40 inline void init()
 41 {
 42     int i, j;
 43     S = int(sqrt(n)) + 10;
 44     for(i = 1; i <= n; i++) scanf("%d", &a[i]);
 45     for(i = 1; i <= n; i += S)
 46     {
 47         st[++C] = i;
 48         ed[C] = std::min(i + S - 1, n);
 49     }
 50     for(i = 1; i <= C; i++)
 51         for(j = st[i]; j <= ed[i]; j++)
 52             belong[j] = i;
 53     for(i = 1; i <= C; i++) retreat(st[i], ed[i]);
 54 }
 55 
 56 inline void update(int x, int y, LL z)
 57 {
 58     int i, l = belong[x], r = belong[y];
 59     if(l == r)
 60     {
 61         for(i = x; i <= y; i++) a[i] += z;
 62         retreat(st[l], ed[r]);
 63     }
 64     else
 65     {
 66         for(i = x; i <= ed[l]; i++) a[i] += z;
 67         for(i = l + 1; i <= r - 1; i++) add[i] += z;
 68         for(i = st[r]; i <= y; i++) a[i] += z;
 69         retreat(st[l], ed[l]);
 70         retreat(st[r], ed[r]);
 71     }
 72 }
 73 
 74 inline int query(int x, int y, LL z)
 75 {
 76     int i, l = belong[x], r = belong[y], ans = 0;
 77     if(l == r) return y + 1 - find(x, y + 1, z - add[l]);
 78     ans += ed[l] - find(x, ed[l] + 1, z - add[l]) + 1;
 79     for(i = l + 1; i <= r - 1; i++) ans += ed[i] - find(st[i], ed[i] + 1, z - add[i]) + 1;
 80     ans += y - find(st[r], y + 1, z - add[r]) + 1;
 81     return ans;
 82 }
 83 
 84 int main()
 85 {
 86     int i, j, x, y;
 87     LL z;
 88     char ch;
 89     n = read();
 90     q = read();
 91     init();
 92     for(i = 1; i <= q; i++)
 93     {
 94         while ((ch=getchar()) < 'A' || ch > 'Z');
 95         x = read();
 96         y = read();
 97         z = read();
 98         if(ch == 'M') update(x, y, z);
 99         else printf("%d\n", query(x, y, z));
100     }
101     return 0;
102 }
View Code

 

转载于:https://www.cnblogs.com/zhenghaotian/p/6823527.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统适配开发,捕获科技拟建立鸿蒙开发组 为区块链钱包客户适配鸿蒙系统做筹备...

遭遇美国“实体清单”封杀的第85天&#xff0c;华为“鸿蒙”横空出世&#xff01;8月9日下午&#xff0c;在华为全球开发者大会上&#xff0c;当余承东正式宣布鸿蒙系统(Harmony OS)发布的时候&#xff0c;全场掌声雷动&#xff01;世界上第一个由中国企业自主研发的全平台微内…

关于VCP(Virtual Com Port)拓展的调试经历(一)

* The Overview 前日&#xff0c;接到老板部署的任务&#xff0c;将现有的基于STM32L151与L432的LoRaWAN程序中添加USB CDC(Communication Device Class)功能&#xff0c;并枚举为VCP(Virtual Com Port)用以替代以往的串口打印。很疑惑为什么以前架构代码的时候没有添加进去。。…

三星s6 android 8.0,再见Android 8.0,三星s6全系列系统都停止了,第一代国王已经倒下了吗?...

对于Android用户而言&#xff0c;最令人兴奋的事情是系统更新&#xff0c;因为该更新意味着更流畅的体验和更加用户友好的功能. 但是&#xff0c;旧的三星S6并不是那么幸运&#xff0c;并且不再错过Android 8.0.三星s6的全系列指的是三星s6&#xff0c;三星s6 edge&#xff0c;…

Exchange 2010无法安装问题解决方法

当你在活动目录(AD)森林中安装多台全局编录服务器(GC)之后,默认情况下你会发现在AD站点里面自动生成二条站点连接,从上面的截图可以看到目前在AD森林的Default-First-Site-Name(默认站点)里面有6台GC。 从上面的截图可以看到目前只有一台叫做Sh-Site1GC(全局编录服务器)是处于运…

一加6android9玩飞车掉,解锁新速度:一加6T深度评测

解锁新速度&#xff1a;一加6T深度评测2019-11-02 14:28:595点赞2收藏4评论创作立场声明&#xff1a;我们只谈智能硬件&#xff0c;向改变生活的智能硬件Say“嗨”&#xff01;作为安卓旗舰机成员&#xff0c;一加这个品牌在玩机一类的同学手里可是大放光彩&#xff0c;各种刷机…

探讨跨域请求资源的几种方式

[转自&#xff1a;http://www.cnblogs.com/dojo-lzz/p/4265637.html] 什么是跨域JSONPproxy代理corsxdr由于浏览器同源策略&#xff0c;凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。具体可以查看下表&#xff08;来源&#xff09; JSONP 这种…

python处理excel文件(xls和xlsx)

一、xlrd和xlwt 使用之前需要需要先安装&#xff0c;windows上如果直接在cmd中运行python则需要先执行pip3 install xlrd和pip3 install xlwt&#xff0c;如果使用pycharm则需要在项目的解释器中安装这两个模块&#xff0c;File-Settings-Project:layout-Project Interpreter&a…

Mina、Netty、Twisted一起学(五):整合protobuf

protobuf是谷歌的Protocol Buffers的简称&#xff0c;用于结构化数据和字节码之间互相转换&#xff08;序列化、反序列化&#xff09;&#xff0c;一般应用于网络传输&#xff0c;可支持多种编程语言。protobuf怎样使用这里不再介绍&#xff0c;本文主要介绍在MINA、Netty、Twi…

2021年南宁二中高考成绩查询,2021广西高考圆满结束,6月23日可查询成绩

6月8日下午&#xff0c;2021年高考统考圆满结束。今年广西参加高考统考考生人数40.05万余人&#xff0c;比2020年增加了2.2万人。我区预计6月23日可查询高考成绩&#xff0c;6月24日起可陆续填报志愿&#xff0c;我区的网上咨询会将于6月25日至27日举办。▲高考结束&#xff0c…

29 Python - 字符与编码

字符与编码 01 字符串本质 Python字符串相关概念 字符串 str 字节 bytes 字节数组 bytearray 电脑字符串存储机制 字符库&#xff1a;A、B每个字符有一个代码点如A是65 B为66&#xff0c;这种是方便人类读写的形式&#xff0c;但是最终需要存入计算机的CPU和内存&…

WPF:从WPF Diagram Designer Part 4学习分组、对齐、排序、序列化和常用功能

在前面三篇文章中我们介绍了如何给图形设计器增加移动、选择、改变大小及面板、缩略图、框线选择和工具箱和连接等功能&#xff0c;本篇是这个图形设计器系列的最后一篇&#xff0c;将和大家一起来学习一下如何给图形设计器增加分组、对齐、排序、序列化等功能。 WPF Diagram D…

ASP.NET Core跨域设置

项目中经常会遇到跨域问题&#xff0c;解决方法&#xff1a; 在appsettings.json 文件中添加json项 {"Logging": {"LogLevel": {"Default": "Warning"}},"AllowedHosts": "*","AppCores": "https…

CSS设计指南(读书笔记 - 背景)

本文转自william_xu 51CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/williamx/1140006&#xff0c;如需转载请自行联系原作者

火车头如何才能设置发布的时候,如果是有html代码就直接的转换掉,互联网上笑话抽取及排重---火车头采集器的使用和MD5算法的应用...

10011311341 吕涛、10011311356李红目的&#xff1a;通过熟悉使用火车头采集器&#xff0c;在网络上采取3万条笑话并进行排重&#xff0c;以此来熟悉web文本挖掘的一些知识。过程&#xff1a;本次学习&#xff0c;主要分成两个部分。第一部分是笑话文本的采集&#xff0c;第二部…

win10上面安装win7的虚拟机怎么相互ping通

最近干了一些很蛋疼的事&#xff0c;这些都是自己踩过的坑&#xff0c;记录下来方便自己以后查阅 首先我的目的就是为了在自己的PC机上面部署一个SVN服务器&#xff0c;然后安装一个客户端&#xff0c;自己写的软件就可以定期入库&#xff0c;做好自己的版本控制&#xff0c;但…

win10用计算机名访问文件夹,win10系统提示你当前无权访问该文件夹的解决方法【图文教程】...

Win10系统下&#xff0c;我们在访问或更改某些系统文件夹时&#xff0c;有时会遇到系统提示“你当前无权访问该文件夹”的情况。那么&#xff0c;遇到这种情况的话&#xff0c;我们该怎么办呢&#xff1f;接下来&#xff0c;小编就向大家分享win10系统提示“你当前无权访问该文…

.Net Micro Framework研究—实现SideShow窗体界面

基于MF系统的Windows SideShow界面是非常炫的&#xff08;如下图&#xff09;。既然微软能用.Net Micro Framework实现这么棒的界面效果&#xff0c;我想我们也能做到。 &#xff08;SideShow模拟器界面和游戏程序中的右键菜单—注意菜单弹出后&#xff0c;其它的界面变暗了&am…

2017年读书计划(一)

前言 这篇博文就暂时不记录技术了&#xff0c;记录下生活。对自己今年2017年做个读书计划安排。 最近在看一部网络剧 - 《花间提壶方大厨》&#xff0c;也许你们会感觉我很无聊&#xff0c;我也是被头条带坏了&#xff0c;每天上班一个小时的地下交通-地铁&#xff0c;就借助上…

音标

音标 oror ds念子音&#xff0c;ts念s音

数据结构与算法---查找算法(Search Algorithm)

查找算法介绍 在java中&#xff0c;我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找斐波那契查找1)线性查找算法 示例&#xff1a; 有一个数列&#xff1a; {1,8, 10, 89, 1000, 1234} &#xff0c;判断数列中是否包含此名称【顺序查找】 要求: 如果找到了&a…