sum

经典算法题每日演练——第十二题 线段树

无人久伴 提交于 2020-04-02 21:44:21
这一篇我们来看树状数组的加强版线段树,树状数组能玩的线段树一样可以玩,而且能玩的更好,他们在区间求和,最大,平均 等经典的RMQ问题上有着对数时间的优越表现。 一:线段树 线段树又称"区间树”,在每个节点上保存一个区间,当然区间的划分采用折半的思想,叶子节点只保存一个值,也叫单元节点,所 以最终的构造就是一个平衡的二叉树,拥有CURD的O(lgN)的时间。 从图中我们可以清楚的看到[0-10]被划分成线段的在树中的分布情况,针对区间[0-N],最多有2N个节点,由于是平衡二叉树的形 式也可以像堆那样用数组来玩,不过更加耗费空间,为最多4N个节点,在针对RMQ的问题上,我们常常在每个节点上增加一些sum, max,min等变量来记录求得的累加值,当然你可以理解成动态规划的思想,由于拥有logN的时间,所以在RMQ问题上比数组更加优美。 二:代码 1:在节点中定义一些附加值,方便我们处理RMQ问题。 1 #region 线段树的节点 2 /// <summary> 3 /// 线段树的节点 4 /// </summary> 5 public class Node 6 { 7 /// <summary> 8 /// 区间左端点 9 /// </summary> 10 public int left; 11 12 /// <summary> 13 /// 区间右端点 14 /// <

union 横向组合

浪尽此生 提交于 2020-04-01 05:36:03
select sum(zs) zs,sum(zl) zl,sum(ts) ts,sum(lxcbw) lxcbw,sum(bz) bz,sum(sfzqt) sfzqt from ( select count(distinct sqh) zs,0 zl,0 ts,0 lxcbw,0 bz,0 sfzqt from **** where pici = '673' and chuandate = '20190701' union all select 0 zs,count( sqh) zl,0 ts,0 lxcbw,0 bz,0 sfzqt from ***** where sqh in( select sqh from ywbl_scyyw_chuan where pici = '673' and chuandate = '20190701') union all select 0 zs,0 zl,count( sqh) ts,0 lxcbw,0 bz,0 sfzqt from **** where sqh in( select sqh from ywbl_scyyw_chuan where pici = '673' and chuandate = '20190701') union all select 0 zs,0 zl,0 ts,count( sqh) lxcbw,0 bz,0

【扫描线】HDU 5124 lines

我的未来我决定 提交于 2020-03-30 11:14:42
http://acm.hdu.edu.cn/showproblem.php?pid=5124 【题意】 在数轴x上,每次操作都覆盖一个区间的所有点,问被覆盖次数最多的点是覆盖了多少次 【思路】 最简单的扫描线,左右端点分别排序,遇到左端点sum++更新最值,遇到右端点sun--更新最值 【Accepted】 1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[100010],b[100010]; 4 int t,n; 5 bool cmp(int aa,int bb) 6 { 7 return aa<bb; 8 } 9 int main() 10 { 11 scanf("%d",&t); 12 while(t--) 13 { 14 scanf("%d",&n); 15 for(int i=0; i<n; i++) 16 scanf("%d%d",&a[i],&b[i]); 17 sort(a,a+n,cmp); 18 sort(b,b+n,cmp); 19 int maxx=0,sum=0; 20 int j=0,i=0; 21 while(i!=n && j!=n) 22 { 23 if(b[j]<a[i]) 24 { 25 sum--; 26 j++; 27 } 28 else 29 { 30 sum++; 31 i

POJ - 3468 A Simple Problem with Integers(线段树区间更新,区间查询)

你说的曾经没有我的故事 提交于 2020-03-30 10:35:22
1、给出了一个序列,你需要处理如下两种询问。 "C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。 "Q a b" 询问[a, b]区间中所有值的和。 2、线段树单点更新太费时,所以使用区间更新 3、 #include <cstdio> #define L(root) ((root) << 1) #define R(root) (((root) << 1) + 1) const int MAXN = 100001; int numbers[MAXN]; struct st { // 区间范围 int left, right; // 更新值、区间总和 long long delta, sum; } st[MAXN * 4]; // 建树代码基本不变 void build(int root, int l, int r) { st[root].left = l, st[root].right = r, st[root].delta = 0; if (l == r) { st[root].sum = numbers[l]; return; } int m = l + ((r - l) >> 1); build(L(root), l, m); build(R(root), m + 1, r); st[root].sum = st[L(root)

HDU 1427 速算24点【数值型DFS】

允我心安 提交于 2020-03-30 09:30:02
速算24点 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2562 Accepted Submission(s): 606 Problem Description 速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。 Input 每组输入数据占一行,给定四张牌。 Output 每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。 Sample Input A 2 3 6 3 3 8 8 Sample Output Yes No 【分析】: 简单的DFS,dfs(sum,next,p)表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p,实际上是把括号外和括号内的两部分值分成sum和next来处理了。

【数据结构】树状数组

好久不见. 提交于 2020-03-30 09:12:24
使用目的 树状数组是为了解决多次单点更新,区间查询等问题的数据结构。 树状数组的更新与查询复杂度均为O(logn)。 为了方便理解树状数组的优势,这里先给出一道题目: 给一大小固定的A数组,现用户可随意更改此数组的任何n个元素为任何值,且用户还想知道每次更改元素后数组中下标从0到m的元素的和。请你用快速的方法解决这个问题。 那么最简单的思路是在每次查询时从0到m做一次求和。但当更改和查询次数巨大的时候,我们不得不换一种思路以免超时。 那么树状数组就是可选的一种结构。 数据结构 为了解决问题,我们希望在求和的时候不要一个一个元素求和,而是一段一段求和。 因此,我们考虑设计一些节点存储一段元素的和,在用户求和的时候可以一段一段求。并且这个节点的数量应该恰到好处,因为我们后续更新这些节点必须快速方便。 庆幸的是有一种方便且快速的数据结构可供我们使用,那就是树状数组。 (这里引用了他人图片,原作者信息在图片上) 为了构造这样一个结构,我们先把数组A的一些元素“提”起来,做成图中的数组C的样子。 我们考虑把数组C看成上述的节点,这些节点存储着相应的一段元素的和。 为了方便找到其中的规律,把数字的二进制形式写出来: 0001 C[1] = A[1] 0010 C[2] = C[1] + A[2] = A[1] + A[2] 0011 C[3] = A[3] 0100 C[4] = C[2] +

[NOIP2007]统计数字

柔情痞子 提交于 2020-03-29 09:18:27
NOIP 2007 提高第一题 题目描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。 输入输出格式 输入格式: 输入文件count.in包含n+1行; 第一行是整数n,表示自然数的个数; 第2~n+1每行一个自然数。 输出格式: 输出文件count.out包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。 输入输出样例 输入样例#1: 8 2 4 2 4 5 100 2 100 输出样例#1: 2 3 4 2 5 1 100 2 说明 40%的数据满足:1<=n<=1000 80%的数据满足:1<=n<=50000 100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*109) 思路 看到这道题的数据,我首先就机智地想到了这一定不能用桶排,用也要离散化重标号,于是我就机制的写了一个离散化。然而只有70分,这是怎么回事口牙? type ss=record sum,shu:longint; end; var a:array[0..100000] of ss; i,j,x,n,kg:longint;

C语言实验(三)

て烟熏妆下的殇ゞ 提交于 2020-03-28 17:45:28
第四章分支结构实验 实验项目: 第四章实验设计 实验项目: 4.3.1 if语句的应用 ,4.3.2 switch case的应用 ,4.3.3 switch case嵌套if语句的应用 ,4.3.4 switch case结构嵌套的运用 ,4.3.5 分析程序, 计算器。 姓名:蔡鹏 实验地点:家中  实验时间:2020.03.25 实验目的与要求: 1、 掌握各种形式的if语句语法和使用方法 2、掌握使用算术运算符和运算规则,switch case语句的使用方法 3、掌握switch case结构的嵌套使用,break语句的用法 4、熟练掌握C语言的运算符,即运算符的优先级和结合性、运算规则、运算对象类型等。 实验内容: 1 ·实验练习:4.3.1 if语句的应用 (1)问题的简单描述:读入3个表示箱子长、宽、高的整数值,判断并输出是正方体还是长方体。 (2)实验代码: #include<stdio.h> int main() { int l,w,h; printf("请输入箱子的长、宽、高:\n"); scanf("%d,%d,%d",&l,&w,&h); if(l==w&&w==h&&l==h) printf("该箱子是正方体。\n"); else printf("该箱子是长方体。\n"); return 0; } (3)问题分析:比较长,宽,高用 l==w&&w==h&

Why Python builin sum() function does not support strings?

眉间皱痕 提交于 2020-03-28 07:04:11
问题 The sum() function work only with numbers, not string. int_lst = [1, 2] sum(int_lst) => 3 str_lst = ['a', 'b'] sum(str_lst) Traceback (most recent call last): File "python", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' I found this behaviour strange because sum() function is just a more pythonic way to do reduce(lambda i, sum:i+sum) . And reduce allow me to concatinate strings, and sum() not. From python documentation for sum() The iterable‘s items are

python学习之偏函数partial

天涯浪子 提交于 2020-03-27 23:08:56
partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数,这个函数可以是你定义的,也可以是Python内置函数 (2)第二部分是一个可变参数,*args, (3)第三部分是一个关键字参数 **args, partial函数的作用就是:将所作用的函数作为partial()函数的第一个参数, 原函数的各个参数依次作为partial()函数的后续参数,原函数有关键字参数的一定要带上关键字, 没有的话,按原有参数顺序进行补充。 Python版本3.6 from functools import partial def sum_add(*args1): def decorator(func): def my_sum(*args2): my_s=0 for n in args1: my_s+=n return func(*args2)+my_s return my_sum return decorator@sum_add(10,20)def test_sum(*args): value=0 for i in args: value+=i return valueprint(test_sum(1,2,3,4,5))#########################以上通过带参数装饰器,获得1+2+3+4+5+10+20 列子def sum(*args): s=0 for n