自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

getupdown的博客

个人博客

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

原创 Mybatis初探——对象关系

紧接着上一章 Mybatis初探——流程走一遍,得出了文末的结论。 其实我觉得,对于一个框架,最重要的研究透,其中的对象关系。 这个对象关系体现在:这个对象封装了什么,和其他对象的关系是什么?一对一?一对多?……这一章节开始研究mybatis框架中,各个对象之间的关系。2. 相关对象接上文,我们对刚刚过程中StaticSqlSource一波断点操作,我们发现,和sql语句相关的...

2018-06-30 00:50:15 544

原创 Mybatis初探——流程走一遍

对于自己每天用的东西,会用不够,并且要知其所以然。这个专题中我会随便写一些关于现在主流框架的源代码研读。 好奇心是最好的老师。 今天从mybatis写起。我看的是3.4.3版本的mybatis源码,是结合spring-mybatis一起读的。 更重要的是大家自己去一步步跟进代码,研读1. mapper是如何映射到一个真实可调用的类的经过一番探索,发现mapper是使用jdk的动态...

2018-06-30 00:42:04 462

原创 ThreadLocal探索

实现假设有如下代码class Single { public static ThreadLocal<Integer> ThreadLocalA = new ThreadLocal<>(); public static ThreadLocal<Integer> ThreadLocalB = new ThreadLocal<>...

2018-03-20 19:26:18 181

原创 Kingdom Division ——hackerrank

题意:给一棵树的每个节点涂色(红或黑),使得任意一个红结点周围不全是黑结点,并且任何一个黑结点周围不全是红结点,问这样的涂色方式有多少种。 链接:这里写链接内容 思路:树形dp。 dp[i][0/1][0/1]表示第i个节点是红色/黑色的时候,其叶子 不全部和他相反/全部和他相反的情况下,其代表子树涂色种类数。方程: dp[i][0][1] 为其叶子的dp[v][1][0]的乘积 dp[i

2017-06-22 23:58:17 554

原创 51nod 1337 翻转游戏

这个题的关键在于那些?的要求,因为是?所以不用一下子满足,这就是这个题的玄机了。于是我们可以“顺便”把这些 “对于当前关是?,但是对于以后的关不是?” 的灯给进行操作。这样就可以减少次数了。#include#include#include#include#include#define LL long long intusing namespace std;char m

2017-05-05 23:43:50 271

原创 51nod 1405 树的距离之和

这是一个树形dp的思想,两次dfs。第一次dfs处理出,对于每个u,其所有子孙节点到其的距离之和。第二次dfs处理出,对于每个u,所有点到其距离之和。#include#include#include#include#include#include#include#include#define LL long long intusing namespace std;

2017-05-05 23:34:15 228

原创 51nod 1469 淋漓尽致子串

这个题的官方题解是用 后缀自动机 做的,我用后缀数组完成了这道题。首先,我们来定义一下淋漓尽致子串。1.令原串为S。2.设子串的长度为len,在原串S中出现的次数为k,令其出现的位置为p1, p2, ....pk(即这个子串在原串中[pi,pi + len - 1]中出现)。3.若k=1,则该子串不是淋漓尽致子串。4.若存在pi,pj(i != j),使得S[pi

2017-05-05 23:28:10 415

原创 51nod 1461 稳定桌

这个题直接考虑:每种长度的桌脚,分别作为最长的桌脚的情况。根据这个枚举。对于最长桌脚x,所以大于x的长度肯定必须要砍掉。对于小于x的桌脚,尽量多地保留x(尽量少地砍x),其实就是不砍。然后看CF上的原题比这个简单,主要是因为CF上那个,桌角的长度只有200以内,所以可以开桶。但是51nod这个题长度有100000,所以不能扫描桶了。所以这里我使用一个Treap 每次算出前k

2017-04-26 15:23:01 323

原创 51nod 1674 区间的价值 V2

题目链接:点击打开链接这个题很明显是要从位运算的角度去考虑的。考虑“与运算“ 和 ”或运算“  的性质。与运算,是只要有一个0,那么就都是0或运算,是只要有一个1,那么就都是1考虑样例:3: 0114: 1005: 101假如现在扫描到了第三个数5,那么就是要求 (3 & 4& 5) * (3|4|5)按位扫描,最高位有2个连续的1,意味着最高位可以对答案贡

2017-04-20 14:51:18 232

原创 51nod 1524 可除图的最大团

题目链接:点击打开链接这个题如果往图论上不行,因为边太多了,所以我往数的角度想。如果能组成一个集合,那么这些数从小到大排,两两之间肯定有倍数关系。所以用dp[x]表示,到x为止,能组成的最大集合。用一个arr数组表示,这个数有没有在集合中出现。不会超时,因为每个状态只需要走一次,而且转移的同时会覆盖掉没覆盖的状态。用一下读入优化好一些。#include#include

2017-04-20 00:46:19 236

原创 51nod 1503 猪和回文 (dp + 优化好题)

题目链接:点击打开链接这道题是个dp计数问题,朴素的dp方程其实并不是很难dp[x1][y1][x2][y2]表示当从左上角走到x1,y1 从右下角走到x2,y2时的状态总数,然后根据上下左右,字符是否相等转移即可。但是这里的4维都是高达500的,首先这么大的DP数组肯定是开不下的,所以一定要优化。思考转移过程,因为这里要求是回文,所以我们肯定是从 两个相同字符长度 转移到 下一个

2017-04-20 00:16:09 407

原创 51nod 1076 2条不相交路径(边双联通分量)

题目要求从S到T是否有两条“不相交的路径”,意味着S到T中间没有必经之路,这样才可以做到两条不相交的路径。那么这个问题就变成了,从S到T,路上是否有桥在同一个边双联通分量中,每两个点之间都有不唯一的路径相互可达,也就意味着没有桥。所以只要用dfs处理出所有的边双联通分量,对S和T判断一下是否在同一个边双联通分量即可。#include#include#include#i

2017-04-13 00:58:22 321

原创 51nod 1460 连接小岛 (贪心)

对于每两个相邻岛屿,通过简单的计算,可以得出可以连接这两座岛之间的 所需要的桥的 长度范围,有n-1个这样的范围然后就相当于用m个点,其中抽出n-1个点去对应n-1个区间。我的做法是把所有的区间按照右端点从小到大排序,,右端点相同按照左端点从小到大排序,然后用multiset去存桥的长度,每次lower_bound一下,判断一下时间复杂度O(nlogn)。#incl

2017-04-13 00:49:38 427

原创 51nod 1103 N的倍数 (抽屉原理)

这题乍一看是普通的背包做法,但是发现时间复杂度无法承受。发现mod的是n,余数有0~n-1这些情况,一共有n个数,如果有余数为0的,那么就直接出答案了。如果没有,即1~n-1中,但是有n个数,说明至少有2个是余数相同的(抽屉原理)。对于普通的数,这个性质看上去没什么用。但是,对于前缀和就有用了。有n个前缀和,至少有2个前缀和是相同的。那么这两个下标中间的部分就是我们要的

2017-04-13 00:46:02 308

原创 51nod 1478 括号序列的最长合法子段

题目:点击打开链接用一个栈,每次弹栈之后,读取弹栈之后,最高的那个下标,那个与当前坐标的差就是最长的序列。如果说是判断合法括号串,那么扫描一遍之后如果栈空就说明合法,对于括号子串也是如此,只不过是“部分空”,所以读取“弹栈之后,最高的那个下标”,当前下标与其做个差就是当前长度。一开始可以存一个"-1"修正一下。#include#include#include#include#i

2017-04-04 17:13:46 386

原创 51nod 1453抽彩球

题目:点击打开链接做法:“对于所有颜色为i (1的球,他的最后一个球总是在编号比他大的球拿完之前拿完”,也就意味着,i拿完的时候,不可以有它前面的球没拿完。假设现在拿完了第i种球,准备在其中插入第i+1种球(第i+1种球有t[i+1]个),就相当于,在这些球的最后一定要放一个i+1号球,设没放i+1号球的球数为cnt,cnt个球会产生cnt+1个空,问题就转换成了:在cnt+1个空中,

2017-04-03 22:24:23 373

原创 51nod 1712 区间求和

题目链接:点击打开链接解法:这个题首先考虑一个简单情况:对于区间[x,y],权值为多少。容易写出公式:F[x , y] = S[y] - S[x-1] - (sum[y]-sum[x-1])*(x-1)+sum[x-1]*(y-x+1)其中S[x]表示 从第一个元素到第x个元素的 所有有序二元组的和(题目中定义的),sum表示前缀和整理一下就是:F[x , y] = S

2017-04-02 15:23:37 247

原创 Prefixes and Suffixes - Codeforces432D(后缀数组)

给一个串,找到这样的子串:它既是这个母串的前缀,又是这个母串的后缀。统计这样的串的个数,长度和在母串中总共的出现次数。解法:首先把后缀数组排出来,找到代表母串的那个后缀的rank,这个rank设为st。有一个结论比较重要:“设有一个子串x满足这个条件(它既是母串前缀,又是母串后缀),设这个子串所表示  的后缀  的位置为r。则r上面就必定没有和这个后缀相等的串了。”

2017-03-24 22:06:41 485

原创 Hdu 5769 Substrings (后缀数组)

后缀数组的一个功效是统计一个串里多少个不同的子串。 这个题就稍微改了一下,其实大体做法不变。 他要求 至少包含1个指定字母 的子串。 所以反过来想,所有子串 减去 不包含指定的子串 就可以了。 前者是个基本问题,重点是后者。字符串从后向前扫描一遍,处理出每个字符开始,向前延伸最大多少,不包含指定字母(near数组)。 然后就相当于每个后缀都减少了一段,并且要改造height数组。 h

2016-12-16 14:04:07 308

原创 2016ICPC青岛网络赛 1006

欧拉回路/欧拉通路。如果不是欧拉回路,欧拉通路,或者 点数大于1的 连通分支数  大于1 直接impossible。如果是欧拉回路:每个点都可以作为起点,除了终点多算了一次进入外,对于这些点来说,每个点进出次数都是成对的,而这个对数就是序列中该点出现的次数。由于异或的性质:x^x=0 && 交换律  -> 出现次数是偶数可以不统计,奇数的统计一次即可,所以对于所有点,求 该

2016-09-17 18:39:47 472

原创 2016 ICPC 青岛网络赛 1005

把每个手势看做点。只有入度和出度相等时,并且和其他每个点产生关系的时候,才可以做到50%。所以(n-1)/2得是整数,即n是奇数的时候可以成立,否则就是不成立的。#include #include #include #include #include using namespace std;int main(){ int n,k; scanf("%

2016-09-17 18:25:16 471

原创 2016ICPC青岛网络赛 1011

先用BFS过滤出最短路中的路径,然后最小割最大流定理。#include#include#include#include#include#include#include#define PII pairusing namespace std;const int maxn=1200;struct Edge{ int from,to,cap,flow,residual;/

2016-09-17 18:20:32 552

原创 2016ICPC青岛赛区网络赛 1004

思维题。一定要特判L=0的情况。详见代码。#include #include #include #include #include using namespace std;int main(){ long long L,R,ct; while(scanf("%lld%lld",&L,&R)==2){ if(L==0){

2016-09-17 18:19:18 757

原创 2016ICPC青岛赛区网络赛 1002

用打表方式求出极限,注意系统四舍五入,输入数据很大,用string存,并且卡常数。上代码。#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef l

2016-09-17 18:17:09 772

原创 2016ICPC青岛赛区网络赛 1001

打表即可#include#include#include#include#include#include#include#define ULL unsigned long long intusing namespace std;ULL pow2[40];ULL pow3[40];ULL pow5[40];ULL pow7[40];int li2;

2016-09-17 18:15:17 598

原创 POJ3678 Katu Puzzle (2-SAT检验)

这题是2-SAT的经典题,鉴于n*m挺大的,所以就用强连通缩点的方式检验。3种逻辑操作很简单,建边不难,注意对称性。如果碰到 A && B==1 -> A=B=1 建立边是 从 ~A到A,从~B到B 连一条的。 其他的注意细节就好了。#include<iostream>#include<string.h>#include<string>#include<algorithm>#includ

2016-08-27 23:48:56 437

原创 Mega Man's Mission UVA11795(状态压缩dp)

大意: 主角自己有一些武器,然后每个机器人身上有一些武器,每个机器人需要用特定的武器才能消灭。 问,有多少种消灭机器人的顺序。思路: 用 dp[S][i] 表示现在消灭的机器人集合为S(获得的武器也隐含在其中了,不用再开一维),而且是通过消灭第i号机器人到这个状态,这个状态下的顺序总数。我的代码用了一个atk[S][j] 数组,表示在消灭了S这个集合机器人的情况下,能不能消灭第j个机器人,这样

2016-08-27 23:42:40 499

原创 hdu 3666 THE MATRIX PROBLEM (差分约束系统)

首选把不等式改写一下,对于元素 Xij L<=Xij*ai/bj<=U 这里是乘法,但是差分约束系统需要加法,所以就取个对数,这样不等式就有了。这里的数据量比较恐怖,用bellman-ford是要超时的。 这里我用了spfa,然后一个点入队伍超过sqrt(n+m)次(注意转换double),就说明有环。 正常情况下应该是超过n+m次才可判定,但是这里我看网上题解,大多都说sqrt就够了。

2016-08-27 23:38:12 428

原创 The Ninja Way POJ3815 (差分约束系统)

就是一个忍者,要从最矮的树,依次跳过N-1颗到最高的树,一次跳跃水平距离不得超过D,现在给了所有树的高度,以及他们的相对位置,问如何摆树,让最高树和最矮树距离最大。思路: 差分约束系统,设dis[i]表示树i的距离,这里的不等式有如下: ①首先树不要按高度排序,两两之间坐标不可重合,且保持相对位置。 ②然后树按高度排序,两两之间距离不可超过D。然后 最高树在最矮树的左边或右边 两种情况不太

2016-08-27 23:33:49 501

原创 Hidden Password (后缀数组,字符串的最小表示法)

据说这个有更快的算法,在这里我是用后缀数组做的。首先把原字符串再复制一次,然后把这个新字符串做后缀数组。 直接排序出来,排第一个的就是答案。 不过这个题还有个要求,就是如果多解,输出最前面的。我是这样处理的。 设输入的字符串是S。 处理成这样:SS+一个最大的字符+0号字符(这个是后缀数组的修正)。 由于字符串的比较特性,碰到最大的字符肯定排到较为后面,而且越后面的后缀越容易先比较到这个大

2016-08-24 00:23:45 394

原创 Repeats SPOJ (后缀数组,寻找一个重复次数最多的子串)

思路: 如果说有一个循环节长度为k的字符串出现,那么,字符串里必定有str[0],str[k],str[2*k]….中的至少2个,在那个子串里。所以就直接枚举循环节长度k,向后匹配,向前匹配,看看最长能到几个。向后匹配直接用LCP,RMQ的方法就可以了。 向前匹配,我看有些人是倒置,然后又求了一遍后缀数组。 但其实不用这样,可以用向后匹配的个数。因为,如果要存在循环长度为k的子串,显然最后匹配

2016-08-24 00:16:21 362

原创 Adventure of Super Mario UVA10269(floyd+dijstkra+动态规划)

题目大意就是:马里奥有个可以用K次的魔法鞋,然后每次魔法鞋可以穿过不超过L米,并且不可以穿过城堡,问最短时间。思路:用dp[i][j]表示,到第i个点,还剩j次魔法鞋使用机会的最小时间。这里预处理是用Floyd做的,floyd的本质就是枚举一个中间点,然后再枚举两边,所以只要中间这个k是城堡就直接跳过,不是的话就跑floyd。#include#include#inc

2016-08-24 00:00:18 454

原创 POJ 1364 King (差分约束系统)

题意大致是:给你一些关于一个数列的条件,问你这样的数列是否存在。比如a[k]+...a[k+ni-1]>x 或者 a[k]+...a[k+ni-1]思路:直接表达成前缀和,这样就会出现形如 d(v)(因为只要判断有没有负圈,所以不用超级源点)#include#include#include#include#include#includeusing namespa

2016-08-23 23:53:06 218

原创 Word Rings POJ2949 (Bellman-ford算法,找平均值最大的环)

题意本身比较简单,就是找一个平均值最大的环。 在做这个题之前,我们先解决一个问题,如何找到一个平均值最小的环。设有一个环中,有k 个点,那么这个环的平均权值X是: X=(w1+w2+w3+,..,,,wk)/k 然后我们把k乘过去:(w1+w2+…..wk)=kXBellman_ford算法的一个重要作用是判断负圈,所以这个题可以利用这个特点来做。 再把(w1+w2+…..wk)=kX处理一

2016-08-23 23:42:27 965

原创 Substrings poj1226 (后缀数组)

给n个串,找到一个字符串S。 使得,每个串里要么有S,要么有S的反转。首先构造字符串,把每个字符串和其反转连接在一起(这个中间也要用字符分割!!很重要!!),然后用一个字符(不会出现在串里的)分割。然后二分答案,分段数组,检验。答案错误的同学们试试看 1 2 bcbcb bcbcb 这个东西。#include<iostream>#include<cstdio>#include<cst

2016-08-19 19:22:06 303

原创 Relevant Phrases of Annihilation SPOJ (后缀数组)

给n个串,要找到一个字符串,这个字符串在这n个串里都出现至少两次,并且不套叠。先把所有的字符串连接起来(注意用一个不会出现在原串里的字符来分割,最好还是用不同的) 然后二分答案ans,去分段height数组,维护每一段里面,n个最大的出现位置和最小的出现位置。 对于这n个串的每个串,最大位置-最小位置>=ans才是可以的(否则要么是只出现一次,要么是套叠) 还有注意特判一下没有出现的情况。详情

2016-08-19 19:18:34 251

原创 Power String poj2406(后缀数组+DC3算法)

这题其实应该不是用后缀数组做的。。。但是就当做练习吧。 倍增算法在这里会被卡掉,所以要用DC3算法。。这里我是套模板的。。重点就在于,怎么找这个循环节。 做法是把height数组出来之后,枚举一下长度。 设长度为i,如果满足条件的话。 后缀0(整个串)和后缀i的LCP是 length-i 这个做法很巧妙,学习了。//42704K 2829MS C++ 2709B 2

2016-08-16 23:10:05 1293 2

原创 New Distinct Substrings (后缀数组,统计有多少个不同的子串)

首先要确认一个事实:任何一个子串都是一个后缀的前缀。 根据这个,首先处理出height数组。对于样例:ABABA 后缀数组处理出来是这样的结果。 A 0 ABA 1 ABABA 3 BA 0 BABA 2右边的数字是height数组的值。因为:任何一个子串都是一个后缀的前缀。 所以对于每个后缀就有 n-sa[i]个子串。 这时候从第一个后缀出来的答案是1。 然后看第二个,

2016-08-15 18:16:27 430

原创 Milk Patterns POJ3261 (后缀数组)

后缀数组第一题。 这道题要的是 重复至少K次的 最长子串。 先把后缀数组中的height数组处理出来,这个套模板就可以了。然后接下来二分答案ans,然后扫描height数组,看看有没有是否有k-1个height[i]>=ans 有的话就是可以,否则继续做。关于模板有个要注意的地方: (至少我手上的是这样),需要在待处理数组后面加一个比所有字符都小的数字/字符,这样是为了防止无法比较。例如 2

2016-08-15 18:03:09 236

原创 POJ 1185 炮兵阵地 (状态压缩dp)

poj 1185

2016-07-17 22:29:17 244

空空如也

空空如也

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

TA关注的人

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