- 博客(53)
- 资源 (1)
- 收藏
- 关注
原创 HNOI2017 大佬 - DP,BFS,Hash,单调性
这真的是一道综合题。然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了?首先我们考虑到,所有和怼有关的操作都是时刻无关的。也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响。因此我们考虑把这些操作剥离出来。换言之,我们可以把所有2操作剥离出来。为什么剥离2号操作呢?因为只要二号操作和自己的生命有关(你不妨理解为xu`ming)。也只有这一种操作时与时刻有关的。...
2018-04-06 22:10:43
402
原创 省选前培训小结(经历与经验)
脑子一热就铁定了出来培训的心,给定的Goal大都没有完成,但说到底还是有些收获的 先扯扯为什么出来培训呢、可以写大码农题(然而一道都没写)可以专心搞一阵子(然而效率并没有我想象的高)可以翘课,可以翘月考,维持心态稳定(然而竟然有人筹划了等我回去后**)感觉自己立的flag都崩了呢,专心搞一阵子,效果也没有预想中的明显。不过或许还是很有用呢。打了几天模拟赛了,现在把一些收获稍作...
2018-03-30 08:18:15
295
原创 [BZOJ1001] [BJOI2006] 狼抓兔子
给定一个稀疏平面图,求其最小割。(点数N≤1000000N\leq 1000000)题目都翻译成这样了,也没有做法之说,甚至成了模板题。手打队列开小了,刚开始RE了半天……#include<iostream>#include<cstring>#include<cstdio>using namespace std;struct Item{int p,c,nxt;} it[8000005];i
2017-12-10 22:50:06
452
原创 网络最大流:模板(优化后)
一时兴起在LibreOJ上交了下模板然后被卡常……于是努力克服STL依赖症,改过自新……#include<iostream>#include<cstring>#include<cstdio>using namespace std;struct Item{int p,c,nxt=-1;} it[9000005];int dis[1000005],n,m,s,t,ans,tans,t1,t2,
2017-12-10 22:28:41
357
原创 [BZOJ1412] [ZJOI2009] 狼与羊的故事 (最小割)
给定一个N×MN \times M方格矩阵,每个格子可在0,1,20,1,2中取值。要求在方格的边上进行划分,使得任意联通块内不同时包含11和22的格子。若对方格矩阵的形式感到困惑,我们可以先考虑图上的形式。 假设图中有节点W1W_1,Q1Q_1,S1S_1,S2S_2,且W1W_1与其它三者间各有一边,此外Q1Q_1和S1S_1间还有一边。W1W_1是1值节点,S1,S2S_1,S_2是2值节点
2017-12-08 22:21:13
456
原创 NOIP2017 游记 Day2
话说为什么过了快一个月才来写……T_T……考前又来早了,被寒风肆虐着……T1:天哪!(读题只读了10s)……MDZZ怎么会出模板题……下一题T2:额……(怎么又是图论) 题目有点长啊!(读了一遍,没看懂) 额……好像有点懵,看下一题T3:……(读题读了1分钟) 这是线段树裸题还是平衡树裸题(开始怀疑人生……)然后看数据范围,恩,BIT吧,(不过我好像没写过BIT啊怎搞-_-b) 又读了一遍题,确定B
2017-12-08 20:30:31
290
原创 [BZOJ2879] [NOI2012] 美食节 (费用流)
和SCOI2007 修车 差不多,但带着修车的思维定势来做可能会gg……有NN种菜品,每种要求PiP_i个。有MM个厨师,每个厨师做每个菜的时间可能不同。要求最小化顾客的总等待时间。考虑运用“时间拆点”大法,将每个厨师拆成PP个。(注意这里是PP不是NN) 每个菜可以任意选择将它的一份分配给某个厨师做,于是将每种菜对应的点向所有的“厨师*时间”连边,费用即为厨师在他的该时间(顺序)做这个菜所用的时
2017-12-08 19:08:20
318
原创 NOIP2017 游记 Day 1
昨天没拿到自己的准考证,莫名诡异,心想一定有阴谋。早晨7:40,不知为什么来这么早,在寒风中凌冽了……一节课,然后进考场。压缩文件加嵌套了?……不能根据题目名称瞎猜了……buWangChuXin 好密码T1:天哪,这么草率?……有点懵 T2:额……码农题,先没看,跳 T3:难道不是一个 多人背包+最短路计数+负环 ?然而这竟然是提高组DAY 1,和去年相比简直良心啊?T1:打了个完全背包,突然
2017-11-11 13:40:15
1028
原创 [ZJOI2006] 书架 - 平衡树
要求维护一个序列(序列中的每个元素都有一个编号,终生不变),可以指定某个元素并将其放到序列开头、序列结尾,或与其前驱或后继交换位置。支持询问某个编号的元素位置和某个位置的元素编号。用平衡树来实现此题,需要特殊考虑的就是编号问题。由于平衡树中要完成终生不变的编号,还有循编号来查找元素,直接建立tag并不能有效地解决问题。不妨利用平衡树内部的Key来维护位置关系,然后外部开两个数组来双向地记录Key与N
2017-08-24 22:13:12
439
原创 Splay模板 - v2.1
蒟蒻成功达成一次性AC模板,在此纪念。#include<cstdio>using namespace std;int fa[100005],ch[100005][2],k[100005],size[100005],cnt[100005],m,ind=0,root=0;void update(int p){ size[p]=size[ch[p][0]]+size[ch[p][1]]+cn
2017-08-24 15:46:39
332
原创 [NOI2004] 郁闷的出纳员 - 平衡树
《郁闷的出纳员》此题曾一度令人十分郁闷,原因是全局标记的转化容易出错。 可以将数值视作一维系量,则有r=r0+r′r=r_0+r',其中rr为真实工资,r0r_0为系工资,r′r'为相对工资。平衡树中储存的便是r′ir'_i,另建立一个全局标记r0r_0,则工资加减可视作对它的操作。但此时,出入平衡树的参量都需经过关于r0r_0的运算。这是一个需要细心与耐心的过程。 // 平衡树中记录相对工
2017-08-22 23:52:24
385
原创 [LG1503] 鬼子进村 - 平衡树
考虑维护每个被摧毁的点,摧毁时入栈,修复时弹出栈并在平衡树中删除之。对于询问,求前驱后继之差即可,注意询问点为已存在的特判。#include<cstdio>#include<vector>using namespace std;int fa[50005]={},ch[50005][2]={},k[50005]={},ind=0,root=0,m,n;int search(int v){int
2017-08-20 23:25:21
434
原创 [Tyvj1728] 普通平衡树 - Splay模板
第三次A这题了,代码终于像点样子。#include<cstdio>#define Ms 100005using namespace std;int fa[Ms],ch[Ms][2],cnt[Ms],size[Ms],k[Ms],ind=0,root=0,m;void debug(int p);void update(int p){ size[p]=size[ch[p][0]]+si
2017-08-19 23:07:13
304
原创 Splay模板
第二代Splay魔板。#include <cstdio>#include <cstring>#include <iostream>using namespace std;int fa[100005],ch[100005][2],cnt[100005],size[100005],k[100005],m,ind=0,root=0;void update(int p){ size[0]=
2017-08-18 22:15:37
450
原创 NOIP2014:飞扬的小鸟 - DP
题目不难,就是细节较多。P.S. 这题我好像调了一年。一道值得付出时间的题。上代码#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int f[10005][1005]={},l[10005]={},h[10005]={},n,m,t,x[10005]={},y[10005]={},g[10
2017-08-01 00:01:17
444
原创 [BZOJ1012] [JSOI2008] 最大数
BZOJ1012 = Luogu 1198 Tag: 线段树入门题试题描述 维护一个序列,支持以下操作:查询某位xx个数中的最大值向序列末尾插入一个数nn,且nn 为本次插入命令指定的常数CC与上一次询问结果的和对一个确定常数DD取模。一共有MM个操作,满足M≤200000M\leq200000。分析 考虑用线段树维护。开始时创建一个大序列,全部设为−2147483647-2147483
2017-07-30 15:33:32
350
原创 [洛谷P2073] 送花 - 平衡树入门题
可以作为入门平衡树的第一道题。1 试题大意维护一个序列,支持以下操作:插入一个新的元素,包括它的Key和Value删除Key最小的元素删除Key最大的元素并在结束时分别输出序列中元素的Key总和与Value总和。2 分析平衡树这里用Splay实现。对于删除操作,由于在两端,实现起来较为简单。3 参考程序#include <cstdio>#define lc(x) ((x)
2017-07-29 23:52:15
533
原创 数据结构Note:伸展树(Splay Tree)
基本思想: 每个节点被访问时,使用旋转操作将其移动到根。 旋转是自底向上的,因此需要设置父亲指针核心操作:伸展Splay(x)保持伸展树有序性的前提下,将元素x调整到树的根部单次双旋,分若干种情况讨论!p->father x==y->left Zig(x)x==y->right Zag(x)p->father (令p=x->father)x==p->left p==p->father-
2017-06-06 20:05:51
417
原创 HNOI2017-伤感之中充满希望
几个月前,我曾经对这样一天满怀期待……为此,我立下了海誓山盟:认真读书,认真刷题,认真备考。 几个月后,我没有做错什么。我只是输给了现实。回到家,已是傍晚,转角,告别了车水马龙的街道,又仿佛倾吐了新的告白——期中考试在即,即将到来的是疯狂的七十二小时。或许,我也可以说,过去的,是疯狂的四十八小时。 夜幕降临,微城灯火通明。 我伏案,心却不曾平息。失败,是因为我不曾争取,这是我自己的选择。 如
2017-04-16 20:04:31
1237
原创 矩阵乘法在递推问题中的简单应用
这里我们以Fib问题为例。Fib数列是一个著名的递推数列,其规律可表示为f[i]=f[i-1]+f[i-2];我们要做的事,就是求出fib数列的第n项。由于这个数字可能很大,因此只需要输出它对10007取模的结果。 这里我们约定:对于80%的数据,n<10^8。对于100%的数据,n<10^10。几乎不需要经过多少思考,我们就能写出一个80分版本:#include <cstdio>using n
2016-10-29 19:29:30
481
原创 Dijkstra最短路径算法的优化
在传统的Dijkstra算法中,我们不难发现,大量的时间被用于遍历d[]数组。 因此,我们可以通过一个小顶堆来替代这个遍历过程。优化后的算法复杂度为O(v*lgn)。#include <cstdio>#include <cstring>#include <queue>using namespace std;#define MAXN 10005#define MAXM 500005#de
2016-10-06 13:31:56
1255
原创 动态规划基础题:低价购买(最长下降子序列)
题目描述“低价购买”这条建议是在奶牛股票市场取得成功的一半规则。要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买;再低价购买”。每次你购买一支股票,你必须用低于你上次购买它的价格购买它。买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数。你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票。每次购买都必须遵循“低价
2016-10-03 09:48:10
572
原创 动态规划基础题:机器分配
题目描述总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。输入输出格式输入格式: 第一行有两个数,第一个数是分公司数N,第二个数是设备台数M。接下来是一个N*M的矩阵,表明了第 I个公司分配 J台
2016-10-03 08:48:43
1819
原创 数据结构:从堆到“漏斗”
问题引入:黑匣子Black Box是一种原始的数据库。它可以储存一个整数数组,还有一个特别的变量i。最开始的时候Black Box是空的.而i等于0。这个Black Box要处理一串命令。 命令只有两种: ADD(x):把x元素放进BlackBox; GET:i加1,然后输出Blackhox中第i小的数。 记住:第i小的数,就是Black Box里的数的按从小到大的顺序排序后的第i个元素。
2016-10-02 22:14:24
477
原创 最小生成树Prim与Kruskal算法的比较
最小生成树是图论问题中很基本的一个操作。常用的算法有Prim和Kruskal两种算法。本文对这两种算法稍作区别与讨论。Prim算法是依赖于点的算法。它的基本原理是从当前点寻找一个离自己(集合)最近的点然后把这个点拉到自己家来(距离设为0),同时输出一条边,并且刷新到其他点的路径长度。俗称,刷表。 根据Prim算法的特性可以得知,它很适合于点密集的图。通常在教材中,对Prim算法进行介绍的标程都采用
2016-09-19 21:48:50
14631
1
原创 0-1背包的维度拓展
引言 0-1背包是经典的动态规划背包问题之一,也是多数背包问题的基础。0-1背包标准版本(完全表达)需要两个维度,一个表示物品i,一个表示代价j。优化后,可省去物品维度。那么,如果有两种代价又该如何呢?于是,我们将0-1背包拓展一个维度来进行讨论。核心讲解 取材于现实生活中,你要寄快递,快递对体积和重量均有限制。再比如,常见的军火运输问题,等等。从背包问题的原理来看,我们只需开两个代价维度就可以
2016-09-17 15:30:42
452
原创 【挫纪】多重背包问题的优化细节
众所周知多重背包问题的一个重要优化:二进制分解。 然而在二进制分解时,有细节需要注意。一、分解顺序问题 有时候脑子抽筋,会突然用位运算移位来直接获取分解结果。这种方法是不可取的,例如5=101,按照移位分解的方法就会分解为4+1,而事实上我们要分解成1+2+2二、分解后的冗余运算 分解之后会留下剩余的部分,对于剩余的部分,必须要一次性清除,万不可一次次处理,这样时间复杂度会很高。三、边分解边运
2016-09-16 16:07:50
435
原创 逆序对在OI中实际问题里的细节处理
之前写过一篇关于逆序对的描述文章: http://blog.csdn.net/mollnn/article/details/52503183 如果需要了解与逆序对有关的信息,见上文。本文主要交代,在OI中使用逆序对算法需要注意的细节:判断问题是否确实适合使用逆序对(废话)排序要求是升序还是降序排序要求中遇到等号怎样处理因为逆序对ANS通常很大,所以注意是否要开long long?对应的如
2016-09-16 14:27:13
418
原创 归并排序与逆序对
归并排序是一种运用了二分算法的排序,其基本原理可以理解为拆分对合并。利用归并排序可以便捷地求出逆序对的个数。参考代码如下所示:#include <iostream>#include <cstring>#include <cmath>using namespace std;int n,a[100000],x[100000],ans=0;void msort(int l,int r){
2016-09-11 11:50:50
471
原创 二分算法基础 第一章 简单二分
二分算法是一种效率极高的算法(思想),在很多的实例中都得以运用,比如快排和归并排序。本文将对二分算法的一些基础内容以及使用进行讨论。入门-二分查找 我们先来看一个二分查找的例子。(p2searching.cpp)#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>
2016-09-10 16:31:18
664
原创 快速幂算法基础
快速幂算法主要应用于求幂模的问题。 我们可以先定义一个问题: 如何求2^31的最后一位数?显而易见,结果当然是8.这个问题是具有特殊性的,可以用某些特殊解法来处理。但是作为我们对快速幂的学习例程来看,我们需要从特殊问题中寻找一般算法。 对于这个问题,最脑残的算法是:#include <iostream>#include <cstdio>#include <cmath>using name
2016-09-10 16:28:19
473
原创 C++STL中String类的分析与运用
[Mollnn.Fan原创,转载请注明出处] 本来以为有了String类,所有的字符串操作都变得非常简单。然后,在某次实际测试中反应出了很大的问题。原本只涉及到区区一个replace,在有参考资料的状态下10分钟轻松解决的问题,只因为忘记了replace函数的原型,导致了问题的复杂化。说实话,对于MFC的CString我或许更加熟悉,但应付竞赛需要,现在开始改掉用MFC的习惯。 在那道替换问题中
2016-09-06 12:55:44
465
原创 并查集初阶:畅通工程问题
畅通工程问题是一个很经典的并查集问题。不是说这一题不可以用图论来解决,而是这题用并查集的思想省时省力,何乐而不为?并查集类的补充:Count函数 在我之前的一篇文章中,用一个类封装了并查集的基本操作。而现在我们针对在畅通工程中遇到的一个问题,我们对这个类进行一个简单的拓展,也就是增加一个简单的Count函数。这个函数用于计算集合的数量。 int Count(int s,int e)
2016-08-29 21:11:14
811
原创 并查集应用:入门级
题目引用自洛谷。 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。第一行:三个整数n,m,p,(n以下m行:每行两个数Mi,Mj,1接下来p行:每行两个数Pi,Pj,询问Pi和P
2016-08-29 20:14:37
381
原创 并查集初探(一) 核心代码
在本文中,我们将并查集的基本操作封装为一个类,以便后面研究并查集的相关问题。class UnionFindSet{ public: int father[UFS_LIMIT]; UnionFindSet() { for(int i=0;i<UFS_LIMIT;i++) father[i]=i; return; } int Fi
2016-08-29 18:21:01
583
原创 秦九韶算法——高速的多项式运算解决方案
我们来设想一下,有一个次数为5000的多项式,需要10000次代入值查询,用传统的计算方法,时间复杂度有多高?每一次带入,根据需要2500*5000=1.25*10^7次运算,可以视为O(n^2)设带入次数为M,则复杂度为O(m·n^2)=O(1.25*10^11)有什么办法能降低复杂度,让这个目标在1s内完成呢?秦九韶算法就可以做到。通过数学上对多项式的一个简单变形,或者说,提公
2016-08-25 20:26:42
1480
原创 方格取数问题:双线动态规划
#include #include #include using namespace std;int main(){ int i,j,l,k,n,t1,t2,t3,t4,a[10][10],b[10][10][10][10]; cin>>n; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); while(cin>>t
2016-08-24 16:59:23
475
原创 过河卒问题:简单动规
#include #include #include #include using namespace std;const int hmx[8]={-2,-1,1,2,2,1,-1,-2};const int hmy[8]={1,2,2,1,-1,-2,-2,-1};int hx,hy;int check(long long int x,long long int
2016-08-24 16:01:33
987
原创 搜索与数据结构
最简单的搜索当然分为两种,深度优先搜索和广度优先搜索。这两种算法分别采用了栈和队列的数据结构来实现。对于深搜,优化方法通常是各种剪枝,主要包括最优化剪枝和可行性剪枝。对于广搜,优化方式通常是进行重复去除和优先搜索。通常都说能用深搜不用广搜,其实在一定条件下确实有道理。在很多情况下,深度优先搜索通常比广度优先搜索写起来简单、方便。同时,采用简单的递归方法来描述深度优先搜索,可以避开对数据结构
2016-08-24 12:39:30
721
原创 八皇后问题优化版(含代码)
之前发表过一个版本的八皇后,后来在洛谷上看到了另一个八皇后(其实是N皇后)。这个最大到达13,对剪枝要求较高。之前版本的程序有一个测试点无法通过。提供参考代码:本代码在输入13的时候可以在600ms内通过。
2016-08-13 19:56:05
2224
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人