持续更新!!!


【例题】简单题(K-D tree)

题目链接

线段树

【例题】(环上最大连续和) 给定一个长度为n的环形序列A,其中A1与A_n是相临的,现在有q次修改操作,每次操作会更改其中一个数,请对于每次修改输出修改后的最大连续和。

题目链接:POJ2750

【例题】给定一个长度为n的序列,可以修改任意个数字使其变成原来的相反数,求最小的逆序对数。

左偏树

【例题】派遣 题目链接

左偏树是一种具有左偏性质的堆有序二叉树(这里要注意,堆有序二叉树和二叉堆并不是同一种东西,因此左偏树并不是堆)。每一个节点存储的信息包括左右子节点、关键值以及距离(当然也有很多时候我们需要维护父节点)。

节点的距离可以这样定义:

某个节点被称为外节点,仅当这个节点的左子树或右子树为空。某一个节点的距离即该节点到与其最近的外节点经过的边数。易得,外节点的距离为0,空节点距离为−1。特别的,我们把根结点的距离称为这棵左偏树的距离。

这里有一张来自HolseLee dalao的图,以时空复杂度的角度来分析为什么左偏树是最常见的可并堆:



(imone dalao说,斜堆好写啊!)

至于时间复杂度为什么是这样的证明??没有的我不太会,此处挖坑待补吧。

三维偏序

【例题】给定三个长度为n的排列A,B,C,统计有多少对(i,j)满足\(A_i<A_j,B_i<B_j,C_i<C_j\)。其中\(n<=5e6\)。

解法:

我们先拆成二维偏序的问题。

设x为满足\(A_i<A_j,B_i<B_j\)的个数

y为满足\(B_i<B_j,C_i<C_j\)的个数

z为满足\(C_i<C_j,A_i<A_j\)的个数

显然会有结论:如果满足x,y,z这三种约束条件之二,就能满足题目中所要求的约束条件,我们称之为合法解。在计算这三个二维的时候,同一个合法解会被计算三次。

而不合法解只能被计算一次(因为如果有两次,根据上述所说,它就是合法解了)

我们设这个合法解的数量为c,那么根据排列组合原理,不合法解的数量为\(C_n^2-c\)。

所以我们有\(x+y+z=3c+C_n^2-c\)

所以\(c=\frac{1}{2}(x+y+z+C_n^2)\)

点分治

边分治

如果被菊花图卡了怎么办?加虚点。(只要保证和原图等价即可——点与点之间的边数和原先的一样)

你不知道怎么加虚点?上网搜啊。

【例题】BZOJ2870

????边分治到底是个什么啊?有用吗?有用吗?

链分治

整体二分

使用整体二分的题需要满足以下性质:

  • 询问的答案具有可二分性
  • 修改对询问的贡献是独立的,相互之间并不影响
  • 不同的修改的贡献可以叠加
  • 必须离线

    顾名思义,就是对所有的询问一起二分。通常而言,这类题的询问是似乎于第几次修改之后满足条件。

莫队

推荐博客:胡小兔良心莫队教程

适用范围:

如果知道区间[l,r]的答案可以快速算出[l,r+1],[l,r-1],[l+1,r],[l-1,r]的答案的题目。

先将序列分成\(\sqrt n\)分块,然后将所有询问做双关键字排序,第一关键字为询问的左端点所在的块,第二关键字为询问的右端点。那么两个询问[l1,r1],[l2,r2]之间转移的时间为(|l1-l2|+(r1-r2|)*t,其中t为转移一次的复杂度。

证明:

对于左端点,在同一块内的转移,一次不超过\(\sqrt n\),在不同块之间的转移不超过\(\sqrt n\)次。

右端点类似。总共的转移次数为\(O(n\sqrt n)\)级别的。


模板专用分割线

  • 支持加减乘操作的线段树
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
using namespace std;
int n,m,mod;
int a[MAXN];
struct Node{int l,r,add,mul,sum;}t[MAXN<<2];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
inline void push_up(int x){t[x].sum=(t[ls(x)].sum+t[rs(x)].sum)%mod;}
inline void f_mul(int x,int mul,int add)
{
int l=t[x].l,r=t[x].r;
t[x].sum=(1ll*t[x].sum*mul%mod+1ll*(r-l+1)*add%mod)%mod;
t[x].mul=(1ll*t[x].mul*mul)%mod;
t[x].add=(1ll*t[x].add*mul%mod+add)%mod;
}
inline void push_down(int x)
{
if(t[x].mul!=1||t[x].add)
{
f_mul(ls(x),t[x].mul,t[x].add);
f_mul(rs(x),t[x].mul,t[x].add);
t[x].mul=1;
t[x].add=0;
}
}
inline void build(int x,int l,int r)
{
t[x].l=l,t[x].r=r;
t[x].add=0,t[x].mul=1;
if(l==r) {t[x].sum=a[l]%mod;return;}
int mid=(l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
push_up(x);
}
inline void update_add(int x,int ll,int rr,int k)
{
int l=t[x].l,r=t[x].r;
if(ll<=l&&r<=rr)
{
t[x].sum=(t[x].sum+k*(r-l+1))%mod;
t[x].add=(t[x].add+k)%mod;
return;
}
push_down(x);
int mid=(l+r)>>1;
if(ll<=mid) update_add(ls(x),ll,rr,k);
if(mid<rr) update_add(rs(x),ll,rr,k);
push_up(x);
}
inline void update_mul(int x,int ll,int rr,int k)
{
int l=t[x].l,r=t[x].r;
if(ll<=l&&r<=rr)
{
t[x].sum=(1ll*t[x].sum*k)%mod;
t[x].mul=(1ll*t[x].mul*k)%mod;
t[x].add=(1ll*t[x].add*k)%mod;
return;
}
push_down(x);
int mid=(l+r)>>1;
if(ll<=mid) update_mul(ls(x),ll,rr,k);
if(mid<rr) update_mul(rs(x),ll,rr,k);
push_up(x);
}
inline int query(int x,int ll,int rr)
{
int l=t[x].l,r=t[x].r;
if(ll<=l&&r<=rr) return t[x].sum%mod;
push_down(x);
int mid=(l+r)>>1;
int cur_ans=0;
if(ll<=mid) cur_ans=(cur_ans+query(ls(x),ll,rr));
if(mid<rr) cur_ans=(cur_ans+query(rs(x),ll,rr));
return cur_ans%mod;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%d%d%d",&n,&m,&mod);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op,x,y,k;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d%d",&x,&y,&k);
update_mul(1,x,y,k);
}
else if(op==2)
{
scanf("%d%d%d",&x,&y,&k);
update_add(1,x,y,k);
}
else
{
scanf("%d%d",&x,&y);
printf("%d\n",query(1,x,y));
}
}
return 0;
}

OI数据结构&&分治 简单学习笔记的更多相关文章

  1. OI动态规划&&优化 简单学习笔记

    持续更新!! DP的难点主要分为两类,一类以状态设计为难点,一类以转移的优化为难点. DP的类型 序列DP [例题]BZOJ2298 problem a 数位DP 常用来统计或者查找一个区间满足条件的 ...

  2. OI树上问题 简单学习笔记

    判断链 每个点的度数不超过2 判断树 n个点,n-1条边 每两个点之间的路径唯一 多叉树转换成二叉树 第一个孩子作为左孩子,第一个孩子的兄弟作为它的右孩子. 树的重心 树上一点,满足删除该点时,树内剩 ...

  3. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  4. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  5. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  6. <<C++标准程序库>>中的STL简单学习笔记

    0. 内容为个人学习笔记, 仅供参考, 如有错漏, 欢迎指正! 1. STL中的所有组件都是由模板构成的, 所以其元素可以是任意型别的. 组件有: - 容器: 管理某类对象的集合. 不同的容器有各自的 ...

  7. OI图论 简单学习笔记

    网络流另开了一个专题,所以在这里就不详细叙述了. 图 一般表示为\(G=(V,E)\),V表示点集,E表示边集 定义图G为简单图,当且仅当图G没有重边和自环. 对于图G=(V,E)和图G2=(V2,E ...

  8. OI网络流 简单学习笔记

    持续更新! 基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. ..怎么说呢,最基础的模板我就我不说了吧qwq,具体可以参考一下这位大佬写的博客:最大流,最小割,费用流 费用流 跑 ...

  9. OI多项式 简单学习笔记

    咕咕咕 先开个坑(其实是存模板来了) 一些特别简单的前置东西qwq 复数的计算 复数相加:向量相加,复数相乘.复数相乘:模长相乘,旋转量相加(就是复平面坐标轴逆时针旋转的角度) (当然也可以直接使用c ...

随机推荐

  1. Java如何快速修改Jar包里的文件内容

    需求背景:写了一个实时读取日志文件以及监控的小程序,打包成了Jar包可执行文件,通过我们的web主系统上传到各个服务器,然后调用ssh命令执行.每次上传前都要通过解压缩软件修改或者替换里面的配置文件, ...

  2. guestfs-python 手册

    Help on module guestfs: NAME guestfs - Python bindings for libguestfs FILE /usr/lib64/python2.7/site ...

  3. 求Half向量

    [求Half向量] 给定入射向量与视角向量.把入射向量与视角向量相加即可,如下: 前提是 lightDir.ViewDir 都是单位向量.

  4. coding创建项目

    在本地,使用git 需要创建一个pom.xml文件,就可以导入到工作空间了! 在需要项目工作空间里,依次使用git命令执行 mkdir test  //创建文件夹,项目名称cd test   //切换 ...

  5. Mask_RCNN训练自己的模型(练习)

  6. Fix: The account is not authorized to log in from this station

    If you have more the one computers running Windows, then its possible to connect them using HomeGrou ...

  7. loadrunner中回放log看不到参数替代后具体数值

    1.打开run-time settings,找到 log - always send messages,选择 extended log--parameter substitution.

  8. Go语言特性

    1.入口,go有且只有一个入口函数,就是main函数 liteide (IDE)的 一个工程(文件夹)只能有且只有一个main函数 package main import "fmt" ...

  9. mysql varchar 类型 超出字符

    4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个汉字3字节) 5.0版本以上,varchar(50),指的是50字符,无论存放的是数字.字母还是UTF ...

  10. ui界面使用 DialogMonitorOPS 问题

    -- 是类主要是实现对界面上元素的处理.实现效果的处理 struct gt_cl_hp_uiName ( fn help = ( gt_10000_help = " 类主要是实现对界面上元素 ...