[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;世界上第一个由中国企业自主研发的全平台微内…

[arm驱动]linux内核中断编程

第一部分获取中断(开启硬件中断)一、中断的申请注销: 1&#xff09;中断的申请 12int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) 2)中断的注销 1void free_irq(unsigned int irq, void *dev_id) 3&am…

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

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

leetcode701. 二叉搜索树中的插入操作(dfs)

给定二叉搜索树&#xff08;BST&#xff09;的根节点和要插入树中的值&#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证&#xff0c;新值和原始二叉搜索树中的任意节点值都不同。注意&#xff0c;可能存在多种有效的插入方式&#xff0c;只要树在…

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

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

devise tree_Devise如何确保您的Rails应用密码安全

devise treeby Tiago Alves由蒂亚戈阿尔维斯(Tiago Alves) Devise如何确保您的Rails应用密码安全 (How Devise keeps your Rails app passwords safe) Devise is an incredible authentication solution for Rails with more than 40 million downloads. However, since it ab…

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

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

android edittext 不滚动,EditText 设置可以垂直滑动但是不可输入

一、前言&#xff1a;android:id"id/edtInput"android:layout_width"match_parent"android:layout_height"60dp"android:background"drawable/round_theme_3_gray"android:gravity"top"android:hint"string/please_inp…

snmpd修改端口

http://blog.csdn.net/cau99/article/details/5077239 http://blog.csdn.net/gua___gua/article/details/48547701转载于:https://www.cnblogs.com/diyunpeng/p/6829592.html

leetcode LCP 19. 秋叶收藏集(dp)

小扣出去秋游&#xff0c;途中收集了一些红叶和黄叶&#xff0c;他利用这些叶子初步整理了一份秋叶收藏集 leaves&#xff0c; 字符串 leaves 仅包含小写字符 r 和 y&#xff0c; 其中字符 r 表示一片红叶&#xff0c;字符 y 表示一片黄叶。 出于美观整齐的考虑&#xff0c;小扣…

步进电机 步距角 编码器_我如何迈出了学习编码的第一步

步进电机 步距角 编码器A couple of months ago, I was chatting to a developer at work about how I’ve always wanted to learn to code but never tried.几个月前&#xff0c;我正在与一个开发人员聊天&#xff0c;讨论我一直想学习编码但从未尝试过的方法。 Coding alwa…

第五章:配置使用FastJson返回Json视图

fastJson是阿里巴巴旗下的一个开源项目之一&#xff0c;顾名思义它专门用来做快速操作Json的序列化与反序列化的组件。它是目前json解析最快的开源组件没有之一&#xff01;在这之前jaskJson是命名为快速操作json的工具&#xff0c;而当阿里巴巴的fastJson诞生后jaskjson就消声…

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

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

设计模式(第十七式:迭代器模式)

概念&#xff1a;  迭代器模式&#xff1a;Provide a way to access the elements of an aggregarte object sequentiaally with exposing its underlying representation. 提供一种访问容器对象内每个元素的一种方式&#xff0c;并且不暴露对象的一些内部细节。实现&#xf…

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

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

算法训练营 重编码_编码训练营适合您吗?

算法训练营 重编码by Joanna Gaudyn乔安娜高登(Joanna Gaudyn) 编码训练营适合您吗&#xff1f; (Is a Coding Bootcamp something for you?) Coding bootcamps’ popularity is growing. It sounds like a perfect idea to fast-forward your career. But is it really some…

leetcode 771. 宝石与石头(set)

给定字符串J 代表石头中宝石的类型&#xff0c;和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型&#xff0c;你想知道你拥有的石头中有多少是宝石。 J 中的字母不重复&#xff0c;J 和 S中的所有字符都是字母。字母区分大小写&#xff0c;因此"a…

用ntdsutil命令中的restore object 更新版本号

备份域控建立好后&#xff0c;备份域信息&#xff0c;用目录还 原模式&#xff0c;还原域信息&#xff0c;用ntdsutil命令&#xff0c;中的 restore ob ject 更新版本号 本文转自9pc9com博客&#xff0c;原文链接&#xff1a; http://blog.51cto.com/215363/783334 如需…

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…

html块中的内容垂直居中,css如何设置行内元素与块级元素的内容垂直居中

首先我们先了解一下行内元素和块级元素行内元素(内联元素)&#xff1a;没有自己的独立空间&#xff0c;它是依附于其他块级元素存在的&#xff0c;空间大小依附于内容多少。行内元素没有度、宽度、内外边距等属性。块级元素&#xff1a;占据独立的空间&#xff0c;具有宽度&…