自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Sky

  • 博客(37)
  • 收藏
  • 关注

原创 NOIP 2005 篝火晚会 COGS 112(只是用到置换的一个小概念而已)

COGS上的标签是图论+群论。。(-__-)我可以说是乱搞吗。我们首先要构建出末态的环,如果构建不出来(比如A想和B相邻而B不想和A相邻)则无解。构建出来后我们把它变成一个序列。把初态也变成一个序列,就成了这样:A1, A2, A3, A4…… B1, B2, B3, B4…… 为什么初态用一个数组表示而不直接1,2,3,4……呢?因为把环拆开可以有不同的断点,也可以有两个方向去读取这个环。对于

2015-09-25 14:32:41 906

原创 NOIP 2008 双栈排序 (COGS 221) 二分图

哎,感觉自己写题很少独自想出可行的解题思路,要不是行不通,要不是会wa,要不就是想不出来。然而外界得稍微有点提示才能想出来。比如这道题,一开始自己想地乱七八糟的,单纯的贪心wa掉了,搜索t了。搜了下题解看到了二分图、p1[k] < p1[i] < p1[j]、不能在同一个栈中;这些内容自己才明白解这道题的一个方法。这么搞不行啊,要提高独立思考能力;谁都可以看懂,但是想出是靠能力的。刚刚小吐槽下自己捉

2015-09-25 09:12:32 279

原创 COGS 2027 RQNOJ 72 拔河比赛 背包

COGS上的2027是以那个拔河比赛为原型出的。题目模型都是给出一个数列,可以任意选多个数字求和,问可以得到哪些和,或者得不到哪些和。这种模型可以用背包来解,和作为体积,价值为选的个数。然而我们对于价值并没有要求,所以开bool型数组即可,感觉和floyd的传递闭包有点相似。拔河比赛:#include <cstdio>#include <algorithm>#include <cstring>

2015-09-24 06:52:34 437

原创 COGS 2043 猴子 并查集

这应该是昨天某神犇新传上到OJ上的题,看到分类标签是并查集,就欣欣然地去做了一下。说在前面:我做的时候题目中并没有说明数据范围,导致cheat一般地试出来了数据范围: n <= 20w, m <= 40w。乍一看好像很复杂的样子,不过想明白了思路还是很简洁的。虽说是某只猴子用手抓另一只猴子,但是效果是一样的,不管是A抓着B还是B抓着A,只要其中有一个或直接或间接抓着1或者被1抓着都不会掉落,所以这个

2015-09-23 17:00:29 1037

原创 Tyvj 2016 (Clover 9) 外星人 字符串匹配:KMP

比较简单的一道字符串的题,拿这个练练KMP,加深一下理解。 都说KMP不好理解,曾经自己理解了,但是很长时间不用,发现再次想的时候还有点困难。void KMP(char *s, char *t, int *f){ int n = strlen(s+1), m = strlen(t+1); f[1] = f[2] = 1; for(int i = 2, j = 1; i <=

2015-09-23 08:46:46 422

原创 SDOI 2009 (COGS 421)HH的项链 分块or树状数组

人生第一次接触分块。以前也听过分块的思想,不过实践这还是第一次,调了老半天。 很显然我就是用分块思想写的这道题。不过貌似正解是树状数组,但是鉴于分块比较好像,就写的分块。毕竟第一次写分块,先谈谈自己对分块的理解。刘汝佳叔叔貌似把分块算作数据结构。不过以我目前的理解程度,觉得分块更像是一种思想,一种优化暴力的思想。与分治不同,分治是把整个问题划分成小问题解决;而分块是把原问题划分成很多整块,对于每个

2015-09-22 20:51:10 1491

原创 NOIP 2012 同余方程 (COGS 1265) 求逆元 扩展欧几里得算法

TAT,感觉这是2012年NOIP唯一的一道我可以做的题。12年题都太神不忍直视,先写道简单的安慰一下自己。ax ≡ 1 (modb),其实x就是a的逆元。可以用扩展欧几里得算法来求。我知道的还有一种方法用欧拉函数,应该也可以用来接这道题。不过那个方法还需要筛素数,求欧拉函数,如果像这道题一样仅仅求个逆元是比扩展欧几里得算法慢的。然而在此之前我还不会写扩展欧几里得,算是借这道题学习了一下。 很多人

2015-09-22 11:37:19 418

原创 NOIP 2014(COGS 1805) 飞扬的小鸟 完全背包

AC之后发现这道题并不难。之前是各种不理解。而且写这道题之前我对完全背包的了解仅仅是转换成多重背包来做。这道题也算得上是第一次以正确的姿势O(nm)写完全背包。首先可以确定可以用DP的思想来解这道题,无后效性,最优子结构。 一个不过的状态表示就是f[i][j]表示要到达(i,j)这个点最少点击屏幕的次数,由此也很容易想到一个转移:枚举上一个横坐标上点击屏幕次数f[i][j] = min{f[i-1

2015-09-21 19:25:41 334

原创 NOIP 2003 麦森数 COGS 41 高精快速幂+神奇的位数计算公式

TAT,一开始读错题了,以为输出的位数是超过500就默认输出500的。还奇怪为什么评论区里大家都在说什么位数计算公式,对数计算的换底公式啥的。 原来输出的是原数的位数!对于一个数k,它的位数是lg(k)+1。然而对于这道题得到一个可以放到cmath函数中的k是很困难的,题目要求的输出也只是500位。但是题目给我们的是k = 2^n - 1中的n,那么就可以用换底公式计算了,lg(k) = log2

2015-09-21 15:02:23 1161

原创 AHOI 2009 行星序列 BZOJ 1798 COGS 1272 线段树模板题:加、乘标记

裸的不能再裸的线段树,拿这个练练手,防手生。 需要两个标记,加和乘。列个式子看一看就能明白:当新标记是加时,直接加到原加标记中,新标记是乘时,既要乘到原乘标记中,还要乘到加标记中。这样在pushdown时先下放乘标记再下放加标记即可。需要注意的是不要忘了在修改时是要pushdown两遍的,其实第二次说是maintain更合适,因为只需要再计算一次sum[p] = sum[lc]+sum[rc],直

2015-09-21 11:13:25 322

原创 NOIP 2006 金明的预算方案 (裸?)分组背包

或许还有其他方式,不过我就是按分组背包写的,几近裸题。 我也是纳闷,前两天刚刚做过一道分组背包的题,理解了分组背包的正确打开方式,今天却差点没想出来。真是。。。该去睡一会。对于每个物品以及它的附件,我们把它们拆开,使它们成为独立的物品。因为每个物品最多有两个附件,所以最多会拆成4个新的物品:原主件,原主件+附件1,原主件+附件2,原主件+附件1+附件2,这样一来就没有依赖关系。但是,对于每个物品以

2015-09-19 15:47:42 653

原创 C++读入输出优化

C++的读入优化是基于scanf函数读入int是比较慢的现实(但比cin要快好多好多,在很多情况下是最佳选择),这个比较慢是与读入字符比较。在一些输入数据很大的题中使用读入优化效果会很棒,有时可能让一个原本会T的代码“复活”。int get(){ char c = getchar(); int x = 0; while(c < '0' || c > '9') c = getc

2015-09-18 15:41:26 8468

原创 排列数A(n, m)的计算

排列数是在n个互不相同的数中选出m个能组成的不同次序的排列的方案数。 公式上就等于组合数*全排列,即A(n, m) = n! / (n-m)!可以说是a1*a2*a3……*am,ai = n-m+i。所以也是一个巨大的数,在计算时通常会要求模P。举一道题:http://cojs.tk/cogs/problem/problem.php?pid=2037 给出n, m, p,求A(n, m) %

2015-09-18 08:58:05 8320

原创 NOIP 2012 国王游戏 贪心 高精度 (COGS 1263)

T^T,太桑心了,自己搞了好长时间的高精度,当最终搞出来没问题的高精度之后,就来写这道题了。却不曾想到自己倍增式的低级高精除T掉了。T^T…… 还是再好好搞搞高精除吧。。。来说这道题的贪心思路,又是一个与顺序相关的,不过与上一次写的那个矩形分割不同,这个并不是很容易能看出来或想出来,需要写一写。假设一个最佳序列a1,a2,a3,a4……i,j……an。 设k = l[a1]*l[a2]*l[a3

2015-09-17 19:32:55 448

原创 关于Vim的使用:如何更改默认字体和取消自动备份

在Vim的安装目录中找到_vimrc文件,用Vim或记事本打开,在最后加入几行命令即可。更改默认字体:set gfn=Courier_New:h12 courier new 为字体名称 :h12为大小 取消自动备份:set nobackup

2015-09-17 18:30:45 403

原创 高精度

碰到了好多需要高精度的题,于是决定好好练一练高精度,所以就写了写模板。目前并不完整,因为当下的这道题还不需要减法和除法,所以模板中暂时只有加、乘、比较,而且不包括负数。对于乘,算是特殊的性质,可以直接按代码里的那么搞,代码的正确性无疑的。struct BigInt{ int a[M], h; bool neg; BigInt(){ h = neg = 0;

2015-09-16 20:12:28 320

原创 COGS 498 TYVJ 1094 矩形分割 贪心

这道题最容易想到的是DP,但是基于数据范围,DP并不是很容易实现。空间会爆。于是可以想贪心,我们每次都割开最大代价的边。如何证明这个的正确性呢,其实我一开始不是这么想的贪心,我想的是:割一条竖边对其他竖边是没有影响的,而会使横边代价都多计算一次。那么我们对于一块木板,比较横边代价和以及竖边代价和,在那个比较大的一类边中选一个代价最大的。看似比较合理,但是实际操作一下却能证明它是错的,那么我们回到最初

2015-09-16 19:30:27 358

原创 HDU 1002 A+B Problem 高精度加法

真是愤懑,要注意输出格式。 出现“Presentation Error”是输出格式错误,一般是多了或少了个回车。而Presentation是演示文稿的意思?! 真是愤懑,比POJ还****,让蒟蒻再哭一会。本来打算今天下午练习练习高精度,写出个高精度模板,结果在这卡这么长时间。T^T#include <cstdio>#include <algorithm>#include <cstring>

2015-09-16 15:44:26 399

原创 乱搞一发: 平面上最接近点对 (COGS 1159)

给出一些点的坐标,问这个平面内最接近的一对点的距离是多少。 这貌似是一个经典的分治问题。然而裸分治很容易T,需要加一些优化,然后我就不想写了。不过最终还是花式乱搞过了这道题。 本质还算是枚举,只是用单调栈减少了枚举量优化了时间。假如i,j是距离最近的两个点,那么假设j在i的右上方,那么我们在枚举时就必须要枚举到i的右上方的点,不能剪枝把j减去。 对于“右”,我们先给点按横坐标排序;对于“上”,

2015-09-16 08:27:14 441

原创 双向BFS解八数码问题: POJ 1077

题意:很简单,八数码问题很经典,应该都了解。不过需要注意一些细节:末态为12345678x,输出中u(up), d(down), l(left), r(right),描述的是x的移动方向,而不是那个方向的块移向x。蒟蒻目前还不会什么高端的算法,只能暴力一点写BFS。 不过也是刚刚了解到双向BFS,就拿这道比较简单的题来练练手,第一次写双向BFS。http://blog.sina.com.cn/s/

2015-09-15 15:03:38 394

原创 POJ 1947 树形DP(分组背包)

题意:给一棵树,n个节点,问最少删去几条边,可以删出一棵含有p个节点的子树。TAT,感觉DP已无爱,自己想的状态和转移交上去就是WA,自己也暂时证明不出来哪里错了。 最后还是去搜题解,按大部分人AC的思路写出来。感觉单单这样AC,好没有意义。不过这道题至少让我知道了分组背包这个东西。模型就是,物品被分了组,每一组只能选一个。解决方案每一组都像0-1背包一样枚举,状态不变,转移不变,仅仅是对于每一组

2015-09-14 21:35:49 427

原创 HNOI 2008 玩具装箱 (BZOJ 1010)进一步学习 →.→ DP 单调性优化

再一次接触单调性优化DP,比上一次好一点,但还是很吃力,需要多加练习。 这道题有不同程度的优化,也被作为很多课件里例题讲解DP的优化的,再加上这道题很简单,所以就选择这道题来理解一下斜率优化。状态以及转移很容易想出:f[i]表示前i个玩具装箱的最小代价,f[i] = min{f[j] + w(j+1, i)}。但是裸DP是O(n^2)的复杂度,5w的数据范围是过不了的。在状态上已经很难再变化了

2015-09-14 16:35:37 951 1

原创 普通树转二叉树:左儿子右兄弟表示法

这两天在吃力地学DP的优化,被虐地不行不行的。搞个小插曲。  左儿子右兄弟,顾名思义,是一棵转换后的树,它是一棵二叉树,一个节点的左子树表示的是原树中这个节点的子节点,一个节点的右子树表示的是这个节点在原树中的兄弟(父节点相同的点)。  这么表示有什么好处呢?在DP时二叉树的优势相比于普通树是很明显的,或许有时它不能优化时间,但至少可以优化“思路”。  最近并没有碰到要转二叉树的题,也

2015-09-12 15:49:48 15202

原创 Vijos 1243 初探单调队列优化DP

这是第一次接触单调队列优化DP,心想借这道题熟悉一下单调队列优化DP的写法,并加深一下对此的理解。理解是有了,但当被这道题卡了一天后,理解都要忘得差不多了。有一些DP的状态转移是从之前的某些状态中取一个最值,那么它就有可能用单调队列来优化。比如这道题,我们可以轻易的想出状态表示:f[i][j]表示第i个步骤,在第j台机器上完成时,前i个步骤的最小花费。对于状态转移,有两种思路,其中

2015-09-09 16:47:17 314

原创 TYVJ 2218 最大矩阵

最近模拟赛略频繁,导致博客有点断片,自己的计划有点停滞不前,以此来督促一下自己。题目中说两个矩阵不可以相交,那么这两个矩阵肯定就可以被一条线在原来的矩阵中分开,当然可能是横线也可能是竖线。所以我们可以枚举这条分割线,最多枚举200次,这样枚举的前提就是我们已经求出了分割线两边的大矩阵中的和最大的子矩阵。那么就是,给出分割线i,以竖直的为例,我们要求的是(1,1)-(n,i)这个大矩

2015-09-09 14:00:30 282

原创 Huffman编码 POJ 1521

写题解之前真的想先默念三声:傻逼题傻逼题傻逼题。这是我第一次在博客里爆粗口,因为这道题黑了我20次提交记录,满页红。这道题很水很水,连模板题都要算不上了,为什么要写到这里呢,因为这是我第一次了解到Huffman编码。题意:题目描述的很复杂,但是搜题意的时候发现大家基本都说的很简洁,就是让你求Huffman树的带权路径长度。然后输出原字符串占用空间(原每个字符占用8位),

2015-09-07 10:21:53 1747

原创 NOIP 2000 方格取数 NOIP 2008 传纸条 多线程DP

这两道DP基本是一样的,相隔8年的noip出了同样的题也是奇怪。COGS 和TYVJ 上都可以找到这两道题,直接搜题名即可。都很简单,我是先写的传纸条,后来才发现的方格取数这道题,于是直接粘了代码。我们先来说传纸条:有来、回两次行走,而且不能有路径交叉。我们可以转换为一次行走,有两个人同时行走,形象地说为多线程。只要每一时刻都保证两个人不在同一点上就可以保证路径不会交叉

2015-09-07 09:34:46 467

原创 NOI 1997 积木游戏 (COGS 261) DP

是的没错就是这道题,在我上一篇博客中所说的DP的题。为什么它卡了我这么长时间呢,因为我的做法比较奇葩(归根结底还是DP比较弱)。我是这么想的:f[i][j]表示前i个积木,堆成j堆的最大高度和。这样想的状态的话方程就很好写了:f[i][j] = max(f[i][j], f[k][j-1]+h[k+1][i]) (j之后就要求h数组,那么先想清楚h[i][j]表示的是[i,j]

2015-09-04 21:40:28 1548

原创 NOI 2007 社交网络 (COGS 15) Floyd求最短路及方案数

发现自己DP真是弱,今天上午到现在还没AC那几道DP的题,然后决定写一道其他的题增加一下自信。TAT这道题主要考察Floyd求方案数。首先在一个保证每两个点互相可达的图中,设f[i][j]表示i到j之间最短路径的条数,初值为1。在Floyd求最短路的过程中,当有d[i][k]+d[k][j]这道题几近一道裸题了,之后再写三层循环按照题目给出的公式求出每个点的重要值即可。

2015-09-04 17:19:13 386

原创 POJ 1952 DP LIS求方案数

题意:给一个序列,求最长不上升子序列长度以及有多少个这样的子序列。注意:看起来相同的子序列被算作一种方案。例如:421421的方案为442,441,422,421,411五种。对于需要求方案数的LIS,求长度时就老老实实用O(n^2)的DP算法吧。f[i]表示以i为最后一个数的最长不上升子序列,if(a[i] 主要是方案数,题目要求看起来相同的是被算作一种的,我们先设d

2015-09-04 08:51:26 472

原创 组合数C(n,m)的计算

n个互不相同的数的全排列是n!个。一个有n个元素的集合的含有m个元素子集的个数为C(n,m)。C(n,m)的计算方式:1.公式:C(n,m) = n!/((n-m)! * m!),在算法上较难实现,阶乘很快会爆long long2.递推:C(n,m) = C(n-1,m-1) + C(n-1,m)在算法上当然会采用第二种方式计算,而且因为C(n,m)本身值很大,所以大多数碰见它

2015-09-03 18:25:23 7664

原创 NOIP 2010 关押罪犯 二分答案+二分图染色判定 COGS 520

紧跟着上一道乌龟棋就写了这个题,这道题当时是讲并查集的时候提到的,但是到目前为止蒟蒻还没有想明白怎么用并查集搞这道题,所以就写二分图的染色。首先可以判断这道题的答案是满足单调性的,假设二分的答案是mid,那么大于mid的仇恨关系都不在同一监狱中,那么当二分的答案是mid+k时,大于mid+k的仇恨关系当然也是可以不在同一监狱中的。所以可以使用二分,二分答案后如何判断当前答案

2015-09-03 09:02:13 841

原创 NOIP 2010 乌龟棋 DP (COGS 519)

深知自己DP很弱,昨天被POJ上的一道DP题卡了一个晚上,而且是想不出来状态,写不出来方程的卡住。TAT所以来写一道水一点的找找自信。说水也不水,因为我一开始想的状态是f[i][c1][c2][c3][c4]表示在第i个格子,第i种卡牌剩ci张时所得的分数,状态转移就是f[i][c1][c2][c3][c4] = max(f[i-1][c1+1][c2][c3][c4], f[i-

2015-09-03 08:52:06 239

原创 埃拉托斯特尼筛法求素数表

写这篇博客就是给自己留个简单实用的筛素数表的模板而已。  bool prime[M]; prime[0] = prime[1] = 1; for(int i = 2; i*2 <= M; i++) prime[i*2] = 1; for(int i = 3; i*i <= M; i+=2) if(!prime[i])

2015-09-02 16:29:49 649

原创 POJ 3159 差分约束系统 最短路

题意:分糖果,有n个人,m个要求,每个要求的描述是A,B,C,代表B的糖果数-A的糖果数很明显可以看出来是差分约束系统,但是自己对差分约束系统的理解还不是很透彻,对于跑最长路还是最短路以及得出的解的性质以及超级源点的设定的理解还不是很彻底。等有时间一定再去学一学。这道题最后问d[n]-d[1]的最大值,就是说是最长路,约束条件为d[B]-d[A] <=C,是最短路的松弛

2015-09-02 14:12:01 339

原创 CODEVS 2536 奖学金 (2013年省队选拔赛天津市队选拔赛)

这道题没有用到高端算法,只需要一个堆,C++ STL中的即可。首先说明这道题答案不满足单调性,不能排序、二分,因为score高的可能money很小。那么我们就只能枚举中位数。对于每个人,我们在所有成绩小于他的人中,找出n>>1个人money和最小,用l[i]表示这个和,再在所有成绩大于他的人中,找出n>>1个人money和最小,用r[i]表示。那么我们可以想到排序,按score关键

2015-09-02 09:46:32 1186

原创 POJ 2054 谜一样的贪心 TAT

题意:给一个树形图(边为有向边的树),每个节点有一个权值Ci,要求给每个节点染色,要求是如果想对一个节点染色,那么必须保证它的父节点已经被染过色。求一个最小的染色代价,每个节点的代价是ki*Ci,ki代表在整个图中,节点i是第ki个被染色的。// 如果想直接看AC思路,请跳过接下来这几段,并忽略第一份代码  T^T~-----------------------------

2015-09-01 18:56:27 1194

空空如也

空空如也

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

TA关注的人

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