
CDOJ
文章平均质量分 77
Commencel
有太多事情值得后悔了,
展开
-
CDOJ 数据结构训练 J
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-05-03 12:40:48 · 380 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-05-16 16:59:54 · 429 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory B
将所有的联通块看做成一个点,就能得到一棵树无环的,那么只需要将叶子节点连接在一起就可以,需要的边数就是(ans+1)/2求边联通分量就套tarjan模板最后找到叶子节点数目就可以原创 2014-06-15 00:23:57 · 468 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory C
求割顶,每个割顶可以将联通分量数量+1如果割顶数目小于K,那么注意多余的点是不能增加联通分量的另外注意dfs的第一个点要特殊处理一下原创 2014-06-15 00:25:11 · 396 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory F
HAVEL定理的应用利用优先队列模拟该过程取出序列中最大值dmax,若dmax大于n-1,无解退出。否则取出剩下n-1个元素中前dmax大的dmax个元素,把这些元素依次减1后放回序列中,dmax舍弃,n=n-1如果出现负数那么则无解原创 2014-06-15 00:26:24 · 395 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory G
最短路问题可以dijkstra求两次最短路,有优先队列优化一下第一次最短路就是从起点到各个终点的最短路第二次最短路就是存一个逆图,权重值也逆,然后同样从起点跑最短路。最后找出两次最短路和最大值输出就可以了#include #include #include #include #include#include #include #include #include #原创 2014-06-15 00:27:33 · 397 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory H
前向星+SPFA定义状态DP[i][j]表示从起点开始,i点经过j条边后达到的最短路那么答案就在DP[T][X>=K]中在SPFA中不断更新这个最小值,二维队列中若点等于T,边数大于等于K,那么就确定找得到解。设置found=true同时在这里更新最小值如果没有遍历过当前DP,或者可以松弛那么就更新DP,入队转移就是第一维为新可以达到的点(边相连),num+1#includ原创 2014-06-15 00:28:45 · 364 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory I
拓扑排序注意每个点要从其所在最长路的更新他的糖果数目那么就是每条边起点开始查找找到当前点的入度减1可以为0的点开始更新糖果,然后入度为0点入队就是离其最近的点开始赋值,考虑入度非1,通过这个点的两条边长度不一样另外注意判断是否存在环#include #include #include #include #include#include #include #incl原创 2014-06-15 00:29:42 · 347 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory J
欧拉道路的问题要求单词首位连接而且要求字典序最小首先建图,为了满足字典序的要求,每个单词首尾字母连一条边然后对图首节点排序,比如以a开头的所有单词排序那么每个首字母单词就可以排序输出的时候就是字典序另外的就是欧拉路的判断了,如果入度出度全部相等那么任意点开始DFS就可以,但是由于字典序要从第一个出现的字母开始DFS其他情况下存在欧拉路的话就是一个点的入度比出度大一,另一个点原创 2014-06-15 00:30:59 · 346 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory K
如果原图直接联通那么就是一个简单的最小生成树问题,那么就可以构造特殊点生成最小生成树跑一边kruskal得到答案就可以注意并查集的应用,特殊点为0.首先合并所有特殊点然后跑kruskal就可以了原创 2014-06-15 00:32:02 · 414 阅读 · 0 评论 -
2014 UESTC Training for Graph Theory L
二分匹配 主要是匈牙利算法查找增广路如果找到增广路ans++套匈牙利模板就可以了原创 2014-06-15 00:33:02 · 399 阅读 · 0 评论 -
2014 UESTC Training for Dynamic Programming G
首先f[i]是对于每行可行状态取反,由于每行想要添加的状态值一定和这里的可埋情况的子集所以有条件s&f[i]=0;另外上一行和下一行的同一列位置不能同时为1,所以s&t=0;初始化就是dp[0][0]=1;其余全部为0;一个优化是首先预处理出所有一行长度为M中所有不含有相邻1的状态值,存到state[]中,这个状态最多377种在循环中,只需要从0到tot(state上限)就可以原创 2014-06-02 12:03:21 · 1026 阅读 · 0 评论 -
2014 UESTC Training for Dynamic Programming J
为了区分横放竖放,横的矩形就两个都是1,纵的矩形就是上一个是0,下一个是1(同列)这样的话最后一行必然全是1.于是可以从最后一行开始推,最开始是当前行和上一行是的并是(1就然后其实从当前行推到下一行是固定的,已知一行的状态可达到的下一行的状态是很少的所以这里可以优化用一个vector,convert[],convert[i][j]=y;表示状态值i可推出的第j个状态的值为K原创 2014-06-02 12:05:24 · 487 阅读 · 0 评论 -
2014 UESTC Training for Dynamic Programming I
dp[i][j]表示长度为i,最高位为j的个数那么就需要预处理出所有的dp[18][9];for (int i=0;i dp[1][i]=1; for (int i=2;i for (int j=0;j { for (int k=j+2;k dp[i][j]+=dp[i-1][k];原创 2014-06-02 12:04:29 · 585 阅读 · 0 评论 -
2014 UESTC Training for Dynamic Programming F
首先将均方差公式变形为 1/n∑Xi^2 - X^2图内数字总和一定,所以只需要让每个矩形的总分的平方和尽量小定义状态DP[k][x][y][x1][y1],表示切割K次后矩形左上角矩形右下角的总平方和值。边界就是K=1,最后一次切割然后模拟切割矩形状态转移为dp[k,x1,y1,x2,y2] =min{ min{dp[k-1,x1,y1,a,y2]+S[a+原创 2014-06-02 12:02:22 · 609 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm C
贪吃蛇,首要问题是如何记录蛇的状态,蛇头,蛇身中每个点与上一点之间的方向关系。故可以用哈希来定义状态,这里学习了别人的hash方法。每次找到当前点与前面一点的方向关系来确定hash返回值剩下的就是直接BFS,每次更新新蛇一定要注意蛇的长度是多少,如果蛇的长度大于等于3,那么碰到蛇的尾部是合法的如果蛇的长度小于3,那么碰到蛇尾是不合法的另外注意移动过程中那种情况下都不能碰到蛇身利原创 2014-05-16 16:58:01 · 377 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm B
这个题目首先要注意给出的式子的规律例如某个2位数ab实际上这个数字是a*10+b,令其为此时的M平方后为100a*a+2*a*b*10+b*b;可以发现平方后的个位数与原数字最后一位有关,平方后的最后两位数与原数的最后两位数有关同理。。。于是就可以从各位开始BFS定义节点是当前值和值的位数最开始从0位开始搜索每次对位数进行扩展,相应更新位数注意如果更新的数字原创 2014-05-16 16:57:01 · 371 阅读 · 0 评论 -
CDOJ 数据结构训练H 树状数组离散化
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-05-03 12:42:02 · 422 阅读 · 0 评论 -
CDOJ 数据结构训练 E
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-05-03 12:43:25 · 426 阅读 · 0 评论 -
CDOJ 数据结构训练F 树状数组
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-05-03 12:42:52 · 433 阅读 · 0 评论 -
CDOJ 数据结构训练K
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-05-03 12:39:47 · 409 阅读 · 0 评论 -
CDOJ 搜索专题训练A
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-05-13 23:44:21 · 405 阅读 · 0 评论 -
2014 UESTC Training for Dynamic Programming
#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#define PI 3.1415926原创 2014-06-02 12:00:15 · 623 阅读 · 0 评论 -
2014 UESTC Training for Dynamic Programming M
分组背包,s==0 至少取一个。那么通过上一组数所有dp[i-1][j]若要保证至少取一个那么就需要这一组数据dp[i][j]都是无穷小,那么d[i-1][j-c[k]]+g[k]必然大于dp[i][j]保证了至少取一个首次取完之后,dp[i][j]=max(dp[i][j],dp[i][j-c[k]]+g[k])在该堆中选择两个以上s==1 至多取一个。这组的结果由上一组推出,那原创 2014-06-02 12:07:53 · 639 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm L
查找最优解,根据可能生成对应和的解判断最优解设置解的结构体struct ANS{ int num; int high; int type; int res[30];};ANS ans,tmp;tmp用于在DFS中修改判断生成最优解首先将输入元素从小至大排序,如果4张面额最大的邮票都无法生成解那么直接none,conginue然原创 2014-05-16 17:06:44 · 420 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm K
状态定义是如果当前位置和目标位置一致对应二进制数为1,否则为0.利用这个二进制数字对应10进制数字vis判断。BFS最开始做的时候是用二维做的,同时预处理出所有图形不重复的颜色,处理所有可填充的矩形(比如N=3,那么预处理矩形1*1,1*2,1*3,2*1,2*2,2*3),在BFS中每次枚举颜色,矩形的左上角(填充起点),矩形类型(长宽)。尝试加入队列然后判断终点,果断T了。。其实可原创 2014-05-16 17:05:56 · 434 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm I
要求求最近两个最近兵团距离的最大值,思路就是二分这个最大值根据谓词p判断当前给予的这个最大值是否能够满足条件(不断二分答案直到终点输出答案就可以判断谓词p的方法是从首位开始枚举i,然后以j从i+1开始遍历每次找到两距离差小于当前判断mid值时count++;一旦>-当前mid.那么i从j开始乡下遍历。最终根据count判断谓词#include #include #inclu原创 2014-05-16 17:03:34 · 379 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm H
还是bfs解迷宫问题,这里的方式是加入了左转右转来控制方向,每次前进格数是1-3格于是节点状态定义还要加入一个方向变量,这里0,1,2,3分别表示上右下左。同事判重vis也要三维vis[55][55][4];另外还需要注意的是图内障碍物与通路的坐标与图中点坐标的对应性,1,0与坐标(交叉点)坐标并不是相同的再判断是否能前移的时候要注意如果再路径中走1步就遇到障碍物是那么这条路径就更不能原创 2014-05-16 17:02:47 · 381 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm F
三维迷宫不知道说啥。直接上代码了#include #include #include #include #include#include #include #include #include #include #include #include #include #include #include #include #define LL long long#d原创 2014-05-16 17:01:55 · 412 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm E
回溯+剪枝对于每个被切开的木棍,只有2中状态要么选要么不选,于是想到回溯dfs方法dfs的三个参数,当前已经使用过的木棍数量,从第几个木棍开始当前查找,当前和回溯终点就是使用过的木棍数量等于N;对于每次查找,如果sum+stick[i]如果刚好相等那么进行标记从头再查找是否可以凑成第二个完整木棍剪枝:1.应该从大到小排序,这样可以递归的次数2.原完整木棒的长度必然是原创 2014-05-16 17:01:05 · 444 阅读 · 0 评论 -
2014 UESTC Training for Search Algorithm J
先不考虑加减操作,看通过另外的4个操作能对原序列发生什么改变,且要注意加减操作只能在魔棒经过的地方才能够执行,所以要有一个状态变量,标记一下这个状态中对应位是否被遍历过,如果1才能够加减,否则不可加减固有这样的处理int State[10][6]={ 1,0,0,0,0,0, 1,1,0,0,0,0, 1,1,1,0,0,0, 1,1,1,1,0原创 2014-05-16 17:04:28 · 397 阅读 · 0 评论 -
2014 UESTC Training for Dynamic Programming L
树形DP,除了求出最少需要的次数还需要求出最小次数对应的方案数dp[u][1]表示u这个点改变为白色,且u这个子树满足条件的最小次数dp[u][0]表示u这个点不改变且u这棵子树满足条件时的最少次数转移就是dp[u][1]=sum(min(dp[vi][1],dp[vi][0]) )+1;dp[u][0]=sum(dp[vi][1]); (v是u的全部子节点)另外再开一原创 2014-06-02 12:06:49 · 510 阅读 · 0 评论