普通算法
王莞原
加油!
展开
-
hdu1296多项式
这题逻辑很强。。要理解多项式中 a,n在多项式中的作用,X前没有数字时,将a置为1,后面没有^时将n置为零。用op来保存正负号。#include #include #include using namespace std;int main(void){ int a, n, x; string s; while (cin >> x) {原创 2017-03-18 14:14:34 · 279 阅读 · 0 评论 -
poj 1011
//剪枝//挺难想的//也挺难懂//http://www.bilibili.com/video/av10046345/?from=search&seid=9872190969825285872#page=18#include #include #include #include #include using namespace std;int n;int Sticks[7原创 2017-07-23 17:33:41 · 262 阅读 · 0 评论 -
hdu1857 畅通工程再续
用的堆优化的prim算法写的,之前把prim与dijkstra弄混了,prim是不用更新边的#include #include #include #include #include #include #include #include using namespace std;const int INF = 1 << 30;const int NIL = -1;co原创 2017-08-16 09:50:33 · 207 阅读 · 0 评论 -
hdu1874 畅通工程续
堆优化的dijkstra需要更新边边记录要去的顶点和权值#include #include #include #include #include #include #include using namespace std;const int INF = 1 << 30;const int NIL = -1;const int MAXN = 205;int原创 2017-08-16 09:53:06 · 186 阅读 · 0 评论 -
Boolean Expressions
描述The objective of the program you are going to produce is to evaluate boolean expressions as the one shown next: Expression: ( V | V ) & F & ( F | V )where V is for True, and F is for False.原创 2017-08-02 09:47:56 · 240 阅读 · 0 评论 -
扩展欧几里得
#include <iostream>#include <algorithm>#include <cstring>#include <functional>#include <cstdio>#include <vector>#include <queue>#include <limits>using namespace std;typedef long long ll;const原创 2017-08-02 17:39:51 · 164 阅读 · 0 评论 -
hdu 2711 Lost Cows
#include using namespace std;const int MAX = 8005;//先把牛从小到大排好,然后一个个取,取完要把相应牛删除//很明显取的时候取当前第pre[i]+1大的数字struct Node { int l, r, num;//num代表[l, r]区间的数字个数 int mid() { return (l + r) >> 1; }}Tree[原创 2017-08-02 20:24:12 · 271 阅读 · 0 评论 -
Billboard 线段树
每次贴公告时都尽可能上线段树中的val表示在[l,r]范围内黑板所剩的最大宽度每次查询都先往左查询,这样就可以优先贴在靠上的地方#include #include #include using namespace std;const int MAXN = 200005;struct Node { int l, r; long long val; int mid() {原创 2017-08-03 15:23:59 · 221 阅读 · 0 评论 -
Who Gets the Most Candies? 线段树
用模拟每一轮有人跳出后的人数变化因子个数可打表算出#include #include #include #include #include using namespace std;const int MAXN = 500005;typedef long long ll;#define lson rt << 1, l, m#define rson rt << 1 |原创 2017-08-04 08:55:26 · 239 阅读 · 0 评论 -
poj 2528
http://www.cnblogs.com/kevince/p/3893531.html 线段树,需要离散化#include #include #include #include #include #include #define lson rt << 1, l, m#define rson rt << 1 | 1, m + 1, rconst int MAXN = 200原创 2017-08-04 14:34:11 · 191 阅读 · 0 评论 -
hdu 3308 线段树
写给自己看,记自己错的几个点#include #include #include #include #include using namespace std;typedef long long ll;const int MAXN = int (1e5) + 5;const int INF = (1 << 30);#define lson rt << 1, l, m#原创 2017-08-07 10:14:40 · 214 阅读 · 0 评论 -
hdu 1856 More is better 并查集
题目大意是要找出一个朋友集合,这个朋友集合的大小最大,输出这个集合的大小朋友的朋友是朋友,这个很自然就会想到并查集,这里的并查集要用到路径压缩,因为点数太多,集合的大小也好处理,只要在每次合并集合时增加作为祖先的元素所对应的大小就好了#include #include #include #include #include using namespace std;typed原创 2017-09-20 20:14:57 · 190 阅读 · 0 评论 -
hdu 1811 Rank of Tetris 并查集+拓扑排序
题意:给出一系列排名的信息,问你是否能确定排名,还是信息有冲突,或者信息不足。这种确定先后顺序的题目我们很自然就能想到拓扑排序,拓扑排序时就可以判出是否冲突或信息不足,冲突就是有回路,信息不足就是在确定某个是谁时有多种选择,也就是在拓扑排序时入度为0的有多个。代码如下,代码写的比较没有条理,因为之前拓扑排序用到时dfs版的,但后面想到这道题要有唯一的拓扑序列,所以应该用入度版。转换为入度后,问题变得原创 2017-10-07 12:36:21 · 218 阅读 · 0 评论 -
hdu 1506 Largest Rectangle in a Histogram
来了一个高度较小的长方形a,设a的左边有比a高的长方形b 将b pop()出来 则以b为高度的大长方形的宽度就能确定了 该长方形的右边界好确定,就是a所在的位置减一,因为a比b低,而在栈中,在b之前被pop()出来的的都比b高 左边界也好确定,就是当前栈顶的值加一,因为当前栈顶对应的高度是要小于b的高度的 栈中存放的是每个小长方形所在的位置,进而可以得出宽度#include <iostre原创 2017-10-04 20:14:35 · 184 阅读 · 0 评论 -
poj 3494 Largest Submatrix of All 1’s
这题是poj2559的变形,每次枚举底边,然后完全能转换为poj2559 http://poj.org/problem?id=2559解法和poj2559差不多 由于这里要频繁用栈 所以还是不要用stl的stack 我之前用了,就TLE#include <iostream>#include <vector>#include <cstring>#include <algorithm>#原创 2017-10-04 21:01:55 · 212 阅读 · 0 评论 -
hdu 1081 1559 最大子矩阵
今天写了挺多最大子矩阵的题,以前有看过书,没搞懂什么叫 “枚举起始行和终止行后,把整个矩形压缩成一维的” 可能是脑子笨,现在看这句话很通俗易懂啊。 确定一个子矩阵就是要确定四个边界嘛,上下边用枚举的方法,求和时会省下很多不必要的计算,这道题还和昨天写的:http://poj.org/problem?id=3494有点像。 都用到了压缩行,把矩形压缩成一维的思想。hdu 1081:#inclu原创 2017-10-05 14:06:02 · 209 阅读 · 0 评论 -
codeforces 837B Balanced Substring
题目大意 找一个最长的字串,满足字串中0和1的个数相同 思路 这里可以枚举做,将0看成-1,记录前缀和,那么我们只要找到一个最长的前缀和为0的字串就行了。但枚举也是有方法的,先枚举l,再从大的地方枚举r,r的减少也是有讲究的,不能每次减1,比如一个串”11111111” 在[1, 8]时前缀和之差sum[8] - sum[0] == 8,此时不满足,还要减少r来找到一个区间,使得sum[r]原创 2017-10-13 18:54:20 · 259 阅读 · 0 评论 -
prim 堆优化
#include #include #include #include #include #include #include using namespace std;const int MAXN = 1005;const int INF = 1 << 30;struct Node { int u, w; friend bool operator<(const Node&原创 2017-08-16 09:45:56 · 389 阅读 · 0 评论 -
poj 1724
这题需要简直到达某个城市c的路径有许多条,可能会有一些花的钱相同但路径不同的路线。也就是说 我们走到城市c只花了m1的钱,从另一条路走到c却花了多余m1的钱,那么这条路没有必要继续走下去,要么到不了,要么路径长度和之前的路是一样的,总之不会小于那个花钱少的路线#include #include #include #include using namespace原创 2017-07-21 20:37:13 · 233 阅读 · 0 评论 -
poj 3468 线段树
#include #include #include #include #include using namespace std;const int MAXN = (int)1e5 + 10;struct Node{ long long sum; int add;//延迟标记 int left, right; int mid() { return (left + right原创 2017-07-16 13:04:57 · 197 阅读 · 0 评论 -
hdu1023卡特兰数
c(2n,n)-c(2n,n-1) 我只是觉得大数写的我要死。#include <iostream>#include <algorithm>using namespace std;int *c[205][205];void sum(const int *num1, int size1, const int *num2, int size2, int **num){ int size原创 2017-03-19 16:10:30 · 344 阅读 · 0 评论 -
03-树3 Tree Traversals Again
push对应着前序遍历,pop对应中序遍历,然后根据前序中序来推后序。#include <iostream>#include <stack>using namespace std;int post_idx, n;int N;void solve(int pre[], int in[], int n){ if (n < 0) return; if (n >原创 2017-03-27 19:14:32 · 221 阅读 · 0 评论 -
03-树2 List Leaves
用数组模拟出二叉树,并采用并查集的方法来找出树根。#include <iostream>#include <algorithm>#include <queue>#define Null -1#define pTree intusing namespace std;struct TNode{ int lc, rc;};TNode node[10];int parent[10]原创 2017-03-27 19:22:04 · 203 阅读 · 0 评论 -
hdu1087最大上升子列和dp
很基础的dp,max_val[i]表示以x[i]结尾的子序列中最长上升子列和#include <iostream>#include <algorithm>using namespace std;int main(void){ ios::sync_with_stdio(false); int x[1001], max_val[1001]; int n; whil原创 2017-03-28 18:02:08 · 260 阅读 · 0 评论 -
hdu2084数塔
http://acm.hdu.edu.cn/showproblem.php?pid=2084用一个二维数组保存当前点往上走所能有的最大和#include #include #include using namespace std;int subsum[101][101];int vex[101][101];int main(void){i原创 2017-03-12 13:06:26 · 198 阅读 · 0 评论 -
hdu2083简易版最短路径。。简单数学题
http://acm.hdu.edu.cn/showproblem.php?pid=2083当朋友数为奇数时,设在Xi出发,距离为D,若从Xi左边一格Xj出发,每次往左走要比从Xi往左走短|Xi - Xj|,而向右走则每次多走|Xi - Xj|。不难理解当Xi处在最中间,走的路最短#include #include #include #include usi原创 2017-03-12 14:11:03 · 288 阅读 · 0 评论 -
HDU4821字符串哈希
原文出处:http://www.cnblogs.com/Norlan/p/4886383.html 写的超好http://acm.hdu.edu.cn/showproblem.php?pid=4821这是2013年长春区域赛的铜牌题。。。然而第一次做的时候一直觉得会超时的。。最后才知道并没有想象中的那么恐怖;这题有两个注意的地方:(1)h[i] = h[i-1]转载 2017-03-12 16:51:20 · 521 阅读 · 0 评论 -
hdu1213 并查集
没别的,只是贴出来留个历史#include #include using namespace std;int parent[1005];int find_parent(int a){ return parent[a] == a ? parent[a] : parent[a] = find_parent(parent[a]);//路径压缩}int原创 2017-03-13 19:17:05 · 243 阅读 · 0 评论 -
hdu1381 hash
http://www.cnblogs.com/gj-Acit/archive/2013/05/15/3080734.html题目大意就是将一个字符串分成长度为N的字串。且不同的字符不会超过NC个。问总共有多少个不同的子串。最初看了半天一直没看明白与哈希有什么关系(相信也有人和这个菜鸟我一样吧),无奈之下只好去搜结题报告,突然才明白原来那个NC作用大大。最后采用的办法转载 2017-03-13 20:40:32 · 321 阅读 · 0 评论 -
hdu2068RGP的错排
错排公式大家都会,不解释,主要是高中学的杨辉三角好用,不然会越界#include #include using namespace std;unsigned long long c[26][26] = {0};unsigned long long offset[20] = {0};int main(void){ c[1][1] = 1; c[原创 2017-03-14 00:22:49 · 251 阅读 · 0 评论 -
hdu1715大肥波数
动态申请内存为了减少储存空间浪费#include #include using namespace std;//用fib[i][0]表示长度,低位在前using namespace std;int *fib[1005];void add(int **num, const int *num1,int size1, const int *num2,原创 2017-03-14 17:54:46 · 337 阅读 · 0 评论 -
hdu1516 字符串编辑距离dp
wrong answer 无数次,然后把ios::sync_with_stdio(false)删掉,就ac了,至今不知道原因#include <iostream>#include <algorithm>#include <string>#include <stack>#include <cmath>#include <cstdio>#include <cstring>using nam原创 2017-04-11 19:50:52 · 305 阅读 · 0 评论 -
hdu 2610 全排列
#include <cstdio>#include <cmath>#include <iostream>#include <algorithm>#include <string>#include <vector>#include <cstring>using namespace std;int n, P, NUM, N; //N 表示此次输出的个数void Print(原创 2017-04-17 21:48:15 · 315 阅读 · 0 评论 -
hdu1249 三角形
用N个三角形最多可以把平面分成几个区域?一条直线和三角形的一角相交,会产生两个交点,从而新产生一条线段,这条新产生的线段便对应着新生成的面,即两个交点-->一个面。因为题目是三角形和三角形进行相交,产生的交点既是原来图像的交点,也是新加入的三角形的交点,即一个交点-->一个面。所以:新增一条直线,最多新增交点个数为原来三角形个数*2,因为直线可以和原来每个三角形的其中一个角相交。原创 2017-05-27 13:11:35 · 355 阅读 · 0 评论 -
hdu1284 钱币兑换
1.把问题看成整数划分f(n, m) 为把n划分为最大值不超过m的划分总数:f(n, m) = 1; (m == 1) n个1 f(n, n); (m > n) 最大值m不可能大于n f(n, m - 1) + 1; (m == n) 1个n 加上 最大值为n-1的个数原创 2017-05-27 15:24:11 · 252 阅读 · 0 评论 -
AOJ ALDS1_8_A: Binary Search Tree I
两种二叉搜索树的插入算法#include <iostream>#include <algorithm>#include <string>#include <vector>#include <cstdio>#include <map>using namespace std;const int SIZE = 10005;struct BSTNode{ int key; B原创 2017-05-21 15:59:10 · 350 阅读 · 0 评论 -
拨钟问题 穷举法
http://cxsjsxmooc.openjudge.cn/2017t2summerw1/b///一种操作执行0-3次是有意义的,便可枚举每种操作执行的次数。#include #include #include #include #include using namespace std;int oriClocks[9];int clocks[9];const cha原创 2017-07-16 13:00:46 · 568 阅读 · 0 评论 -
POJ 1845 Sumdiv: 分解质因数 + 母函数思想 + 逆元 + 分治
首先我们来读题Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).再注意一下数据范围中文意思也不难理解求的所有约数之和 ...原创 2019-01-30 17:25:54 · 302 阅读 · 0 评论