热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线段树练习1

题意n个数,m次操作,每次询问区间第k大,或者给区间加上一个数。$数据范围:1≤n,m≤10^5,1≤k≤10。$题解由于k很小,直接在线段树内维护,前k大

题意

n个数,m次操作,每次询问区间第k大,或者给区间加上一个数。

$数据范围:1 ≤ n,m ≤ 10^5 ,1 ≤ k ≤ 10。$

 

题解

由于k很小,直接在线段树内维护,前k大的数。

 

code

  1 #include
2 #include
3
4 #define lson l,m,rt<<1
5 #define rson m+1,r,rt<<1|1
6
7 #define N 100010
8 #define K 10
9
10 int n,m;
11 struct Tree {
12 int data[K];
13 Tree() {memset(data,0,sizeof(data));}
14 Tree operator + (const Tree &a) const {
15 Tree ret;
16 int p1 = 0,p2 = 0;
17 for (int i=0; ii)
18 if (data[p1] > a.data[p2]) ret.data[i] = data[p1++];
19 else ret.data[i] = a.data[p2++];
20 return ret;
21 }
22 }t[N<<2];
23 int a[N],tag[N<<2];
24
25 inline int read() {
26 int x = 0,f = 1;char ch = getchar();
27 for (; ch<'0'||ch>'9'; ch = getchar())
28 if (ch=='-') f = -1;
29 for (; ch>='0'&&ch<='9'; ch = getchar())
30 x = x*10+ch-'0';
31 return x*f;
32 }
33
34 inline void pushup(int rt) {
35 t[rt] = t[rt<<1] + t[rt<<1|1];
36 }
37 inline void pushdown(int rt) {
38 if (tag[rt]) {
39 tag[rt<<1] += tag[rt];
40 for (int i=0; ii)
41 if (t[rt<<1].data[i]) t[rt<<1].data[i] += tag[rt];//只加有的数字
42 tag[rt<<1|1] += tag[rt];
43 for (int i=0; ii)
44 if (t[rt<<1|1].data[i]) t[rt<<1|1].data[i] += tag[rt];
45 tag[rt] = 0;
46 }
47 }
48 void build(int l,int r,int rt) {
49 if (l==r) {
50 t[rt].data[0] = a[l];
51 return ;
52 }
53 int m = (l+r) >> 1;
54 build (lson);
55 build (rson);
56 pushup(rt);
57 }
58 void update(int l,int r,int rt,int L,int R,int c) {
59 if (L <= l && r <= R) {
60 tag[rt] += c;
61 for (int i=0; ii)
62 if (t[rt].data[i]) t[rt].data[i] += c;
63 return ;
64 }
65 pushdown(rt);
66 int m = (l+r) >> 1;
67 if (L <= m) update(lson,L,R,c);
68 if (R > m) update(rson,L,R,c);
69 pushup(rt);
70 }
71 Tree query(int l,int r,int rt,int L,int R) {
72 if (L <= l && r <= R) {
73 return t[rt];
74 }
75 pushdown(rt);
76 Tree ret;
77 int m = (l+r) >> 1;
78 if (L <= m) ret = ret + query(lson,L,R);
79 if (R > m) ret = ret + query(rson,L,R);
80 return ret ;
81 }
82 int main() {
83
84 int n = read(),m = read();
85 for (int i=1; i<=n; ++i) a[i] = read();
86 build(1,n,1);
87 Tree ans;
88 while (m--) {
89 int opt = read(),l = read(),r = read(),k = read();
90 if (opt==0) {
91 if (r-l+1 "-1");
92 else {
93 ans = query(1,n,1,l,r);
94 printf("%d\n",ans.data[k-1]);
95 }
96 }
97 else update(1,n,1,l,r,k);
98 }
99 return 0;
100 }

 

by zhx p106 无题


推荐阅读
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
author-avatar
Ailsa大宝贝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有