技术标签: 算法
1.线段树
线段树相对于树状数组较为灵活,但比树状数组的速度会稍微慢一点,且空间是四倍的树状数组。
线段树的思想是,每个结点都是一个结构体{l,r,sum},表示l到r区间内的总和,灵活就灵活在这个总和,因为也可是这个区间最小值,最大值等,线段树一般有四个函数如下:
void pushup(int u)
{
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
int build(int u,int l,int r)
{
if(l == r) tr[u] = {l,r,w[l};
else
{
tr[u] = {l,r};
int mid = tr[u].l + tr[u].r >> 1;
build(u << 1,tr[u].l,mid),build(u << 1 | 1,mid + 1, tr[u].r);
pushup(u);
}
}
int query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
else
{
int sum = 0;
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) sum = query(u << 1, l , mid);
if(r > mid) sum += query(u << 1 | 1, mid + 1, r);
return sum;
}
}
void modify(int u,int x,int v)
{
if(tr[u].l == tr[u].r) tr[u].sum += v;
else
{
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid) modify(u << 1, x , v);
else modify(u << 1 | 1, x, v);
pushup(u);
}
}
1264. 动态求连续区间和
给定 nn 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b][a,b] 的连续和。
输入格式
第一行包含两个整数 nn 和 mm,分别表示数的个数和操作次数。
第二行包含 nn 个整数,表示完整数列。
接下来 mm 行,每行包含三个整数 k,a,bk,a,b (k=0k=0,表示求子数列[a,b][a,b]的和;k=1k=1,表示第 aa 个数加 bb)。
数列从 11 开始计数。
输出格式
输出若干行数字,表示 k=0k=0 时,对应的子数列 [a,b][a,b] 的连续和。
数据范围
1≤n≤1000001≤n≤100000,
1≤m≤1000001≤m≤100000,
1≤a≤b≤n1≤a≤b≤n
输入样例:
10 5
1 2 3 4 5 6 7 8 9 10
1 1 5
0 1 3
0 4 8
1 7 5
0 4 8
输出样例:
11
30
35
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define MAXN 100015
struct node
{
int l,r,sum;
}tr[MAXN * 4];
int w[MAXN];
int n,m;
void pushup(int u)
{
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
int build(int u,int l,int r)
{
if(l == r) tr[u] = {l,r,w[l]};
else
{
tr[u] = {l,r};
int mid = l+r >> 1;
build(u << 1, l , mid),build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
int query(int u,int l, int r)
{
if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
else
{
int sum = 0;
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) sum = query(u << 1, l, r);
if(r > mid) sum += query(u << 1 | 1, l, r);
return sum;
}
}
void modify(int u,int x,int v)
{
if(tr[u].l == tr[u].r) tr[u].sum += v;
else
{
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid) modify(u << 1, x,v);
else modify(u << 1 | 1, x , v);
pushup(u);
}
}
int main()
{
scanf("%d %d",&n,&m);
int k,l,r;
for(int i = 1; i <= n; i++) scanf("%d",&w[i]);
build(1,1,n);
while(m--)
{
scanf("%d %d %d",&k,&l,&r);
if(!k) printf("%d\n",query(1,l,r));
else modify(1,l,r);
}
return 0;
}
2.树状数组有两个操作,单点修改,求前缀和,速度极快,Ologn,比线段树快
#define MAXN 10015
int a[MAXN],c[MAXN];
int lowbit(int x)
{
return x & -x;
}
int query(int x)
{
int res = 0;
for(int i = x; i > 0; i -= lowbit(i)) res += c[i];
}
void add(int x,int v)
{
for(int i = x; i <= n; i += lowbit(i)) c[i] += v;
}//初始化的时候直接顺序add即可!
场景描述:OC项目集成Swift三方库,在引用Swift三方库的时候出现的报错。奇怪之处在于,.m文件是可以引用的,在.h文件是不能引用,直接报上面的错(一度使我极度郁闷,更郁闷的是第二天居然不报错了),还是把自己的解决办法说一下。下面的两个设置也试过,在我项目中不管用(可能项目中存在.mm文件,如果存在,可能的原因是您使用objective - c + +。modules不适用c++...
首先来看一下效果:(这些个电影画风好温柔...)0、先讲一个CSS3的动画用法animation基本用法是:animation: name keeping-time animate-function delay times iteration final;第一个参数:name (animation-name):动画的名字,CSS3采用“关键帧 keyframes”来定义动画,如下第4个步骤展示;1...
执行用时:40 ms内存消耗:14.5 MBclass Solution: def peakIndexInMountainArray(self, arr: List[int]) -> int: left = 0 right = len(arr) - 1 while left <= right: mid = left + (right - left) // 2 if arr[mid-1] &_ptthin山顶求数组
navicat(mysql)设置添加或更新数据时,自动添加更新或添加的时间设置添加时,时自动添加当前时间,勾选自动更新设置更新时,时自动添加当前时间,设置默认值CURRENT_TIMESTAMP_navicat自动刷新数据
个人总结的java基础知识(大牛请无视)使用IDE : eclipse-2020一 .初识java语法结构java知识普及java中main方法:程序的入口,或者工程的入口,大部分程序都有且只有一个main,在程序一运行时就会自动运行main方法 这个不用咱们管,我们也不能用这个函数 这个函数是系统自己调用的,我们的职责就是在main方法里面写东西,java中的main方法不属于任何一个类,它仅仅是一个程序入口,所以你写到哪里都行,当然要在你的项目文件夹里Java程序的main()方法必须都_python工程师入门java
作者:韩单位:燕山大学论文地址:https://arxiv.org/abs/2105.08050目录一、前言二、概述三、模型3.1 Spatial Gating Unit四、Masked Language Modeling with BERT4.1 Ablation: The Importance of Gating in gMLP for BERT’s Pretraining4.2 Case Study: The Behavior of gMLP as Model Size Increases._带gating的mlp
接上次的。首先Launcher实现了LauncherModel.Callbacks接口,APP信息数据加载成功后 ,回调接口把app信息显示到Launcher的 workspace界面上,这个过程代码里面称为bind。下面是个类调用过程的时序图,不是很标准,不过能表达基本调用顺序帮助我们理解。首先就是Launcher OnCreate中调用LauncherMode startLoader方法,这里..._安卓 ko加载顺序
一 string命令详解string命令主要用来查看非文本格式的文件中的ASCII字符串——当然, 也可以查看文本形式的文件对应字符串。命令的使用形式如下:[22:41huangyk@leetcode]$>strings -a numDistinct | grep lib/lib64/ld-linux-x86-64.so.2libstdc++.so.6libm.so.6
今天在用明日科技的《Java从入门到精通》一书学习Java,看到数组查询这里有一点无法理解,上机实验感觉和书上讲的不太一样,遂百度之,感觉是书上讲的有误,现记录一下。首先 数组排序需要import java.util.Arrays类binarysearch有两个用法,一个是在整个数组里搜索,一个是在指定范围搜索,其实都是差不多的,可以将前者视为后者的特殊情况。用法1binarySearch(Obj..._java 方法binary入参怎么写
第7章 商品搜索学习目标根据搜索关键字查询条件筛选规格过滤价格区间搜索分页查询排序查询高亮查询1 根据关键字查询(1) changgou_service_search项目创建SearchService接口public interface SearchService { /** * 全文检索 * @param paramMap 查询参数 * @return */ public Map search(Map<String_skubrand
使用C语言输出3个整数最大值的案例使用多种方法进行案例讲解_c语言三个数输出最大值
统计问题Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7290 Accepted Submission(s): 4291Problem Description在一无限大的二维平面中,我们做如下假设: