持续更新!!!


【例题】简单题(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. Linux任务前后台的切换(转)

    Linux任务前后台的切换   Shell支持作用控制,有以下命令实现前后台切换: 1. command& 让进程在后台运行 2. jobs 查看后台运行的进程 3. fg %n 让后台运行的 ...

  2. VS2008调用VS2012的WCF服务的方式和遇到的问题

    1 用添加服务引用的懒方式 2 用http请求方式 3 客户端自己定义一个Contract,跟服务端的一样(可以只写要使用的方法,不用全部写完). 由于规范要求,前两种都不能用,后面根据同事的描述,产 ...

  3. SQL 组内排序

    SELECT t_time, code, name, CL, row_number () OVER (partition BY t_time ORDER BY cl) AS 组内排名1, --T_ti ...

  4. solr配置相关:约束文件及引入ik分词器

    schema.xml: solr约束文件 Solr中会提前对文档中的字段进行定义,并且在schema.xml中对这些字段的属性进行约束,例如:字段数据类型.字段是否索引.是否存储.是否分词等等 < ...

  5. 10 华电内部文档搜索系统 search02

    搜索项目并不是一个很大的项目,在实际项目中往往是作为子项目和别的项目集成在一起的.比如说和OA项目集成在一起,作为另外一个项目的子系统来使用.搜索项目的功能并不复杂. 整个项目是文档搜索项目,如题:企 ...

  6. svn服务,svnserve开机启动

    在服务器(我的环境是centos6.5)上部署完svn之后,一般都希望每次重启的时候svn服务能够随着启动.上网搜索了一下,一般有两种做法: 一.启动脚本+/etc/rc.local启动 1. 在某个 ...

  7. freemaker优缺点

    1.什么是FreeMarker?FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的 ...

  8. CentOS搭建VSFTP服务器

    一.安装vsftpd 1.查看是否已经安装vsftpd 2.如果没有,就安装 3.测试是否安装成功 4.安装成功设置开机启动 二.配置vsftpd 1.修改配置文件/etc/vsftpd/vsftpd ...

  9. VS优化编译配置

    在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍.由于这个工程代码量太大,每次编译完成都需要将近10分钟左 ...

  10. java8 Lambda表达式的10个例子(转)

    原文:http://jobar.iteye.com/blog/2023477 Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 收藏代码// ...