ACM-ICPC
ACM程序设计竞赛总结
wjsay
白色的蜻蜓,在空中忘记了飞行。
我的 github ID: zzuwenjie
展开
-
归并排序求逆序对数 (附另两种姿势BIT 线段树)
求逆序数 三种方法 归并排序 树状数组 线段树交换次数即为逆序对数poj1804数据范围小,int不会溢出,spoj上提价需用long long(注册spoj时,获取验证码时会访问谷歌,所以需要……)#define _CRT_SECURE_NO_WARNINGS#include #include const int maxn = 2e5 + 7;int a[maxn], b[maxn];long long cnt;//函数原创 2017-07-07 09:46:55 · 405 阅读 · 0 评论 -
南京Oj1225,石子合并,DP
南京OJ1225超链接千万别写成贪心算法了,代码注释中有一些解释zzuwenjie 2017-3-23 22:17:09 其中那个求区间和的想法比较好。时间复杂度 O(N^3),我班那谁说有NlogN的,反正我不信原创 2017-03-23 22:21:29 · 884 阅读 · 0 评论 -
最长上升子序列, N*logN,九度OJ 1533,二分+DP
最长上升子序列, N*logN,九度OJ 1533,二分+DP给定n个整数,求最长上升子序列的个数例如 -1,1, 2, 2, 3 的LIS为4 (-1, 1, 2, 3)下面算法参考了《编程之美》和别人的博客。利用了二分查找,优化了一般的O(N^2)的算法,时间复杂度O(N*logN)#define _CRT_SECURE_NO_WARNINGS#include #inc原创 2017-03-29 21:22:49 · 368 阅读 · 0 评论 -
最长公共子序列,DP,LCS
题目描述:Find a longest common subsequence of two strings.输入:First and second line of each input case contain two strings of lowercase character a…z. There are no spaces before, inside or af原创 2017-03-30 13:05:38 · 400 阅读 · 0 评论 -
拦截导弹,最长非上升子序列,DP+二分
题目描述:某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。 输入:每组原创 2017-03-30 19:59:59 · 391 阅读 · 0 评论 -
最大连续子序列和
题目描述:给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的“序列和”。对于S的所有非空连续子序列T,求最大的序列和。变量条件:N为正整数,N≤1000000,结果序列和在范围(-2^63,2^63-1)以内。 输入:第一行为一个正整数N,第二行为N个整数,表示序列中的数。输出:输入可能包括多组数据,对于每一原创 2017-03-30 22:18:19 · 344 阅读 · 0 评论 -
0-1背包(空间优化)
代码先行,输入和函数实现分开了,便于复用代码,后面有背包九讲的解释poj3624,这是一个超链接(人性化吧)#define _CRT_SECURE_NO_WARNINGS#include #include #include #include #include #include #include #include #include #include #include原创 2017-04-14 12:47:13 · 756 阅读 · 0 评论 -
完全背包
void CompletePack(int C, int N, int W[], int V[]) { memset(dp, 0, sizeof (dp)); for (int i = 1; i <= N; ++i) { for (int j = w[i]; j <= C; ++j) dp[j] = max(dp[j], dp[j - w[i]] + v[i]); }}2 完全背原创 2017-04-15 13:14:07 · 213 阅读 · 0 评论 -
多重背包(二进制优化)
马上就要轻院校赛了,没时间了,下面是网上找的多重背包,感觉很好void ZeroOnePack(int cost, int weight, int n) { for (int i = n; i >= cost; i--) dp[i] = max(dp[i], dp[i - cost] + weight);}void CompletePack(int cost, int weight,转载 2017-04-15 23:25:46 · 520 阅读 · 0 评论 -
2017百度之星资格赛 1002-图 1003-DP 1004-01背包(解选择方案)
1002就是考察一下普通的图的问题,这不是求割点吧,只要可以孤立出一个谍者就可以了题目并没有给出太多信息,没有说有无重边,有无自环,图是否连通。所以这些都有可能。并不是想当然的无自环,一定连通的图。百度之星2017 资格赛 1003 度度熊与邪恶大魔王dp状态见代码注释原创 2017-08-05 23:52:45 · 978 阅读 · 0 评论 -
hdu1078 fatmouse and cheese 记忆化搜索
我是很少做动态规划的,认为做不出来,但现在必须做了。记忆化搜索,维护dp[i][j]为胖老鼠能到达的方格mp[i][j]所得到的最多的奶酪(当然是递增地走,每一移动不超过k格)。深搜#include #include #include using namespace std;const int N = 112;int mp[N][N], dp[N][N], n, k, maxV原创 2017-08-18 09:25:46 · 342 阅读 · 0 评论 -
dijkstra算法,单源最短路径算法,含记录路径
v0为源点,N为邻接矩阵的阶,edge为邻接矩阵,maxn为常量,path用来保存路径节点的前驱,D用来保存最短路径权重和。顺便说一下,严蔚敏的数据结构中的这个算法只能保存最短路径上的节点,并得不到先后顺序。//从某个点到其余各点间的最小距离void dijkstra(int v0, int N, int edge[][maxn], int path[], int D[]) { for (原创 2017-03-19 22:55:04 · 886 阅读 · 0 评论 -
最小生成树,MST,Prim算法,poj2485
最小生成树prim算法,参考严蔚敏的《数据结构C语言版》和郑州大学的课件HighwaysTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 30366 Accepted: 13815DescriptionThe island nation of原创 2017-04-01 15:50:54 · 683 阅读 · 0 评论 -
最小生成树
无向图,最小生成树MST,节点有1到n,PRIM算法,O(n^n)#define _CRT_SECURE_NO_WARNINGS#include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2017-04-12 11:54:09 · 284 阅读 · 0 评论 -
深度理解链式前向星
摘自ACDreamers,略加改动我们首先来看一下什么是前向星.前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.用len[i]来记录所有以i为起点的边在数组中的存储长度.用head[i]记录转载 2017-04-29 15:01:53 · 456 阅读 · 1 评论 -
spfa 快速最短路-队列优化
spfa 快速最短路-队列优化,可以用 hdu2544 验证算法的正确性里面的spfa算法摘自ardart 的板子。把这个函数记录在网上,以免忘记。我再理解下。#define _CRT_SECURE_NO_WARNINGS#include #include #include #include using namespace std;const int maxn = 1e4原创 2017-05-20 13:34:56 · 358 阅读 · 0 评论 -
hdu5273 Abandoned country 最小生成树 概率 Kruskal算法 前向星存图
有图 Abandoned country题目大意:有n(n因为n很大所以用kruskal求最小生成树求出最小花费,然后dfs搜索回溯的办法找到所有情况每条路用过的次数并求出总花费,用总花费除以所有可能发生的次数(n*(n-1)/2)就是我们要求原创 2017-07-31 17:34:13 · 381 阅读 · 0 评论 -
素数筛选法 O(n) O(nlgn) uva10357 选择与除法
主要介绍两种素数筛选法原创 2016-08-28 15:08:45 · 503 阅读 · 0 评论 -
数字统计问题
输入一个数字n,统计1到n使用了多少个0,1,2,,9。#include#include#includeusing namespace std;void pageNumber(int n, int cnt[]);int main() { int x; while (cin >> x) { int ans[10] = { 0 }; pageNumber(x, ans);原创 2017-03-01 23:11:26 · 378 阅读 · 0 评论 -
母函数
Holding Bin-Laden Captive!母函数应用,虽然有简便解法#include using namespace std;const int maxn = 8000 + 7;long long c1[maxn], c2[maxn];int main(){ int ary[] = { 0, 1, 2, 5 }; int n[10]; while (cin >> n[原创 2017-04-20 22:43:12 · 336 阅读 · 0 评论 -
矩阵快素幂 板子
求递推公式的第n项,当n很大时,用矩阵快速幂很有效。时间复杂度O(m^3*logn),m为递推公式跨越了几项。以杭电2017女生专场赛 happy necklace 为例,看如何套板子。分析的递推公式 如图:根据递推公式写出计算an的矩阵,然后套下面板子(计算矩阵乘时,有优化)#define _CRT_SECURE_NO_WARNINGS#include #原创 2017-07-21 09:31:52 · 415 阅读 · 0 评论 -
高斯消元 矩阵求秩
以 杭电zhu and 772002 为例,看高斯消元如何使用矩阵的秩等于矩阵线性无关的列的数量,自由度 = 矩阵列数 - 矩阵的秩。摘自贴吧。线性代数,忘了。好像是通过行变换,得到一个上三角矩阵,求出某一变元的解,然后回迭求解。下面是个例子:#define _CRT_SECURE_ON_WARNINGS#include #include #include usin原创 2017-07-22 08:59:01 · 2930 阅读 · 0 评论 -
再看 唯一分解定理 UVA Choose and divide
先用线性素数筛筛选出某一范围的素数,然后可以把若干数分解成素数相乘的多项式(大白话:小学五年级的质因子分解)。可以解决组合数问题,避免中间数据太大无法表示的问题。 以 UVA Choose and divide 为例#include #include #include #include using namespace std;const int N = 10000;bo原创 2017-07-27 21:14:13 · 285 阅读 · 0 评论 -
欧拉函数 Totient Extreme
欧拉函数定义:欧拉函数φ(n), 表示小于或等于n的数中,与n互质的数的数目。欧拉函数求值方法:(1)、φ(1) = 1.(2)、若n是素数p的k次幂,φ(n) = p ^k - p^(k-1) = (p - 1) * p^(k - 1).(3)、若m, n互质,φ(mn) = φ(m)*φ(n).根据欧拉函数的定义,可以求出欧拉函数的递推式:令p为N的最小质因原创 2017-08-21 20:17:54 · 371 阅读 · 0 评论 -
大数乘法--------------------------51nod1027
10^1000内的两个大数相乘,10^1000000内的大数相乘是5级算法题,有些难,得用快速傅里叶变换。上一篇讲了大数的阶乘,用的是10000进制,这一篇是大数乘法,也是用10000进制做的。模拟中国教学的笔算十进制方法(不同于西方国家),进行大数相乘。比大数的阶乘难了一丢丢,因为阶乘是一个大数乘以一个10000以内的数。而大数乘法是两个1000位(本题)的大数相乘,多了个大数的加法运算原创 2017-08-27 20:49:32 · 445 阅读 · 0 评论