基础算法(一、二、三)

快速排序:

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=(int)(1e6+5);
    static int mod=1000000007;
    static int a[]=new int[N];
    public static void quick_sort(int l,int r){
        if(l>=r) return;
        int x=a[l],i=l-1,j=r+1;
        while(l<r){
            do{i++;}while(a[i]<x);
            do{j--;}while(a[j]>x);
            if(i<j){
                int tmp=a[i];a[i]=a[j];a[j]=tmp;
            }
        }
        quick_sort(l,j);
        quick_sort(j+1,r);
    }
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt();
        for(int i=1;i<=n;i++) a[i]=cin.nextInt();
        quick_sort(1,n);

        System.out.close();
    }
}

归并排序:

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=(int)(1e6+5);
    static int mod=1000000007;
    static int a[]=new int[N],tmp[]=new int[N];
    public static void merge_sort(int l,int r){
        if(l>=r) return;
        int mid=l+r>>1;
        merge_sort(l,mid);merge_sort(mid+1,r);
        int k=0,i=l,j=mid+1;
        while(i<=mid&&j<=r){
            if(a[i]<=a[j]) tmp[k++]=a[i++];
            else tmp[k++]=a[j++];
        }
        while(i<=mid) tmp[k++]=a[i++];
        while(j<=r) tmp[k++]=a[j++];
        for(i=l,j=0;i<=r;i++,j++) a[i]=tmp[j];
    }
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt();
        for(int i=0;i<n;i++) a[i]=cin.nextInt();
        merge_sort(0,n-1);
        for(int i=0;i<n;i++)
            System.out.print(a[i]+" ");
        System.out.close();
    }
}

浮点数二分:

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=(int)(1e6+5);
    static int mod=1000000007;
    public static void main(String[] args) throws IOException {
        double x=cin.nextDouble();
        double l=0,r=x;
        while(r-l>1e-8){
            double mid=(l+r)/2;
            if(mid*mid>=x) r=mid;
            else l=mid;
        }
        System.out.printf("%.4f",r);
        System.out.close();
    }
}

高精度加法:

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static Vector a=new Vector(),b=new Vector(),c=new Vector();
    public static void add(Vector a,Vector b){
        int tmp=0;
        for(int i=0,j=0;i<a.size()||j<b.size();i++,j++){
            if(i<a.size()) tmp+=(int) a.get(i);
            if(j<b.size()) tmp+=(int) b.get(i);
            c.add(tmp%10);
            tmp/=10;
        }
        if(tmp>0) c.add(tmp);
    }
    public static void main(String[] args) throws IOException {
        String s1=cin.next();char c1[]=s1.toCharArray();
        String s2=cin.next();char c2[]=s2.toCharArray();
        for(int i=s1.length()-1;i>=0;i--) a.add(c1[i]-'0');
        for(int i=s2.length()-1;i>=0;i--) b.add(c2[i]-'0');
        add(a,b);
        for(int i=c.size()-1;i>=0;i--) System.out.print(c.get(i));
        System.out.close();
    }
}

高精度减法:

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static Vector a=new Vector(),b=new Vector(),c=new Vector();
    public static boolean cmp(Vector a,Vector b){
        if(a.size()!=b.size()) return a.size()>b.size();
        for(int i=a.size()-1;i>=0;i--){
            if(a.get(i)!=b.get(i)) return (int)(a.get(i))>=(int)(b.get(i));
        }
        return true;
    }
    public static void sub(Vector a,Vector b){
        for(int i=0,t=0;i<a.size();i++){
            t=(int)a.get(i)-t;
            if(i<b.size()) t-=(int)b.get(i);
            c.add((t+10)%10);
            if(t>=0) t=0;
            else t=1;
        }
        while(c.size()>1&&(int)c.get(c.size()-1)==0)
            c.remove(c.size()-1);
    }
    public static void main(String[] args) throws IOException {
        String s1=cin.next();char c1[]=s1.toCharArray();
        String s2=cin.next();char c2[]=s2.toCharArray();
        for(int i=s1.length()-1;i>=0;i--) a.add(c1[i]-'0');
        for(int i=s2.length()-1;i>=0;i--) b.add(c2[i]-'0');
        if(cmp(a,b)==true){
            sub(a,b);
            for(int i=c.size()-1;i>=0;i--) System.out.print(c.get(i));
        } else{
            System.out.print("-");
            sub(b,a);
            for(int i=c.size()-1;i>=0;i--) System.out.print(c.get(i));
        }
        System.out.close();
    }
}

高精度乘法

一个大数用vector,一个int类型数字相乘

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static Vector a=new Vector(),c=new Vector();
    public static void mul(Vector a,int b){
        for(int i=0,tmp=0;i<a.size()||tmp>0;i++){
            if(i<a.size()) tmp=(int)a.get(i)*b;
            c.add(tmp%10);
            tmp/=10;
        }
    }
    public static void main(String[] args) throws IOException {
        String s=cin.next();char c1[]=s.toCharArray();
        int b=cin.nextInt();
        for(int i=s.length()-1;i>=0;i--) a.add(c1[i]-'0');
        mul(a,b);
        for(int i=c.size()-1;i>=0;i--)
            System.out.print(c.get(i));
        System.out.close();
    }
}

高精度除法

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static Vector a=new Vector(),c=new Vector<>();
    public static void divide(Vector a,int b){
        int tmp=0;
        for(int i=a.size()-1;i>=0;i--){
            tmp=tmp*10+(int)a.get(i);
            if(tmp>=b){
                c.add(tmp/b);
                tmp%=b;
            }else{
                c.add(0);
            }
        }
        while(c.size()>1&&(int)c.get(0)==0)
            c.remove(0);
    }
    public static void main(String[] args) throws IOException {
        String s=cin.next();char c1[]=s.toCharArray();
        int b=cin.nextInt();
        for(int i=s.length()-1;i>=0;i--) a.add(c1[i]-'0');
        divide(a,b);
        for(int i=0;i<c.size();i++)
            System.out.print(c.get(i));
        System.out.close();
    }
}

子矩阵的和

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static int a[][]=new int[1005][1005],s[][]=new int[1005][1005];
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt(),m=cin.nextInt(),q=cin.nextInt();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                a[i][j]=cin.nextInt();
                s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
            }
        }
        while(m-->0){
            int x1=cin.nextInt(),y1=cin.nextInt(),x2=cin.nextInt(),y2=cin.nextInt();
            int ans=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
            System.out.println(ans);
        }
    }
}

差分

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static int a[]=new int[N],b[]=new int[N];
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt();int m=cin.nextInt();
        for(int i=1;i<=n;i++) a[i]=cin.nextInt();
        for(int i=1;i<=n;i++) b[i]=a[i]-a[i-1];
        while(m-->0){
            int l=cin.nextInt(),r=cin.nextInt(),x=cin.nextInt();
            b[l]+=x;b[r+1]-=x;
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            ans+=b[i];
            System.out.print(ans+" ");
        }
    }
}

二维差分

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static int a[][]=new int[1005][1005],b[][]=new int[1005][1005];
    public static void insert(int x1,int y1,int x2,int y2,int c){
        b[x1][y1]+=c;
        b[x2+1][y1]-=c;
        b[x1][y2+1]-=c;
        b[x2+1][y2+1]+=c;
    }
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt(),m=cin.nextInt(),q=cin.nextInt();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                a[i][j]=cin.nextInt();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                insert(i,j,i,j,a[i][j]);
        while(q-->0){
            int x1=cin.nextInt(),y1=cin.nextInt(),x2=cin.nextInt(),y2=cin.nextInt(),c=cin.nextInt();
            insert(x1,y1,x2,y2,c);
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++)
                System.out.print(b[i][j]+" ");
            System.out.println();
        }
        System.out.close();
    }
}
/*
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1
 */

双指针

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static int a[]=new int[1005];

    public static void main(String[] args) throws IOException {
        char s[]=cin.next().toCharArray();
        int res=0;
        for(int i=0,j=0;i<s.length;i++){
            a[s[i]-'0']++;
            while(a[s[i]-'0']>1){
                a[s[j]-'0']--;
                j++;
            }
            res=Math.max(res,i-j+1);
        }
        System.out.println(res);
        System.out.close();
    }
}

统计1的个数

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=1000010;
    static int mod=1000000007;
    static int a[]=new int[1005];
    public static int lowbit(int x){
        return x&(-x);
    }
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt();
        int res=0;
        while(n>0){
            n-=lowbit(n);res++;
        }
        System.out.println(res);
        System.out.close();
    }
}

离散化求区间和

import java.io.IOException;
import java.util.*;
public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=7000010;
    static int mod=1000000007;
    static int a[]=new int[N],sum[]=new int[N];
    static Vector all=new Vector();
    static Node add[]=new Node[N],query[]=new Node[N];
    public static int unique(Vector a){
        int j=0;
        for(int i=0;i<a.size();i++){
            if(i==0||a.get(i)!=a.get(i-1)){
                int tmp=(int)a.get(i);
                a.set(j++,tmp);
            }
        }
        while(a.size()!=j) a.remove(j);
        return j;
    }
    public static int find(int x){
        int l=0,r=all.size()-1,mid,ans=0;
        while(l<=r){
            mid=l+r>>1;
            if((int)all.get(mid)>=x) {
                r=mid-1;ans=mid;
            }
            else l=mid+1;
        }
        return ans+1;
    }
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt(),m=cin.nextInt();
        for(int i=0;i<n;i++){
            int x=cin.nextInt(),c=cin.nextInt();
            add[i]=new Node();
            add[i].x=x;add[i].y=c;
            all.add(x);
        }
        for(int i=0;i<m;i++){
            int l=cin.nextInt(),r=cin.nextInt();
            query[i]=new Node();
            query[i].x=l;query[i].y=r;
            all.add(l);all.add(r);
        }
        Collections.sort(all);
        int len=unique(all);
        // 处理插入
        for(int i=0;i<n;i++){
            int x=find(add[i].x);
            a[x]+=add[i].y;
        }
        // 前缀和
        for(int i=1;i<=all.size();i++) sum[i]=sum[i-1]+a[i];
        // 查询
        for(int i=0;i<m;i++){
            int l=find(query[i].x),r=find(query[i].y);
            System.out.println(sum[r]-sum[l-1]);
        }
        System.out.close();
    }
}
class Node{
    int x,y;
}
/*
3 3
1 2
3 6
7 5
1 3
4 6
7 8
 */

区间合并

public class Main {
    static Scanner cin=new Scanner(System.in);
    static int N=7000010,mod=1000000007;
    static int a[]=new int[N],sum[]=new int[N];
    public static void main(String[] args) throws IOException {
        int n=cin.nextInt();
        List<Node> e=new ArrayList<>();
        for(int i=0;i<n;i++){
            int st=cin.nextInt(),ed=cin.nextInt();
            Node tmp=new Node();tmp.st=st;tmp.ed=ed;
            e.add(tmp);
        }
        Collections.sort(e, new Comparator<Node>() {
            @Override
            public int compare(Node p1, Node p2) {
                if(p1.st==p2.st)
                    return p1.ed-p2.ed;
                return p1.st-p2.st;
            }
        });
        int ans=1,tmp=e.get(0).ed;
        for(int i=1;i<e.size();i++){
            int st=e.get(i).st,ed=e.get(i).ed;
            if(st<=tmp&&ed>tmp) tmp=ed;
            else if(tmp<st){
                ans++;tmp=ed;
            }
        }
        System.out.println(ans);
        System.out.close();
    }
}
class Node{
    int st,ed;
}

你可能感兴趣的:(算法,java,排序算法)