自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 声明

由于种种原因,此博客的内容较为混乱,仅供本人复习参考,请移步至新博客

2017-11-17 15:52:41 235

原创 洛谷 [P1578] WC2002 奶牛浴场

本题是一道用极大化思想求最大子矩阵的经典题目。这个题目很出名,可以在百度搜索王知昆国家队dalao的论文,其中说的非常详细。 先枚举极大子矩形的左边界,然后从左到右依次扫描每一个障碍点,并不断修改可行的上下边界,从而枚举出所有以这个定点为左边界的极大子矩形。 需要注意的是,如果扫描到的点不在当前的上下边界内,那么就不需要对这个点进行处理。这样做是否将所有的极大子矩形都枚举过了呢? 可以发现,这

2017-11-28 20:14:29 297

原创 洛谷 [P1040]加分二叉树

本题虽然是在树上的问题,但仍是区间DP的基本思路,因为给定区间是树的中序遍历,所以我们枚举左右端点,dp[i][j]表示从i到j号区间所表示的子树的最大分数,在转移的时候枚举根节点k, 有转移方程if(dp[j][k-1]*dp[k+1][i]+num[k]>dp[j][i]){ dp[j][i]=dp[j][k-1]*dp[k+1][i]+num[k]; rt[j][i]=k;

2017-11-27 21:30:16 244

原创 洛谷 [P1220] 关路灯

本题是一道区间DP,很容易设计出状态, dp[i][j]代表关掉i到j的路灯所耗的电量,但是对于新到一个路灯来说,可以是原来直接来的,也可以是掉头来的,于是还需要添加一维 0代表在区间的左端,1代表在区间的右端。从最开始所在的地方扩展。 因为涉及连续区间,可以采用前缀和优化。有如下转移方程: dp[i][j][1]=min(dp[i][j-1][1]+pre[i][j-1](dis[j]-dis

2017-11-27 20:17:18 227

原创 洛谷 [P1156] 垃圾陷阱

首先有序化垃圾被丢入的时间,然后用背包的解法, 一维数组f[high]=life 表示在垃圾堆high高度的时候,奶牛可以存活life的时间 对于每件物品,循环从d~0 如果这个高度的生命值不小于这个垃圾丢下来的时间如果 高度+这个垃圾的高度不小于d,就输出这个垃圾丢下来的时间不然 这个高度+这个垃圾的高度 的生命值=max(d~0的生命值),即不吃垃圾用它来堆,此时高度+=这个垃圾的高度

2017-11-09 10:55:36 289

原创 NOIP要注意什么

(https://www.cnblogs.com/shingen/p/7801970.html)

2017-11-09 09:09:23 403

原创 尺取法

尺取法: 顾名思义,像尺子一样取一段,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。之所以需要掌握这个技巧,是因为尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等。当然任何技巧都存在其不足的地方,有些情况下尺取法不可行,无法得出正确答案。使用

2017-11-08 20:05:33 814

原创 洛谷 [P1387]最大正方形

本题非常有趣。 (n^6) 枚举四个端点,每次遍历矩阵求解。 (n^4) 先处理前缀和,枚举四个端点,每次比较前缀和和正方形面积。 (n^3) 枚举左上方端点,在枚举边长,前缀和优化 (n^2logn) 枚举左上方端点,发现条件是单调的,于是二分边长 (n^2) DP做法,枚举右下端点,若该点是0,dp[i][j]=0;若该点是1,dp[i][j]=min(dp[i-1][j],dp[i]

2017-11-08 19:50:33 350 2

原创 洛谷 [P1282] 多米诺骨牌

这道题是一道背包问题,考虑一个背包,显然如果我们直接设dp[i]表示前i个使差值最小所需的最少翻转次数,是具有后效性的。所以我们将直接求最值,改为求某个值是否可行,这种求最值转变为求可行性的思想是非常实用的。 状态 dp[i][j]表示使用前i个物品修改得到差值j的最小步数。 第一步求出原来两个数组的总和的差值Delta(DD)是多少。第二步进行背包DP,每个物品的质量为:t=a[i]-b[i]

2017-11-08 16:05:57 262

原创 洛谷 [P1890] gcd区间

因为本题的数据范围很小,所以可以预处理一个二维数组,O(1)查询,但是这是一道区间上的题,并且gcd有区间可加性,所以想到了用线段树来维护,然而此题并不用修改,ST表有着比线段树更小的常数。#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <c

2017-11-07 21:51:09 222

原创 组合数

模意义下的组合数计算直接利用Pascal公式◦ n,k ≤ 1000 ◦ 对模数没有要求定义直接算逆元◦ k较小 ◦ 模数为质数预处理阶乘逆元◦ n,k≤ 10s ◦ 模数为质数错位排列表述为:编号是1、2、…、n的n封信,装入编号为1、2、…、n的n个信封,要求每封信和信封的编号不同,问有多少种装法?   对这类问题有个固定的递推公式,记n封信的错位重排数为Dn,则D1=0,D2=1,

2017-11-07 20:24:13 722

原创 数论相关:同余方程与同余方程组的解法

形如a*x≡b(mod n)的式子称为线性同余方程。对于这样的式子有解的充要条件是gcd(a,n)|b.于是扩展gcd求解 将原方程化为一次不定方程 a*y+n*y=b. 利用扩展欧几里得算法求解不定方程a * x + n* y = b的整数解的求解全过程,步骤如下:1、先计算Gcd(a,n),若n不能被Gcd(a,n)整除,则方程无整数解;否则,在方程两边同时除以b/gcd(a,n)

2017-11-07 15:57:46 3442

原创 高精度模板

高精度GCD#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>using namespace std;void init(int num[]){ char s[10005]={0}; scanf("%s",

2017-11-06 20:18:33 164

原创 洛谷 [P1403] 约数研究

本题的思想很好首先如果暴力枚举每个数的约数个数,一定会超时,那么我们就从约数的角度考虑,题目中问的是1~n的约数个数和,那么我们就枚举约数,看每个约数在1~n中出现过几次。#include #include #include #include #include #include using namespace std;int init(){ int rv=0,fh=1;

2017-11-05 20:43:18 252

原创 全排列与 康托展开

对于没有重复元素的全排列来说,存在如下的对应关系X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0!ai为整数,并且0这种对应称为康托展开,是一种全排列与整数的双射,n位(0~n-1)全排列后,其康托展开唯一且最大约为n!可用于压缩状态,可作为Hash函数。康托展开:int contor(int num[

2017-11-05 15:34:34 326

原创 洛谷 [P1265] 公路修建

本题的描述:城市联盟,最短距离。。使人想到了prim求MST,再一看数据范围:完全图!,那么一定得用prim,因为只有5000个点,所以不加优化的prim就能过。#include #include #include #include #include #include using namespace std;const int MAXN=5005;int init(){ in

2017-11-03 21:47:29 305

原创 数据结构模板

线段树函数名要写上。。。 LL 在运算的时候要防溢出。#include #include #include #include #define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int MAXN=100005;long long sum[MAXN<<2];long lon

2017-11-03 16:06:19 243

原创 洛谷 [P1113] 杂务

图论的做法是topsort一看见有序我们就想到了DAG图,于是用topsort做,对于每一个加入队列的顶点,都用它的时间去更新它所指向的点的时间,本质上仍是DP的思想,dp[i]=max{dp[j]}+ti[i] (j->i).#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <a

2017-11-03 08:25:04 284

原创 洛谷 [P1119] 灾后重建

我们发现每次询问都是对于任意两点的,所以这是一道多源最短路径的题,多源最短路径,我们首先想到floyd,因为询问的时间是不降的,所以对于每次询问,我们将还没有进行松弛操作的的点k操作。#include #include #include #include #include #include using namespace std;const int MAXN=205;int i

2017-11-02 16:15:32 188

原创 洛谷 [P1341]无序字母对

这道题第一眼以为是一道字符串的题,但细想一下是一道求欧拉路的图论题。把每一对对应关系看成一条边,本题即求这张图上是否存在一个欧拉回路或欧拉路,并要求字典序最小的方案,那么我们在dfs的时候就要从该点所连的最小的点开始便利,并将所得的结果存在一个数组中,最后逆序输出。#include #include #include #include #include #include usi

2017-11-02 11:14:57 202

原创 洛谷 [P2661] 信息传递

求有向图的权值为一的最小环并查集做法维护一个dis[],表示i号元素到fa[i]的距离。 对于输入的每两个点u,v,询问这两个点的fa[]是否相同,如果相同就成环,维护最小值,mi=min(mi,dis[u]+dis[v]+1)。如果不相同,merge(u,v)。目测是最简单的做法。 但是只适用于权值为一的边。 注意对于一条U指向v的边,是将u合并到v上。#include <iostream>

2017-10-31 21:35:28 211 1

原创 洛谷 [P1198] 最大数

首先这是一道线段树裸题,但是线段树长度不确定,那么我们可以在建树的时候,将每一个节点初始化为-INF,每次往队尾加一个元素即一次单节点更新,注意本题的数据范围,其实并不用开 long long,具体请看注释。#include #include #include #include #define lson l,mid,rt#define rson mid+1,r,rtusing na

2017-10-31 10:31:17 374

原创 洛谷 [P2024] 食物链

并查集这是一道比较特殊的并查集,开一个三倍的数组, 1~n保存同类,n~n×2保存猎物,n*2~n*3保存天敌;#include #include #include #include using namespace std;const int MAXN=300005;int read(){ int rv=0,fh=1; char c=getchar(); while(

2017-10-31 10:15:26 160

原创 洛谷 [p1196] 银河英雄传说

所谓带权并查集本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。find函数int find(int x){ if(x!=fa[x]){ int k=fa[x];

2017-10-31 09:24:01 287

原创 洛谷 [P1801] 黑匣子

这道题是一道splay裸题,然而身为蒟蒻的我并不会,所以这道题我维护的是一个大根堆与一个小根堆结合起来的类似沙漏的结构。 本题难点在于询问的不是最大最小值,而是第K小值,所以我们想到了维护这样两个堆,上面是一个大小限定为K-1的大根堆,下面是一个小根堆,每次插入/查询操作时,保持前K-1大的始终在大根堆内。 插入/查询函数:int heap[200005][3],hsize[3];int m,

2017-10-28 08:18:17 308

原创 洛谷 [P1280] 尼克的任务

DP题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如果有任务,就遍历所有任务 dp[i]=max{dp[i+task[j]]}即本问题可以看成分组背包问题#include <iostream>#include <cstdio>#include <alg

2017-10-26 18:45:27 673

原创 Mr_Wolfram还要做什么

二分借教室 营救

2017-10-26 16:40:28 227

原创 洛谷 [P1426] 通往奥格瑞玛的道路

题目中的表述很明显是一道二分答案+最短路的题目,二分收取的费用x判断能否到达奥格瑞玛。检验函数用SPFA跑最短路,注意,费用高于x的点不能使用。#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>using namespace s

2017-10-26 15:55:08 299

原创 洛谷 [p1439] 最长公共子序列 (NlogN)

可以发现只有当两个序列中都没有重复元素时(1~n的排列)此种优化才是高效的,不然可能很不稳定。 求a[] 与b[]中的LCS 通过记录lis[i]表示a[i]在b[]中的位置,将LCS问题转化为最长上升子序列问题,转化方法如下:for(int i=1;i<=n;i++){ local[b[i]]=i; } for(int i=1;i<=n;i++){

2017-10-26 15:22:31 468

原创 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)

一道二分答案加前缀和题目中已经暗示的很明显了 “尽可能靠近” “ 最小值” 本题的主要坑点在于 long long 的使用#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int MAXN=200005;

2017-10-25 21:01:30 340

原创 洛谷 [P1182] 数列分段

这是一道典型的二分答案问题(最大值最小,最小值最大)关键是对于细节的处理。 二分的框架://l=max{num[i]},r=sum{num[i]}while(l<=r){ int m=(l+r)>>1; if(chk(m)){ r=m-1; }else l=m+1; } cout<<l;二分的框架是普遍使用的

2017-10-25 19:33:28 355

原创 一些应该注意的问题

朴素的素数筛法中bool chk(int x){ if(x==1) return 0; if(x==2)return 1;//一定要特判2 if(!(x&1)) return 0; int t=sqrt(x); for(register int i=3;i<=t;i++){ if(!(x%i)) return 0; } retu

2017-10-25 19:24:25 254 4

原创 洛谷 [P1024]一元三次方程求解

一道水题然而坑点很多。#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>using namespace std;int read(){ int rv=0,fh=1; char c=getchar(); while(c<'0'||c>'9'){ if(c=

2017-10-24 21:09:00 356

原创 洛谷 [P1020] 导弹拦截 (N*logN)

首先此一眼就能看出来是一个非常基础的最长不下降子序列(LIS),其朴素的 N^2做法很简单,但如何将其优化成为N*logN? 我们不妨换一个思路,维护一个f数组,f[x]表示长度为x的LIS的最大的最后一个数字是f[x]。(为什么是最大的?可以应用贪心的思想,发现对于相同的x,f[x]越大其后可能扩展的情况就越多,即就越优)我们可以发现f数组单调递减(为什么?也可使用反证法证明,在此不赘述)对于决

2017-10-24 20:23:02 283

原创 搜索有关的好题和思路

枚举等差数列(ZJOI2004)给定 n(1数列.求最长的等差数列的长度.我们首先必须对这个数列进行排序,排序我们采用 QuickSort。然后我们 就能够很快想到一系列的方法:枚举头部、第二个与尾部。 但是我们为什么要枚举三个呢?头部当然不用说,第二个是为了与第一个作 差,得出公差。然后就可以递推地去枚举到最后。 这样我们就能够得出一个O(n3)的方法,而在n时。

2017-10-19 21:42:52 184

原创 洛谷 [P3110] 驮运

题目略带一点贪心的思想,先跑三遍最短路(边权为一,BFS比SPFA高效) 一起跑总比分开跑高效,枚举两人在何点汇合,输出最小值。#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <cstring>#include <queue>using namespace std;c

2017-10-18 19:28:48 215

原创 数据结构模板

线段树#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int MAXN=100005;long long sum[MAXN<<2];l

2017-10-17 22:01:00 298

原创 洛谷 [P2296] 寻找道路

反向BFS预处理,求出所有符合题意的点,再正向BFS,(注意对于边权恒为一的点,BFS,比SPFA高效)输入时n与m分清#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>#include <queue>#include <cstring>using namespace std;const

2017-10-17 20:45:20 230

原创 洛谷 [P2420] 让我们异或吧

某两点之间的路径上所有边权的异或值即dis1^dis2……^disn. 由于x^y^y=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv.#include <iostream>#include <cstdio>#include <algorithm>#include <cstdlib>using namespace std;int read(){

2017-10-16 20:22:06 339

原创 一些比较实用的网站

题解:shawnZhou

2017-10-10 21:04:34 327

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除