- 博客(47)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 图论模板整理
大部分来自LRJ//无向图求割点int pre[maxn], low[maxn], dfs_clock;vector G[maxn];int iscut[maxn];int dfs(int u, int fa) //求出所有点i是否为割点iscut[i]{ int lowu = pre[u] = ++dfs_clock; int child = 0;
2014-07-15 11:10:23
1293
原创 2014牡丹江 区域赛 Building Fire Stations
给一棵最多2*10^5个结点的树,选择两个结点放置设备,要求所有结点其到最近设备的最远距离最小,求出这个最小距离。最大值最小,首先想到二分。二分一个最大距离M,先以1号结点bfs出每个结点的深度。任选一个最大深度的结点,则离他距离M的父结点u上必须要放置一个设备。然后再以u进行bfs,同样的选择出第二个结点。再把选择的两个设备结点加入队列bfs,看是否能够遍历所有点,若能就满足。z
2014-10-13 14:01:09
1078
原创 Untrusted Patrol 14牡丹江网络赛C
题意:给定一个n个点,m条边的图,其中k个点上有探测器再给定一个探测器第一次被遍历的序列,问是否存在一种遍历顺序使得满足给定序列且遍历完所有点思路:从第一个被遍历的探测器开始dfs,每次访问到探测器遍停止,访问到非探测器节点便搜下去。结束后判断给定序列下个探测器是否被访问过,若没有,说明无法不通过 其他 探测器到达此探测器,无解。若被访问过,继续dfs此结点。这样d
2014-09-11 12:06:44
1016
原创 poj3322 Bloxorz I
经典的方块游戏1 * 2 * 1的砖块 最少步数到达一个指定的洞中很明显的bfs,状态表示时用一个p值0,1, 2分别表示砖块立起来,横躺着和竖躺着,判重时用一个三维数组即可 vis [p状态] [行位置] [列位置]那么每次直接从一个状态转移到另一种状态,坐标位置同时改变即可#include #include #include #include #incl
2014-08-14 22:47:51
1178
原创 hdu4940 Destroy Transportation system
给你一个强连通的有向简单图,每条边有D, B两个权值,设S为点集的一个非空真子集问:是否对于任意的集合S,都有sum (D(i, j))比赛的时候完全没有思路啊。。。最大流果然还是白板思路:将D值作为边的下界,D + B作为边的上界,如果存在可行流,那么对于任意集合S都有流量小于等于边的容量上界,大于等于边的容量下界,即D(i, j) 这就将问题转化为了裸的有下界的最大
2014-08-13 10:19:45
876
原创 hdu4941 Magical Forest
Problem DescriptionThere is a forest can be seen as N * M grid. In this forest, there is some magical fruits, These fruits can provide a lot of energy, Each fruit has its location(Xi, Yi) and the
2014-08-12 19:09:09
856
原创 neu1458 方格取数 dp解法
题意:有N * N个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把所有经过的格子的数加起来,求最大值SUM,且两次如果经过同一个格子,则最后总和SUM中该格子的计数只加一次。走两次,所以状态表示要同时表示两次路径。dp[i][j][k][l] 表示第一次走到i, j,第二次走到k, l得到的最大值,这里i + j
2014-08-07 10:06:29
1013
原创 SGU194 Reactor Cooling 有下界最大流
学习别人的方法。大致是:无源汇的最大流 : 新建源点,汇点,sum[i]为每个点进来的下界流之和减去出去的下界流之和,如果sum[i] > 0,由源点向该点建一条边,上界为sum[i],下界为0如果sum[i] #include #include #include #include #include #include #include #include #inc
2014-08-06 11:56:51
1175
原创 Graph Automata Player
题目here第一道快速幂,同时也是第一道高斯消元。输入的边的关系矩阵就是系数矩阵co[co] ^ T * [ans]== (当前0时刻的状态),[co] ^ T可由矩阵快速幂解得那么-T时刻的状态便是ans矩阵的值,可由高斯消元解得判断一下即可高斯消元中 系数矩阵是a[0...n - 1][0...m - 1] 常数矩阵是a[0...n - 1][m]返回-1表示
2014-07-31 09:55:57
752
原创 hdu4893 Wow! Such Sequence!
线段树结点上保存一个一般的sum值,再同时保存一个fbsum,表示这个结点表示的一段数字若为斐波那契数时的和当进行3操作时,只用将sum = fbsum即可其他操作照常进行,只是单点更新的时候也要先向下更新#include #include #include #include #include #include #include #include #includ
2014-07-30 16:21:17
711
原创 hdu4888 Redraw Beautiful Drawings
14多校第二题网络流 分别以行,列作为结点建图i行表示的结点到j列表示的结点的流量便是(i, j)的值跑遍最大流 若满流了便是有解 判断是否unique 就是在残余网络中dfs,走可以增加流量的边,找到环即不唯一dfs的时候一定要回溯!!。。。#include #include #include #include #include #includ
2014-07-30 11:51:18
826
原创 Final Exam Arrangement
In Zhejiang University, there are N different courses labeled from 1 to N. Each course has its own time slot during the week. We can represent the time slot of a course by an left-closed right-open in
2014-07-25 19:55:17
869
原创 codeforces248(div1) B Nanami's Digital Board
q次询问,每次询问可以对矩阵某一个值改变(0变1,1变0) 或者是查询子矩阵的最大面积,要求这个这个点在所求子矩阵的边界上,且子矩阵各店中全为1用up[i][j]表示(i,j)这个点向上能走到的最长高度 若(i,j)为0 则up[i][j]值为0同理,维护down,left, right数组则每次查询时,从up[i][j]枚举至1作为子矩阵的高度,然后途中分别向左右扩展。若up[i]
2014-07-17 15:21:28
977
原创 codeforces248(div1) A. Ryouko's Memory Note
可以把序列中一个数改变,使得序列中后一个数与前一个数差的绝对值之和最小把与数x相邻的数加入G[x]的链表中(若这个数值也为x,则不加入) 那么改变了数x,则相当于只会影响到这个链表中的数为了让x变化后的数 与这个链表中的数差值绝对值之和最小 取排序后的序列的中位数即可//#pragma comment(linker, "/STACK:102400000,1024000
2014-07-17 15:11:45
819
原创 hdu4366 Successor
好题! 但是感觉题目描述不是很清楚这题只是询问开除某人后,他的下属中谁会替代他的位置,不会更新这个位置要求一个子树中忠诚度最高的人。可以想到dfs树,保留时间戳,每个节点便表示一个区间那么便可以建树维护最高忠诚度。。。只是要保证能力值也要比被开除者高那么根据能力值从大到小对员工排序,依次更新。那么可以保证之前更新的节点的能力值都大于当前要查询的节点这里要注意一点,能力值相同
2014-07-15 10:58:37
1330
原创 codeforces#FF(div2) D DZY Loves Modification
首先要知道选择行列操作时顺序是无关的用两个数组row[i],col[j]分别表示仅选择i行能得到的最大值和仅选择j列能得到的最大值这个用优先队列维护,没选择一行(列)后将这行(列)的和减去相应的np (mp)重新加入队列枚举选择行的次数为i,那么选择列的次数为k - i次,ans = row[i] + col[k - i] - (k - i) * i * p;既然顺序无关,
2014-07-14 11:28:46
1085
原创 hdu4362 dp + 单调队列优化
dp转移方程很容易想 dp[i][j] = min{dp[i - 1][k] + abs(pos[i][j] -pos[i - 1][j]) + cost[i][j]}n行m列 每次转移扫描m次 共n*m*m 为O(10^7) 1500ms,可以暴力一试。姿势不对就会TLE其实加上个内联函数求绝对值,同时赋值时候不使用min(a, b) 用G++交 就可以水过正解是:因
2014-07-12 12:24:01
969
原创 hdu4360 spfa+拆点
题目要求必须按照L O V E 的顺序行走,且必须至少有一个完整的LOVE,说明可以经过同一个点多次对每个点拆分为4个点,分别为从L,O,V,E到达。起始点看做是从E到达的spfa时发现当前点距离相同,比较经过的边数,此时若边数更大,也要入队列!因为要更新后面的点经过的边数trick 是点可以有自环,当N = 1时1 41 1 1 L1 1 1 O1 1 1 V1
2014-07-10 15:19:53
997
原创 最长上升子序列 nlogn
最长上升子序列中对于数ipt[i],向前遍历,当数ipt[j]小于ipt[i] 则ipt[j]可作为上升序列中ipt[i]的前一个数字dp[i] = max{ dp[j] + 1 | j 若现在有两个状态a,b 满足dp[a] = dp[b]且 ipt[a] 则对于后面的状态dp[a]更优 因为若ipt[i] > dp[b] 则必然ipt[i] > dp[a],反之若ipt[
2014-07-08 14:59:05
751
原创 点集配对问题
点集配对问题 空间里n个点,使它们配成n/2对点,使得每个点恰好在一个点对中。要求所有点队中,两点距离之和尽量下 n d(s) = min(d{S - {i} - {j}+ |Pi Pj| | j属于S, j > i, i = min{S}}//#pragma comment(linker, "/STACK:102400000,102400000")//HEAD
2014-07-08 13:36:57
2482
原创 hdu1427 速算24点
枚举两个数字进行运算,将运算结果加入数组末尾后继续枚举当数组中有7个数字之后表示运算完成//#pragma comment(linker, "/STACK:102400000,102400000")//HEAD#include #include #include #include #include #include #include #include #inc
2014-07-08 10:59:09
1176
原创 SGU536 Berland Chess
棋盘上白子只有一个国王 黑子给出各子遵从国际象棋的走法黑子不动,白子不能走进黑子的攻击范围以内问白字能不能吃掉所有的黑子直接搜索就好了,各子状态用二进制表示不过每个子被吃之后攻击范围会改变所以重点是预处理每种剩余棋子状态的攻击范围比较麻烦,注意白子吃掉一颗子之后所在的位置也可能是危险位置
2013-10-31 21:48:15
1020
原创 hdu4587 TWO NODES
问一个无向图中去掉任意两点后剩下的连通分量的个数最大值枚举第一个删去的点,在剩下的子图中求割点注意,剩下的子图可能不连通,那么就要对每个连通块求割点计算删去一个点后剩余连通分量个数 left 的方法为:tarjan算法中的时间戳数组dfn[]若为0说明是新的连通分量求删去割点后剩余连通分量个数:tarjan算法中将判断是否为割点的bool 数组改为int类型,并将iscut[i] = 1 改为 iscut[i]++ 即可那么对于非根节点,删去后剩余个数为iscut[i] + 1(子树个数加上父节
2013-10-30 16:46:13
1026
原创 Uva1514 Piece it together
二分匹配 当时一看题觉得是最大流 就不停的试 两百行代码敲完 调试完 才发现建图不对.....后来想想 其实可以把黑色小块拆成两个 水平方向及竖直方向 两个方向分别向各自方向白色小块连边那么匹配完全后才能输出yes 否侧就是no唉 思想完全不够啊 拆点都没有想到! 牢记还有就是2sat可以做 可以试试 但感觉建图比匹配难
2013-10-26 22:40:47
826
原创 uva11090 Going in Cycle!!
题意:找到图中平均权值最小的回路思路:假设答案是val 那么图中的边权值减去val,原来的回路便会成为负圈 val的值可以通过二分+spfa判负圈完成
2013-10-25 23:03:08
724
原创 uva11374 Airport Express
这道题和hdu4081Qin Shi Huang's National Road System很像 都是需要枚举免费的那条路主要是要两次预处理 一次是起点到任一点的最短路 再是终点到任一点的最短路那么对于每一条免费路线(u, v) 答案便是dis[u](起点至u) + dis[v](终点到v) + w(u, v)
2013-10-25 22:57:17
707
原创 hdu4756 Install Air Conditioning
次小生成树的变形dfs得到最佳替代边假设两个各自连通的部分分别为树A,树B用dp[i][j]表示树A(i点所在的树) 到 树B(j点所在的树)的最近距离(此然就是最佳替代边)注意0号节点相连的边不会出错
2013-10-24 18:14:35
781
原创 A Digital Satire of Digital Age
两个天平判断两边的字母ascall码值中1的个数是否相等输出比较麻烦我是先根据高低画出天平 再在天平的倒数第二行放上字母
2013-10-24 18:07:41
747
原创 hdu4431 Mahjong
这道题直接考虑胡什么不太好实现,所以直接枚举34张牌,看是否能够凑成胡牌这里需要注意一点,任意一种牌,数量不能超过四张当时写完之后一直超时,尝试优化都失败了其实,枚举完奖牌之后,dfs过程中若一张牌有,但是不能形成刻子或者顺子,那么这张牌肯定没有用 那么直接返回就好了,这是一个重要的优化加了这个优化之后就可以过了 不过后来还是直接模拟做了,时间更快,也更好写先直接枚举顺子,不过要注意,一张牌若是三张(枚举将牌之后),就不能拆成顺子 然后统计是否牌都用过即可具体见代码吧,顺便贴上几组数
2013-10-23 19:53:34
757
原创 hdu4115 Eliminate the Conflict
题意:对,又是Alice和Bob玩起了石头剪刀布。Alice知道Bob每回合要出什么,现在对于Alice 有m个限制,每个限制由a,b,k三个数字来描述。k == 0,则第a局和第b局 Alice出的相同。k==1,则代表第a局和第b局Alice出的必须不同。求是否存在可以使得Alice每局不输(平或胜)且符合以上m个要求的方案。石头剪刀布,看似有三种选择,但是仔细分析发现,由于Bob出什么已定,那么对于Alice来说只有选择平或胜两种选择,那么可以联想至Twosat根据这些限制建图,twosa
2013-10-23 19:31:24
656
原创 hdu3666 THE MATRIX PROBLEM
这道题题号真吉利啊 这道题是判断是否存在两个数组a,b是的对给定的矩阵c满足L <= c[i][j] * a[i] / b[j] <= U 把乘除号 看作加减号 (或者直接两边取log)那么就是两个不等式 转换成差分约束系统判断是否存在负圈就好spfa下来会超时 ,有两种方法可以解决 一是将入队次数改为根号n即可 (不要问为什么,我也不知道哪里看到过) 不推荐二是用dfs判断 速度也很快
2013-10-22 21:16:54
741
原创 hdu3682 To Be an Dream Architect
题意:一个三维空间中的一个立方体,每次给一条线,线所经过单位立方体被消去 最多一千条,问最终被消去多少个小块因为只有一千条线,那么可以记录每个点是否消去过。对!可以map之 T!! L!! E!! 改成vetor试的hash 625ms慢慢的//#pragma warning (disable: 4786)//#pragma
2013-10-22 21:02:02
669
原创 hdu3729 I'm Telling the Truth
匹配模版题看最大匹配数是否等于人数要求输出字典序最小 那么反序匹配就好了#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include
2013-10-22 20:43:44
719
原创 hdu4215 Moles
不错的题目笛卡尔树+DFS+KMP匹配这道题建树复杂度过高,所以需要笛卡尔树(队员敲的这部分,不懂)然后dfs得到模式串再直接匹配就好了
2013-10-22 20:37:17
637
原创 hdu4121 xiangqi
模拟题黑方只有一个将,决定是否被死将,规则和普通象棋一致注意细节就没什么难的我是先判断能否飞将。然后判断走四个方向后会不会被将死这里需要注意一点,移动后可能会吃掉红方一颗棋子,那么这颗棋子就不需要判断//#pragma warning (disable: 4786)//#pragma comment (linker, "/STACK:16777216")//HE
2013-10-22 20:29:50
769
原创 uva11248 Frequency Hopping
题意:给定一个有向网络, 每条边均有一个容量。问是否存在一个从点1到点N,流量为C的流。如果不存在, 是否可以恰好修改一条弧饿容量, 使得存在这样的流。先求最大流mf,如果mf >= C,则直接输出possible若暂时不存在,那么便是最小割中的边限制了增广路的产生,可以通过修改其中的弧容量(设为C足矣),再求最大流,此时若大于C则此弧可以不过这样会超时其实最大流在此题中没有意义,所以当流量>=C的时候就可以停止增广了还有就是保留第一次增广后的各条边中的流量,以后在此基础上进行增广即可
2013-10-22 17:47:43
728
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人