java 在算法竞赛的使用

写在前面

我发现用java 做复杂算法题的人真的很少很少,其实Java是一门很优秀的语言,利用好Java的特性,java的自带的一些方法(函数)可以帮助我们快速实现一些复杂的复杂的算法。

c++与java在算法竞赛的感觉对比

c++ 优点:好些!简洁!"听话"的语言(它的每一步操作我们大致知道发生了啥的)。
c++ 缺点: C++除了高精度稍微不方便以外就没有别的缺点了
Java优点:有大整数类!。Java能运行js代码,可以做一些求“1*2+3/4”这样的题。能进制转换!
Java缺点:Java除了有高精度以外都是缺点,内存大,耗时。java写代码不爽。java没有运算符重载,读个vector、map还要get、set的。java有宏吗?有人能背诵一下java的输入输出流重定向的代码吗?java也不像python、ruby、perl这三小流氓一样能用一两行写完简单题,自然吸引力不大。

STL

c++ java
priority_queue PriorityQueue
queue Queue
stack Stack
Map HashMap
set Set
vector Vector
bitset Bitset

一些常见的写法

排序p数组(下标从1开始)第a个元素到第b个元素排序
c++ :sort(p+1+a,p+1+b)
java :Array.sort(p,a,b)

在类或者结构体上定义排序按照a从小到大排序如果a一样大那么按照b从大到小排序
c++

struct node{
	int a,b;
	bool operator <(conts node &A){
		return a<A.a||(a==A.a&&b>A.b);
	}
};

java

class node  implements Comparable<node>{
	int a,b;
	int compareTo(node A){
           if(a<A.a) return -1;
           else if(a==A.a&&b>A.b) return -1;
           else return 1;
    }
}

一些有用的算法模板(java版)

java 所具有的大整数用法
题目案例:求 A B m o d P A^BmodP ABmodP
这里还有自带快速幂方法,舒服。
用c++自己实现一个大整数结构体挺累的,如果模数不是很大的话写个快速幂+龟速乘就可以通过了
CODE

spfa判断负环路模板
这里要用到Quque库,具体操作还是spfa用法
pell 返回队头
poll 弹出队头
add 添加元素到队列
CODE

最小生成树
在类上面接上一个Comparable 接口就可以按照某个值排序了
CODE

dijkstra最短路算法
时间复杂度 N l o g N NlogN NlogN
CODE

处理1~n的逆元
CODE

树状数组
树状数组是一个轻便的维护区间的一种技巧,很好写。
CODE

矩阵快速幂
矩阵快速幂可以加速式子的递推
这个代码求 A k A^k Ak
CODE

最近公共祖先
顾名思义:就是树上的一些的离他们最近的公共祖先节点。
CODE

Johnson 全源最短路
Johnson 和 Floyd 一样,是一种能求出无负环图上任意两点间最短路径的算法。该算法在 1977 年由 Donald B. Johnson 提出。
适用于边数较少点数较多的图,时间复杂度 n m l o g m nmlogm nmlogm
CODE

二分图最大匹配
给定一个二分图,其左部点的个数为n,右部点的个数为m,边数为e,求其最大匹配的边数。
CODE

线段树
线段树可以在nlogn维护区间的信息,对于区间可加性的维护很强。
CODE

树链剖分
它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组、BST、SPLAY、线段树等)来维护每一条链。
CODE

网络最大流
dinic 方法
CODE

最小费用最大流
SPFA方法
CODE

你可能感兴趣的:(java 在算法竞赛的使用)