树状数组
林中的亮光
沉着冷静淡定
展开
-
D. Optimal Partition(dp + 树状数组维护)
通过树状数组维护时候,记得添加初始元素0,使得维护元素为空的情况(也就是代表前缀和是s[0])#include<bits/stdc++.h>#define ll long long#define endl '\n'#define PII pair<int,int>using namespace std;const int inf=0x3f3f3f3f;const int mod=1e9+7;const double eps=1e-8;const int N=5.原创 2022-04-26 16:26:55 · 410 阅读 · 0 评论 -
树状数组维护前缀和
#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;#define int long longconst int N = 400010;int s[N];int tr[N];int n,m;vector<int>nums;int lowbit(int x){ return x&...原创 2022-04-02 19:42:37 · 145 阅读 · 0 评论 -
DFS序维护树状数组
dfs序是指:每个节点在dfs深度优先遍历中的进出栈的时间序列。如图,当我们维护一个时间戳,即每个节点进栈与出栈的时间,便可以把树上问题转换为区间问题。例题如下:当我们需要对树上问题进行区间求和的时候,如果我们可以把树上问题转为区间问题,便可以很方便的利用数组数组以及线段树去维护序列,#include<bits/stdc++.h>#define int long long using namespace std;const int N =...原创 2022-03-27 17:42:51 · 1015 阅读 · 3 评论 -
树状数组实践--求逆序对,区间修改,单点查询改单点修改,区间查询
先用数组数组维护一个c【x】 函数用于记录对应集合[l,r] 范围内数的个数,接着倒叙扫描给定1序列 a ,(1)每次查询前缀和 【1 , a[i] - 1】 累加到答案之中。(2)执行 “单点增加操作” 把 a[i]上的数加一 ,可以理解为扫描这个数之后,开始扫描这个数之前的数,那么就要更新一下数状数组了。由于是倒叙开点,那么当前形成的树状数组中,的值都是在这个数之后出现的数,所以查询【1 , a[i] - 1】,即可找到关于这个数的逆序对数。#include<bits/stdc+原创 2022-02-21 08:55:53 · 526 阅读 · 0 评论