ACM
文章平均质量分 56
hhy518518
这个作者很懒,什么都没留下…
展开
-
leetcode 99. Recover Binary Search Tree
//分析若有两个节点是错误的。深度遍历从最深处开始探索//那么他们的公共祖先所在那棵树比如是不合法的//一种是左右两个子树错误的那么找到那两个点//一种是左子树上面的节点和它某个祖先交换了 需要//一种是右子树上的节点和它某个祖先交换了//找到最开始出问题的根节点需要不断的回溯#include#include#includeusing namespace st原创 2017-03-19 12:28:12 · 381 阅读 · 0 评论 -
ZOJ2714迭代更新
#include #include #include #include using namespace std;#define REP(i,n) for(int i=0;i<n;++i)static const int maxn = 10;static int n;static char pos[maxn][maxn][maxn];static char view[6][m原创 2015-07-13 20:05:44 · 413 阅读 · 1 评论 -
poj1700多种选择的贪心
//每次船上至少保证一个人否则船无法移动。//那么需要安排过去的人以及回来需要的人//那么每次来回速度最快的人必须在,这样可以节省时间//分为两种情况:最快的位一组,然后交替回来 //每次送人的时候都有两种情况需要考虑//第二种情况:每次最快的带着最慢的一起走//考虑特殊的N=4的情况最小的a,b,最大的y,z 把y,z都运过河的时间同时a,b仍然在左边的时候//那么 b + a原创 2015-07-06 18:06:59 · 345 阅读 · 0 评论 -
FZU1515盒子中的气球,枚举法
//用枚举的方案因为没有衡量总体积的变大的方法#include #include using namespace std;#define MAX_N 10static struct Point{ int x,y,z;}Pts[MAX_N];static int used[MAX_N];static double userR[MAX_N];//已经放置的球的半径stati原创 2015-07-14 20:55:26 · 484 阅读 · 0 评论 -
HDOJ2149反向SG函数
#include #include #include using namespace std;static int m,n;static int f[1200];static int mex(int p){ bool g[1200]={0}; for (int i=1;i<=n;++i) { int t = p+i; if (t>m) break; if原创 2015-08-24 22:08:00 · 330 阅读 · 0 评论 -
POJ1459网络流模板题
//添加源点与汇点#include #include using namespace std;#define MAX_N 20005#define INF 1<<30static struct Edge{ int to; int v; int next;}edge[200000];static int head[MAX_N],tot;static void ad原创 2015-07-29 21:01:17 · 341 阅读 · 0 评论 -
POJ1569叉乘判断点在三角形内部
//(b-a)^(c-b)符号得出是顺时针序还是逆时针序,然后用叉积判断其他点是否在三角形内(边为逆时针序的情况下,点同时在三条边的左边则为在三角形内。//此法同样适用于判断点是否在凸多边形内)#include #include using namespace std;static int n;struct Point{ int x; int y; int num; Po原创 2015-07-30 23:01:22 · 558 阅读 · 0 评论 -
poj1325最小顶点覆盖
//因为要完成所有的任务每个任务是一条线//因为机器A和B任一个做该任务就算完成了//那么这题的模型就是覆盖所以的边的最少的顶点数目//那么就是最小顶点覆盖问题//注意机器开始就在0上所有跟0的边可以删除#include #include #include #include using namespace std;#define MAX_N 1010static ve原创 2015-08-12 20:06:16 · 408 阅读 · 0 评论 -
hdoj1281二分匹配查看是否为关键位置
#include #include #include using namespace std;#define MAX_N 105static int G[MAX_N][MAX_N];static int n,m;static int match[MAX_N];static int used[MAX_N];//有向图的匹配方式static bool dfs(int v){原创 2015-08-14 17:34:42 · 335 阅读 · 0 评论 -
poj1141根据不同规模构造最优子问题求解DP
//按照子问题的规模来枚举解决最优子问题,类似问题有算导上的最优矩阵乘法链//600K 32MS#include #include using namespace std;#define MAX_N 2500#define For(i,a,b) for(int i=a;i<=b;++i)#define INF 0x3f3f3f3fstatic int dp[MAX_N原创 2015-07-13 22:22:21 · 485 阅读 · 1 评论 -
POJ3159差分约束最短路径问题
#include #include using namespace std;#define MAX_N 30005#define MAX_E 150005#define INF 1<<30static int N,M;static struct Edge{ int from; int to; int cost; int next;};static struct原创 2015-07-27 14:25:46 · 357 阅读 · 0 评论 -
POJ1659Havel-Hakimi定理判断图的可图性
//度序列//1,Havel-Hakimi定理主要用来判定一个给定的序列是否是可图的。//// 2,首先介绍一下度序列:若把图 G 所有顶点的度数排成一个序列 S,则称 S 为图 G 的度序列。//// 3,一个非负整数组成的有限序列如果是某个无向图的序列,则称该序列是可图的。//// 4,判定过程:(1)对当前数列排序,使其呈递减,(2)从S【2】开始对其后S【1】个数字-1,(3原创 2015-07-09 22:20:04 · 443 阅读 · 0 评论 -
dilworth解决的题目poj3636,poj1631
//最小的链划分数问题。根据dilworth定理//为最大的反链的长度//187MS 1860K #include #include using namespace std;static const int INF = ~0U>>1; static struct node{ int w; int h; bool operator<(node&rs) { return原创 2015-06-12 22:18:35 · 469 阅读 · 0 评论 -
hdoj5280最大区间和
//通过sum[0,j] - sum[0,i],i是前面的最小和#include using namespace std;#define MAX_N 1010typedef long long ll;ll num[MAX_N];int main(){ int T; int N,P; cin>>T; while(T--) { cin>>N>>P; for (in原创 2015-07-11 21:39:31 · 343 阅读 · 0 评论 -
hdoj5281二分减少时间复杂度
//265MS 2412K //如果不二分的话那么就是O(N)的复杂度而此题N比较大超时#include #include #include using namespace std;#define For(i,a,b) for(int i=a;i#define MAX_N 100100int a[MAX_N];int b[MAX_N];int n;原创 2015-07-11 22:10:25 · 415 阅读 · 0 评论 -
POJ1988基本的并查集
#include #include using namespace std;static const int MAX = 31000;static int par[MAX];static int sum[MAX];//砖块i所在堆的砖块数目static int under[MAX];//表示i下面有多少个砖块static int GetParent(int a){ if原创 2015-07-25 17:53:47 · 399 阅读 · 0 评论 -
POJ1195二维线段树或者二维树状数组
注意下标是从0开始的但是我们区间是从1开始的所以查询的时候或者增加的时候x+1,y+1二维线段树://二维线段树是一棵4叉树。如果一个节点代表的区间是矩阵[x1,y1] –[x2,y2],那么它的四个子节点代表的区间分别为// [x1,y1] –[(x1+x2)/2, (y1+y2)/2][x1,(y1+y2)/2+1] –[(x1+x2)/2,y2]//[ (x1+x2)/2+1原创 2015-07-26 17:02:20 · 470 阅读 · 1 评论 -
poj1062昂贵的聘礼有等级限制的最短路径
//主要问题是在最短路径过程中注意等级的差距//第一次原创 2015-06-14 00:43:21 · 274 阅读 · 0 评论 -
hihocoder#1040判断矩形
//先判断是否重合存在4个点然后判断是否是平行或者垂直的#include #include #include #includeusing namespace std;struct xpoint{ int x1,y1; bool operator<(const xpoint&ls)const { if (x1==ls.x1) return y1<ls.y1; ret原创 2015-07-26 21:53:20 · 327 阅读 · 0 评论 -
POJ1125Floyd-warshall算法模板题
//题意求出一个Num人并给出该人传递信息到最后一个收到该信息的的时间//floyd算法模板题//204K 0MS#include using namespace std;#define MAX_N 110#define INF 0x3f3f3f3fstatic int n;static int dp[MAX_N][MAX_N];static int G[MAX_N]原创 2015-08-03 20:41:57 · 464 阅读 · 0 评论 -
POJ2352树状数组入门统计前面有多少个数与求逆序数对类似
//统计左侧的星星数目就是树状数组模型//因为已经按照y坐标排序了//统计前面有多少个数的问题#include#include#include#includeusing namespace std;static const int size = 32010;static const int N = 15010;static int x;static int c[size];原创 2015-07-23 20:59:33 · 394 阅读 · 0 评论 -
Hoj1161树状数组统计
可以根据是否被攻击过设置当前结点一直到下一次可用的时候的时间 #include #include #include using namespace std;#define SIZE 100050static int C[SIZE];static int n,q,t;static int bAttack[SIZE];//可攻击时间static int lowbit(int原创 2015-09-15 21:56:48 · 395 阅读 · 0 评论 -
UVA11992二维线段树区间修改
#include #include #include #include #include using namespace std;#define MAXN 100006#define inf 0x3f3f3f3fstruct CNode{ int L,R; long long nsum; int nmax; int nmin; long long Inc;//增原创 2015-11-04 23:28:48 · 433 阅读 · 1 评论 -
poj1837 01背包类型计数
//有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。// 其中可以把天枰看做一个以x轴0点作为平衡点的横轴//因为强制用所有的砝码那么与用于不用对应两种状态//1424K 0MS#include #include #include using namespace std;#define MAXN 22#def原创 2015-09-17 11:42:49 · 367 阅读 · 0 评论 -
#1049 : 后序遍历分治算法
//题意:给出该树前序以及中序的结果//根据当前树的前序和中序为状态//求出后序遍历的结果#include #include #include using namespace std;#define MAXN 40char str1[MAXN];char str2[MAXN];char ret[MAXN];int root;int cnt;//因为中序与前序的长度是原创 2015-10-08 22:34:44 · 388 阅读 · 0 评论 -
poj1797最大生成树
//1348K 454MS //注意不是生成整棵树而是只要可以到达N点就行了#include #include #include #include using namespace std;#define MAXE 1000005#define MAXN 1006static struct edge{ int from; int to; int cost;}原创 2015-09-18 20:31:11 · 418 阅读 · 0 评论 -
POJ1068双端队列模拟
//题意:P代表当前右括号位置前面有多少个左括号//W代表右括号位置从与它匹配的位置到该位置有多少个右括号#include #include #include #include using namespace std;int n;int P[25];int W[25];int main(){ int T; scanf("%d",&T); while(T--) {原创 2015-10-25 21:54:54 · 374 阅读 · 0 评论 -
leetcode----Regular Expression Matching
这是一道正则表达式匹配问题,当我们编写程序的时侯会发现一个重要问题就是*前面的字符需要匹配几个的问题,如果.*那么对应被匹配串需要划掉多少个呢?那么这种问题显然不能自己盲目的去划掉遍历所有情况,那么可以交给递归函数去解决,我们遍历我们遍历所有x*可能匹配的字符个数然后看有没有情况满足条件。那么这题很自然的就是分治的思维解决了。class Solution {public原创 2016-09-13 20:06:29 · 262 阅读 · 0 评论 -
leetcode42 Trapping Rain Water
通过双指针,头指针是当前第一个非递减的位置,尾指针是当前高度位置通过两个栈来维护数据..出栈的时候填充了水以后修改高度重新加入栈内算法思路:1若为空栈直接加入栈 2.若当前不为空栈讨论当前高度与栈顶高度的值 若小于等于栈顶高度直接加入栈 否则设当前位置为j,找到栈内从右到左第一个非递减的位置i将 i原创 2016-11-28 16:36:01 · 253 阅读 · 0 评论 -
hihocoder#1044状态压缩dp+滚动数组
//20ms 0#include#include #include using namespace std;#define MAXN 1500int N,M,Q;int dp[2][MAXN];//前一次的字母以及i的前面m个字母状态int num[2][MAXN];//记录前m个字母中1的个数int w[MAXN];int main(){ scanf("%d %d %原创 2015-10-02 00:34:18 · 337 阅读 · 0 评论 -
poj1323,poj2586贪心容易题
poj1323//,M个人,每人N张牌,每轮比较谁出的牌大,最大者为胜。现在给定M和N,以及你的牌,//要求输出你至少能确保获得几轮的胜利每个人得到的牌是不同的//136K 0MS#include #include #include #include #include using namespace std;#define MAXN 60int m,n;int pip[M原创 2015-10-17 22:38:31 · 398 阅读 · 0 评论 -
hdoj2191多重背包化为01背包
不化为01背包情况#include #include #include #include using namespace std;static int dp[105][105];//前i种物品价格为j的时候总重量static int p[105],h[105],c[105];int main(){ int C; scanf("%d",&C); while(C--)原创 2015-08-04 21:28:56 · 460 阅读 · 0 评论 -
Hodj1171多重背包转换成母函数
#include #include #include using namespace std;static const int lmax = 1000000;static int C1[lmax],C2[lmax];static int a[10],e[10];int main(){ int n; while(scanf("%d",&n)&&n>=0) { int nu原创 2015-08-17 21:56:47 · 396 阅读 · 0 评论 -
HDOJ1085母函数的应用
#include #include #include using namespace std;static const int lmax = 1000000;static int C1[lmax],C2[lmax];int main(){ int a1,a2,a5; int total; while(scanf("%d %d %d",&a1,&a2,&a5)) { i原创 2015-08-17 20:49:30 · 469 阅读 · 0 评论 -
poj2421kruskal算法模板题
#include #include using namespace std;#define MAX_N 110 #define MAX_E 11000static int N;static struct Edge{ int from; int to; int cost;}edge[MAX_E];static int E;static int cmp(Edge&原创 2015-08-05 22:20:50 · 554 阅读 · 0 评论 -
HDOJ1709特殊的母函数
#include using namespace std;static const int lmax = 100000;static int n;static int C1[lmax],C2[lmax];static int a[105];int main(){ while(~scanf("%d",&n)) { int sums = 0; for (int i=1;i<原创 2015-08-18 21:01:51 · 326 阅读 · 0 评论 -
HDOJ1272并查集加判断森林
#pragma comment(linker, "/STACK:1024000000,1024000000")#include using namespace std;#define MAX_N 100005static int par[MAX_N];static void init(){ for(int i=0;i<MAX_N;++i) par[i] = 0;}st原创 2015-08-05 21:48:20 · 319 阅读 · 0 评论 -
poj2817状态压缩DP
//输出最大的与前一个字符相同的个数之和//184K 0MS //主要要理解是状态压缩DP,状态是是否选择了该字符//并且保存状态时候因为字符之间有顺序,所有需要保存最后一个字符#include #include #include using namespace std;#define MAXN 12static int N;static char words[MAXN]原创 2015-09-26 10:10:13 · 346 阅读 · 0 评论 -
poj3274数位HASH
//题意:求解最大的连续区间使得该区间中每种特征出现的次数是相等的//可以用树状数组类似方法求解sum[i][]表示0-i所有属性出现的次数//那么就是求sum[j][] - sum[i][]最大的j-i的值//sum[j][k]-sum[i][k] = sum[j][0]- sum[i][0] sum[j][k] - sum[j][0] = sun[i][k] - sum[i][0]原创 2015-09-11 20:53:56 · 340 阅读 · 0 评论 -
poj2479分步DP精简成O(n)算法
//提取信息包括从s到t之间的和//但是n较大这样dp[i][j]的形式显然不行,那么如果转换//其实我们除了记录[i,j]之间的和那么可以记录以i开头和以i结尾两种情况//后来发现根本不用记录以什么为开头或者结尾,每次更新前面一段值就行//725K 438MS#include using namespace std;#define MAX_N 50010//static in原创 2015-06-08 21:46:14 · 381 阅读 · 0 评论