摘要: #include#include#defineM10005#defineN1000005intnext[M];charp[M],s[N];intn,m;voidget_next(){inti=0,j=-1;//i为后指针,j为前指针next[0]=-1;//next[i]代表kmp不匹配时j跳回的位... 阅读全文
posted @ 2014-04-18 14:20 byluoluo 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 题意:一颗有n个节点的树,每个节点有val值和c(1-有陷阱,0-无陷阱)值,给出最大可踩陷阱数k。在树中任取一点作为起点,经过某点就取得该点的val值,踩到第k个陷阱后马上停止,而且不能走已走过的点。求最大累计val值。暴力方法:每点进行一次深搜求最大值。(这样竟然可以过= =,703ms)树形DP:子问题:最大值转化为求一个节点某子树的最大值和树的其他部分的最大值和。状态:dp[u][j]表示从以u为根,从u子树中某点走到u经过j个陷阱时的最大val值。难点:与“不超过 k 个求最大的长度”不同的是,该题是达到k个就马上停止所以增加一维表示方向,即dp[u][j][0]表示从非陷阱点走到u 阅读全文
posted @ 2014-04-09 14:51 byluoluo 阅读(475) 评论(0) 推荐(0) 编辑
摘要: 周赛。1/*2比较简单的一题3由于41、水平骨牌不能与水平骨牌相交,垂直骨牌也不能与垂直骨牌相交---即每边的端点最多只能与一边相连52、对于环,因为是正方形棋盘,没有斜边,所以环的边数一定是负数6所以,基于这两点,可以用并查集找链与环,然后减去一半或一半减一的边即可7*/8#include9#include10#defineN100511#defineM1051213inta[M][M],ans[N*2];14intfather[N*2];15intrank[N*2];16voidMake_set(intx)17{18for(inti=1;irank[y])36father[y]=x;37. 阅读全文
posted @ 2014-03-28 20:00 byluoluo 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 周赛题1/*2线段树+二分查找3处理比较麻烦,关键在用二分查找配合query()操作找从左往右第一个0和从右往左第一个045卡到的地方:61、区间更新不熟练72、关键点没想到83、低级错误位运算>9*/10#include11#include12#defineN5000513#definelsonl,m,rt>1;23build(lson);24build(rson);25}2627//s:置0-空瓶置1-摆花28voidupdate(ints,inta,intb,intl,intr,intrt)29{30intm=(l+r)>>1;31//不在范围内,不更新32if( 阅读全文
posted @ 2014-03-28 19:51 byluoluo 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题意:有n个k种细菌,每种细菌有ci个,各自标号为细菌之间(注意这里非种类之间)有m种转换关系,即u和v可相互转换,代价为x。若每种细菌内部可两两转换且代价为0,输出Yes,并且用矩阵输入各种类之间最小转换代价,不能转换的输出-1。否则输出No。思路:1、判断每种细菌内部可否两两转换且代价为0,可用并查集,对0边的两个细菌合并,最后判断每种细菌内部是否有共同祖先。2、各种类之间最小转换代价则用Floyd。1#include2#include3#defineN1000054#defineM5055#defineINF9999999967intfa[N],rank[N],vis[N];8inta[ 阅读全文
posted @ 2014-03-21 19:41 byluoluo 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 初步学习了下单调队列,一个比较简单的数据结构,即队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。详见 http://blog.csdn.net/code_pang/article/details/14104151题意:给出n(n2#include3#defineN100000545structQue6{7inti,x;//x为加入序号8}q1[N],q2[N];9intfront1,front2,tail1,tail2;10intminx[N],maxx[N],n,k;1112//递增找最小13voidadd1(inti,intx)14{15wh. 阅读全文
posted @ 2014-03-20 22:11 byluoluo 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 题意:求树每个点到其他点的最远距离。思路:选择一点作为树的根,令dp[u][0]为点u从子树中取得的最长距离,dp[u][1]为点u从子树中取得的次长距离,dp[u][2]为从父亲节点取得的最长距离则最远距离为dp[u][0]或dp[u][2]dp[u][0]和dp[u][1]比较简单,一次深搜求得dp[u][2]有两种情况,设a为u的父亲节点当u在a子树取得最长距离的路径上时,dp[u][2] = max(dp[a][1], dp[a][2]) + dist(a,u);当u不在a子树取得最长距离的路径上时,dp[u][2] = max(dp[a][0], dp[a][2]) + dist(a 阅读全文
posted @ 2014-03-20 20:26 byluoluo 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 题意:给出N个数A_1 to A_N和一个双向队列(两头都可以push),按顺序从N个数中取数,取出的数要么丢弃,要么从队列一端压入。队列中的数要求是不降。求最多能放入多少个数。思路:由于A_1 to A_N是按顺序取,因此可以从右往左求最长不增子序列a[i]和最长不降子序列b[i],然后枚举每个数作为第一个放入的元素,得到a[i]+b[i]-1。但是这还不是答案,因为两个序列是不降和不增,虽然从同一个数开始递增递减,类似 4 4 3 2 1 5 这样的数列,第二个4就计算重复了,所以要处理一下,减去重复的数。求最长不增序列和最长不降序列要用O(nlogn算法)。1#include2#incl 阅读全文
posted @ 2014-03-06 12:24 byluoluo 阅读(234) 评论(0) 推荐(0) 编辑
摘要: dijkstra是单源点最短路算法。借图:其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。红色部分:为什么是从V-S中取具有最短特殊路长度的顶点u?1、dist[u]是V-S 阅读全文
posted @ 2014-03-04 18:54 byluoluo 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 很神奇的一道题。 参考:http://www.cnblogs.com/kuangbin/p/3346037.html题意:“ 题目意思很简单。就是洗牌,抽出奇数和偶数,要么奇数放前面,要么偶数放前面。总共2^N张牌。需要问的是,给了A X B Y 问经过若干洗牌后,第A个位置是X,第B个位置是Y 是不是可能的。题目给的牌编号是1开始的,先转换成0开始。一开始位置是0~2^N-1. 对应的牌是0~2^N-1首先来看每次洗牌的过程。对于第一种洗牌:将奇数放前面,偶数放后面。其实每个位置数的变化就是相当于循环右移一位,然后高位异或1.对于第二种洗牌:讲偶数放前面,奇数放后面。其实每个位置数的变化就. 阅读全文
posted @ 2014-02-27 17:06 byluoluo 阅读(312) 评论(0) 推荐(0) 编辑