留坑,暂时没时间准备蓝桥杯,等省赛前两周再来准备。
龟速更新
文章目录
基操
代码如下:
//格式控制
double ans=0.11111111;
String.format("%.2f", ans)
//大小写
s=s.toLowerCase();
//输入字符数组
c[i] = reader.nextLine().toCharArray();
//排序 1~n
Arrays.sort(a,1,1+n);
//离散化
TreeSet<Integer> s = new TreeSet<>();
for(int x : nums) s.add(x);
Map<Integer, Integer> mp = new HashMap<>();
int rank = 1;
for(Integer x : s) mp.put(x, rank++);
map
代码如下:
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
map.containsKey(x) //返回bool 查看map中是否有x
map.put(x, k); // 给x设置k
map.get(x); // 获取x的键值对
for(int u : map.values() ) // 遍历map的元素集
for(int v : map.keySet() ) // 遍历map的键值对集
map.put(s,(map.get(s)==null?1:map.get(s)+1)); //基操
BigInteger
代码如下:
//大整数循环
BigInteger a = cin.nextBigInteger();
for(BigInteger i=BigInteger.ONE;i.compareTo(a)<=0;i=i.add(BigInteger.ONE))
最大公约数以及最小公倍数
代码如下:
static int gcd(int a, int b) { //最大公约数
if(b==0) return a;
else return gcd(b,a%b);
}
static int lcm(int a,int b) { //最小公倍数
return a*b/gcd(a,b);
}
背包系列
代码如下:
for(int i=1;i<=n;i++)
for(int j=V;j>=v[i];j--)
dp[j]=Math.max(dp[j], dp[j-v[i]]+w[i]);
枚举子集
代码如下:
//dfs
static void dfs(int cnt,int tot,int sum) {
if() return ;
vis[]=true;
if() return ;
dfs(cnt+1,tot+1,sum+a[tot]);
dfs(cnt,tot+1,sum);
}
//二进制枚举
for(int i=0;i< (1<< ) ;i++) {
int res=0;
if(count(i)> ) continue;
for(int j=0;j< ;j++)
if( ((i>>j)&1) == 1)
res+= ;
if( ) vis[res]=true;
}
矩阵快速幂
代码如下:
static int n,m;
public static int[][] mul(int a[][],int b[][])
{
int ans[][]=new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
ans[i][j]=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
ans[i][j]=ans[i][j]+a[i][k]*b[k][j];
return ans;
}
public static int[][] qp(int a[][],int b)
{
int ans[][]=new int[n][n];
for(int i=0;i<n;i++)
ans[i][i]=1;
while(b!=0)
{
if(b%2==1) ans=mul(ans,a);
a=mul(a,a);
b>>=1;
}
return ans;
}
字符串的最小循环节/循环周期
代码如下:
public class Main {
static int nexts[]=new int[1000000];
static char p[]=new char[1000000];
static int m;
static void getnexts() {
int i=0,j=-1;
nexts[i]=j;
while(i<m) {
if(j==-1||p[i]==p[j]) nexts[++i]=++j;
else j=nexts[j];
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String s=cin.next();
m=s.length();
p=s.toCharArray();
getnexts();
int ans=m-nexts[m];
if(m%ans==0&&ans!=m) System.out.println(m/ans);
else System.out.println(1);
}
}
------------ 图论分割线 --------------
图论开荒必备技能
代码如下:
// 邻接表建图
public class Main {
static ArrayList<Integer>[] edge = new ArrayList[105];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
for(int i=1;i<=n;i++)
edge[i] = new ArrayList<>();
for(int i=1;i<n;i++) {
int u= cin.nextInt() , v= cin.nextInt();
edge[u].add(v);
edge[v].add(u);
}
}
}
//前向星
public class Main {
class node{
int v,next;
}
static node a[] =new node[100005];
static int head [] =new int[100005];
static int k=0;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
Main main= new Main();
int n = cin.nextInt();
for(int i=1;i<n;i++) {
int u= cin.nextInt() , v= cin.nextInt();
a[++k]=main.new node();
a[k].v=v;
a[k].next=head[u];
head[u]=k;
}
}
}
最小生成树
代码如下:
public class Main {
public class node implements Comparable{
int u,v,w;
node(int a, int b , int c){
this.u=a;
v=b;
w=c;
}
public int compareTo(Object o) {
if(o instanceof node) {
node b = (node)o;
if(this.w>b.w) return 1;
else if(this.w==b.w) return 0;
else return -1;
}
return 0;
}
}
static node a[]= new node[100005];
static int f[] =new int[10005];
private static int find(int x) {
if(f[x]==x) return x;
else return f[x]=find(f[x]);
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
Main mains = new Main();
int n= cin.nextInt();
int m= cin.nextInt();
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++) {
int u=cin.nextInt(),v=cin.nextInt(),w=cin.nextInt();
a[i]=mains.new node(u,v,w);
}
Arrays.parallelSort(a,1,1+m);
long ans=0;
int cnt=1;
for(int i=1;i<=m;i++) {
int u=a[i].u,v=a[i].v,w=a[i].w;
int fu = find(u) , fv=find(v);
if(fu==fv) continue;
if(fu<fv) f[fv]=fu;
else f[fu]=fv;
cnt++;
ans+=w;
if(cnt==n) break;
}
System.out.println(ans);
}
}
树的直径
代码如下:
public class Main {
static ArrayList<Integer>[] edge = new ArrayList[100005];
static int dp[] =new int[100005];
static boolean vis[] =new boolean[100005];
static int ans=0;
static void dfs(int u) {
vis[u]=true;
for(int v : edge[u]) {
if(vis[v]) continue;
dfs(v);
ans=Math.max(ans, dp[u]+dp[v]+1);
dp[u]=Math.max(dp[u], dp[v]+1);
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
Main main= new Main();
int n= cin.nextInt();
for(int i=1;i<=n;i++)
edge[i] = new ArrayList<>();
for(int i=1;i<n;i++) {
int u=cin.nextInt(),v=cin.nextInt();
edge[u].add(v);
edge[v].add(u);
}
dfs(1);
System.out.println(ans);
}
}
拓扑排序
代码如下:
public class Main {
static ArrayList<Integer>[] edge = new ArrayList[100005];
static int d[] =new int [100005];
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
Main main= new Main();
int n= cin.nextInt(),m=cin.nextInt();
for(int i=1;i<=n;i++) edge[i]=new ArrayList<>();
for(int i=1;i<=m;i++) {
int u=cin.nextInt(),v=cin.nextInt();
edge[u].add(v);
d[v]++;
}
Queue<Integer> q= new LinkedList<Integer>();
for(int i=1 ;i<=n;i++) {
if(d[i]==0)
q.add(i);
}
ArrayList<Integer> ans= new ArrayList<Integer>();
while(q.size()>0){
int u=q.poll();
ans.add(u);
for(int v : edge[u]) {
d[v]--;
if(d[v]==0) q.add(v);
}
}
for(int i: ans) System.out.println(i);
}
}
最短路
代码如下:
public class Main {
class edge {
int v, next ,w;
}
static int head[] = new int[1005];
static int d[] = new int[1005];
static boolean vis[] =new boolean[1005];
static edge a[] =new edge[20001];
static int n,m,k=0;
static class node implements Comparable<node>{
int w,u;
public node(int w,int u) {
this.w=w; this.u=u;
}
public int compareTo(node a) {
if(w>a.w) return 1;
else if(w==a.w) return 0;
else return -1;
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
Main main= new Main();
n= cin.nextInt(); m=cin.nextInt();
for(int i=1;i<=2*m;i++)
a[i]=main.new edge();
for(int i=1;i<=m;i++) {
int u=cin.nextInt(),v=cin.nextInt(),w=cin.nextInt();
a[++k].v=v; a[k].next=head[u]; a[k].w=w; head[u]=k;
a[++k].v=u; a[k].next=head[v]; a[k].w=w; head[v]=k;
}
PriorityQueue<node> q = new PriorityQueue<>();
q.add( new node(0,1) );
for(int i=1;i<=n;i++) d[i]=0x3f3f3f3f;
d[1]=0;
while(q.size()>0) {
node x = q.poll();
int u=x.u;
if(vis[u]) continue;
vis[u]=true;
for(int i=head[u];i>0;i=a[i].next) {
int v=a[i].v,w=a[i].w;
if(!vis[v]&&d[v]>d[u]+w) {
d[v]=d[u]+w;
q.add(new node(d[v],v));
}
}
}
System.out.println(d[n]);
}
}
------------ Java表达C++函数分割线 --------------
__builtin_popcountll
代码如下:
private static int count(int i) {
int cnt =0;
while(i>0) {
if((i&1)==1) cnt++;
i>>=1;
}
return cnt;
}
}