AcWing算法基础课-代码(c++、python、JAVA)(更新中...)

基础算法

快速排序

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
void qsort(int a[],int l,int r){
    if(l>=r)return ;
    int i=l-1,j=r+1,x=a[(l+r)>>1];
    while(i<j){
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j)swap(a[i],a[j]);
    }
    qsort(a,l,j);
    qsort(a,j+1,r);
}
int main(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    qsort(a,1,n);
    for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[n];
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        qsort(a,0,n-1);
        for(int i=0;i<n;i++)System.out.printf("%d ",a[i]);
    }
    public static void qsort(int[] a,int l,int r){
        if(l>=r)return ;
        int i=l-1,j=r+1,x=a[(l+r)>>1];
        while(i<j){
            do i++;while(a[i]<x);
            do j--;while(a[j]>x);
            if(i<j){
                int t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
        qsort(a,l,j);
        qsort(a,j+1,r);
    }
}

 python

def qsort(a,l,r):
    if l>=r:
        return;
    i,j,x=l-1,r+1,a[(l+r)>>1]
    while i<j:
        while True:
            i+=1
            if a[i]>=x:
                break
        while True:
            j-=1
            if a[j]<=x:
                break
        if i<j:
            a[i],a[j]=a[j],a[i]
    qsort(a,l,j)
    qsort(a,j+1,r)
n=int(input())
a=list(map(int,input().split()))
qsort(a,0,n-1)
for x in a:
    print(x,end=" ")

第k个数

C++

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
void qsort(int a[],int l,int r){
    if(l>=r)return ;
    int i=l-1,j=r+1,x=a[(l+r)>>1];
    while(i<j){
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j)swap(a[i],a[j]);
    }
    qsort(a,l,j);
    qsort(a,j+1,r);
}
int main(){
    int n,k;scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    qsort(a,1,n);
    printf("%d\n",a[k]);
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),k=sc.nextInt();
        int[] a=new int[n+1];
        for(int i=1;i<=n;i++)a[i]=sc.nextInt();
        qsort(a,1,n);
        System.out.println(a[k]);
    }
    public static void qsort(int[] a,int l,int r){
        if(l>=r)return ;
        int i=l-1,j=r+1,x=a[(l+r)>>1];
        while(i<j){
            do i++;while(x>a[i]);
            do j--;while(x<a[j]);
            if(i<j){
                int t=a[i];
                a[i]=a[j];
                a[j]=t;
            }        
        }
        qsort(a,l,j);
        qsort(a,j+1,r);
    }
}

python

def qsort(a,l,r):
    if l>=r:
        return
    i,j,x=l-1,r+1,a[(l+r)>>1]
    while i<j:
        while True:
            i+=1
            if a[i]>=x:
                break
        while True:
            j-=1
            if a[j]<=x:
                break
        if i<j:
            a[i],a[j]=a[j],a[i]
    qsort(a,l,j)
    qsort(a,j+1,r)
n,k=map(int,input().split())
a=list(map(int,input().split()))
qsort(a,0,n-1)
print(a[k-1])

归并排序

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],tmp[N];
void msort(int a[],int l,int r){
    if(l>=r)return;
    int mid=(l+r)>>1;
    msort(a,l,mid),msort(a,mid+1,r);
    int i=l,j=mid+1;
    int k=0;
    while(i<=mid and 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(int i=l,k=0;i<=r;i++,k++)a[i]=tmp[k];
}
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    msort(a,0,n-1);
    for(int i=0;i<n;i++)printf("%d ",a[i]);
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int []a;
    public static int []tmp;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        a=new int[n];
        tmp=new int[n];
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        msort(a,0,n-1);
        for(int i=0;i<n;i++)System.out.printf("%d ",a[i]);
    }
    public static void msort(int[] a,int l,int r){
        if(l>=r)return;
        int mid=(l+r)>>1;
        msort(a,l,mid);
        msort(a,mid+1,r);
        int i=l,j=mid+1;
        int k=0;
        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,k=0;i<=r;i++,k++)a[i]=tmp[k];
    }
}

python

tmp=[0 for i in range(100010)]
def msort(a,l,r):
    if l>=r:
        return 
    mid=(l+r)>>1
    msort(a,l,mid)
    msort(a,mid+1,r)
    k,i,j=0,l,mid+1
    while i<=mid and j<=r:
        if a[i]<a[j]:
            tmp[k]=a[i]
            k+=1
            i+=1
        else:
            tmp[k]=a[j]
            k+=1
            j+=1
    while i<=mid:
        tmp[k]=a[i]
        k+=1
        i+=1
    while j<=r:
        tmp[k]=a[j]
        k+=1
        j+=1
    k,i=0,l
    while True:
        if i>r:
            break
        a[i]=tmp[k]
        k+=1
        i+=1
n=int(input())
a=list(map(int,input().split()))

msort(a,0,n-1)
for x in a:
    print(x,end=" ")

逆序对的数量 

C++

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=100010;
int a[N],tmp[N];
ll cnt;
void msort(int a[],int l,int r){
    if(l>=r)return;
    int mid=(l+r)>>1;
    msort(a,l,mid),msort(a,mid+1,r);
    int i=l,j=mid+1,k=0;
    while(i<=mid and j<=r){
        if(a[i]<=a[j])tmp[k++]=a[i++];
        else{
            cnt+=mid-i+1;
            tmp[k++]=a[j++];
        }
    }
    while(i<=mid)tmp[k++]=a[i++];
    while(j<=r)tmp[k++]=a[j++];
    for(int i=l,k=0;i<=r;i++,k++)a[i]=tmp[k];
}
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    msort(a,0,n-1);
    cout<<cnt<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] a;
    public static int[] tmp;
    public static long cnt;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        a=new int[n];
        tmp=new int[n];
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        msort(a,0,n-1);
        System.out.println(cnt);
    }
    public static void msort(int[] a,int l,int r){
        if(l>=r)return ;
        int mid=(l+r)>>1;
        msort(a,l,mid);
        msort(a,mid+1,r);
        int i=l,j=mid+1,k=0;
        while(i<=mid&&j<=r){
            if(a[i]<=a[j])tmp[k++]=a[i++];
            else {
                cnt+=mid-i+1;
                tmp[k++]=a[j++];
            }
        }
        while(i<=mid)tmp[k++]=a[i++];
        while(j<=r)tmp[k++]=a[j++];
        for(i=l,k=0;i<=r;i++,k++)a[i]=tmp[k];
    }
}

python

cnt=0
tmp=[0 for i in range(100010)]
def msort(a,l,r):
    global cnt
    if l>=r:
        return
    mid=(l+r)>>1
    msort(a,l,mid)
    msort(a,mid+1,r)
    i,j,k=l,mid+1,0
    while i<=mid and j<=r:
        if a[i]<=a[j]:
            tmp[k]=a[i]
            k,i=k+1,i+1
        else:
            cnt+=mid-i+1
            tmp[k]=a[j]
            k,j=k+1,j+1
    while i<=mid:
        tmp[k]=a[i]
        k,i=k+1,i+1
    while j<=r:
        tmp[k]=a[j]
        k,j=k+1,j+1
    for i in range(l,r+1):
       a[i]=tmp[i-l]
n=int(input())
a=list(map(int,input().split()))
msort(a,0,n-1)
print(cnt)

数的范围 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m,a[N];
void echo(int x){
    int l=0,r=n-1;
    while(l<r){
        int mid=(l+r)>>1;
        if(a[mid]>=x)r=mid;
        else l=mid+1;        
    }
    if(a[l]!=x){
        cout<<"-1 -1"<<'\n';
        return;
    }
    cout<<l<<' ';
    l=0,r=n-1;
    while(l<r){
        int mid=(l+r+1)>>1;
        if(a[mid]<=x)l=mid;
        else r=mid-1;
    }
    cout<<l<<"\n";

}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    while(m--){
        int x;scanf("%d",&x);
        echo(x);
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] a;
    public static int n,m;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        a=new int[n];
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        while(m-->0){
            int x=sc.nextInt();
            echo(x);
        }
    }
    public static void echo(int x){
        int l=0,r=n-1;
        while(l<r){
            int mid=(l+r)>>1;
            if(a[mid]>=x)r=mid;
            else l=mid+1;
        }
        if(a[l]!=x){
            System.out.println("-1 -1");
            return ;
        }
        System.out.printf("%d ",l);
        l=0;
        r=n-1;
        while(l<r){
            int mid=(l+r+1)>>1;
            if(a[mid]<=x)l=mid;
            else r=mid-1;
        }
        System.out.println(l);
    }
}

python

n,m=map(int,input().split())
def echo(x):
    l,r=0,n-1
    while l<r:
        mid=(l+r)>>1
        if a[mid]>=x:
            r=mid
        else:
            l=mid+1
    if a[l]!=x:
        print("-1 -1")
        return
    print(l,end=" ")
    l,r=0,n-1
    while l<r:
        mid=(l+r+1)>>1
        if a[mid]<=x:
            l=mid
        else:
            r=mid-1
    print(l)
a=list(map(int,input().split()))
while m>0:
    x=int(input())
    echo(x)
    m-=1

数的三次方根 

C++

#include<bits/stdc++.h>
using namespace std;
int main(){
    double n;scanf("%lf",&n);
    double l=-1000,r=1000;
    while(r-l>=1e-8){
        double mid=(l+r)/2;
        if(mid*mid*mid<n)l=mid;
        else r=mid;
    }
    printf("%.6lf",l);
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        double n=sc.nextDouble();
        double l=-1000,r=1000;
        while(r-l>1e-8){
            double mid=(l+r)/2;
            if(mid*mid*mid<n)l=mid;
            else r=mid;
        }
        System.out.printf("%.6f",l);
    }
}

python

n=float(input())
l,r=-1000,1000
while r-l>1e-8:
    mid=(l+r)/2
    if mid*mid*mid<n:
        l=mid
    else:
        r=mid
print("%.6f"%l)

高精度加法

C++

#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int>&A,vector<int>&B)
{
    int t=0;
    vector<int>C;
    for(int i=0;i<A.size()||i<B.size();i++)
    {
        if(i<A.size())t+=A[i];
        if(i<B.size())t+=B[i];
        C.push_back(t%10);
        t/=10;
    }
    if(t)C.push_back(t);
    return C;
}
int main()
{
    string a;
    string b;
    cin>>a>>b;
    vector<int>A;vector<int>B;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
    auto C = add(A,B);
    for(int i=C.size()-1;i>=0;i--)cout<<C[i];
 } 

java

import java.math.BigInteger;
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        BigInteger a=new BigInteger(sc.next());
        BigInteger b=new BigInteger(sc.next());
        System.out.println(a.add(b));
    }
}

python

a=int(input())
b=int(input())
print(a+b)

 高精度减法

C++

#include<bits/stdc++.h>
using namespace std;
bool cmp(vector<int>&A,vector<int>&B){
    if(A.size()!=B.size())return A.size()>B.size();
    for(int i=A.size()-1;i>=0;i--)if(A[i]!=B[i])return A[i]>B[i];
    return true;
}
vector<int> sub(vector<int>&A,vector<int>&B){
    if(!cmp(A,B)){
        cout<<"-";
        return sub(B,A);
    }
    vector<int>C;
    int t=0;
    for(int i=0;i<A.size();i++){
        t=A[i]-t;
        if(i<B.size())t-=B[i];
        C.push_back((t+10)%10);
        if(t<0)t=1;
        else t=0;
    }
    while(C.size()>1 and C.back()==0)C.pop_back();
    return C;
}
int main(){
    string a,b;
    cin>>a>>b;
    vector<int>A,B;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
    auto C=sub(A,B);
    for(int i=C.size()-1;i>=0;i--)cout<<C[i];
    cout<<endl;
    return 0;
}

java

import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        BigInteger a=new BigInteger(sc.next());
        BigInteger b=new BigInteger(sc.next());
        System.out.println(a.subtract(b));
    }
}

python

a=int(input())
b=int(input())
print(a-b)

高精度乘法 

C++

#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> &A,int b){
    vector<int>C;
    int t=0;
    for(int i=0;i<A.size() or t;i++){
        if(i<A.size())t+=b*A[i];
        C.push_back(t%10);
        t/=10;
    }
    while(C.size()>1 and C.back()==0)C.pop_back();
    return C;
}
int main(){
    string a;
    int b;cin>>a>>b;
    vector<int>A;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
    auto C=mul(A,b);
    for(int i=C.size()-1;i>=0;i--)printf("%d",C[i]);
    cout<<endl;
    return 0;
}

java

import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        BigInteger a=new BigInteger(sc.next());
        BigInteger b=new BigInteger(sc.next());
        System.out.println(a.multiply(b));
    }
}

python

a=int(input())
b=int(input())
print(a*b)

高精度除法 

C++

#include<bits/stdc++.h>
using namespace std;
vector<int>div(vector<int>&A,int b,int&r){
    r=0;
    vector<int>C;
    for(int i=A.size()-1;i>=0;i--){
        r=r*10+A[i];
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());
    while(C.size()>1 and C.back()==0)C.pop_back();
    return C;
}
int main(){
    string a;
    int B,r;
    cin>>a>>B;
    vector<int>A;
    for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
    vector<int>C=div(A,B,r);
    for(int i=C.size()-1;i>=0;i--)cout<<C[i];
    cout<<'\n'<<r<<'\n';
    return 0;
}

java

import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        BigInteger a=new BigInteger(sc.next());
        BigInteger b=new BigInteger(sc.next());
        BigInteger[] c=a.divideAndRemainder(b);
        System.out.println(c[0]);
        System.out.println(c[1]);
    }
}

python

a=int(input())
b=int(input())
print(a//b)
print(a%b)

前缀和 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],s[N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        s[i]=s[i-1]+a[i];
    }
    while(m--){
        int l,r;scanf("%d%d",&l,&r);
        cout<<s[r]-s[l-1]<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        int[] a=new int[n+1];
        int[] s=new int[n+1];
        for(int i=1;i<=n;i++)a[i]=sc.nextInt();
        for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
        while(m-->0){
            int l=sc.nextInt(),r=sc.nextInt();
            System.out.println(s[r]-s[l-1]);
        }
    }
}

python

s=[0 for i in range(100010)]
n,m=map(int,input().split())
a=list(map(int,input().split()))
a=[0]+a;
for i in range(1,n+1):
    s[i]=s[i-1]+a[i]
while m:
    l,r=map(int,input().split())
    print(s[r]-s[l-1])
    m-=1

子矩阵的和 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int g[N][N],s[N][N];
int main(){
    int n,m,q;scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&g[i][j]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            s[i][j]=g[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
    while(q--){
        int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<"\n";
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt(),q=sc.nextInt();
        int[][] g=new int[n+1][m+1];
        int[][] s=new int[n+1][m+1];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                g[i][j]=sc.nextInt();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                s[i][j]=g[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
        while(q-->0){
            int x1=sc.nextInt(),y1=sc.nextInt(),x2=sc.nextInt(),y2=sc.nextInt();
            System.out.println(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]);
        }
    }
}

python

n,m,q=map(int,input().split())
a=[[0] for i in range(1010)]
s=[[0]*1010 for i in range(1010)]
for i in range(1,n+1):
    for x in list(map(int,input().split())):
        a[i].append(x)
for i in range(1,n+1):
    for j in range(1,m+1):
        s[i][j]=a[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1]
for i in range(q):
    x1,y1,x2,y2=map(int,input().split())
    print(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1])

差分 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],b[N];
int s[N];
void insert(int l,int r,int c){
    b[l]+=c;
    b[r+1]-=c;
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        insert(i,i,a[i]);
    }
    for(int i=1;i<=m;i++){
        int l,r,c;scanf("%d%d%d",&l,&r,&c);
        insert(l,r,c);
    }
    for(int i=1;i<=n;i++)s[i]=s[i-1]+b[i];
    for(int i=1;i<=n;i++)cout<<s[i]<<' ';
    cout<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] a,b,s;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        a=new int[n+2];
        b=new int[n+2];
        s=new int[n+2];
        for(int i=1;i<=n;i++){
            a[i]=sc.nextInt();
            insert(i,i,a[i]);
        }
        while(m-->0){
            int l=sc.nextInt(),r=sc.nextInt(),c=sc.nextInt();
            insert(l,r,c);
        }
        for(int i=1;i<=n;i++){
            s[i]=s[i-1]+b[i];
            System.out.print(s[i]+" ");
        }
        System.out.println();
    }
    public static void insert(int l,int r,int c){
        b[l]+=c;
        b[r+1]-=c;
    }
}

python

b=[0 for i in range(100010)]
s=[0 for i in range(100010)]
def insert(l,r,c):
    b[l]+=c
    b[r+1]-=c
n,m=map(int,input().split())
a=list(map(int,input().split()))
for i in range(len(a)):
    insert(i+1,i+1,a[i])
while m:
    l,r,c=map(int,input().split())
    insert(l,r,c)
    m-=1
for i in range(1,n+1):
    s[i]=s[i-1]+b[i]
    print(s[i],end=" ")

差分矩阵 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N][N];
int b[N][N];
int s[N][N];
void insert(int l1,int r1,int l2,int r2,int c){
    b[l1][r1]+=c;
    b[l1][r2+1]-=c;
    b[l2+1][r1]-=c;
    b[l2+1][r2+1]+=c;
}
int main(){
    int n,m,q;scanf("%d%d%d",&n,&m,&q);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            insert(i,j,i,j,a[i][j]);
        }
    while(q--){
        int l1,r1,l2,r2,c;scanf("%d%d%d%d%d",&l1,&r1,&l2,&r2,&c);
        insert(l1,r1,l2,r2,c);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            s[i][j]=b[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<s[i][j]<<" ";
        }
        cout<<"\n";
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[][] a,b,s;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt(),q=sc.nextInt();
        a=new int[n+100][n+100];
        b=new int[n+100][n+100];
        s=new int[n+100][n+100];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                a[i][j]=sc.nextInt();
                insert(i,j,i,j,a[i][j]);
            }
        while(q-->0){
            int l1=sc.nextInt(),r1=sc.nextInt(),l2=sc.nextInt(),r2=sc.nextInt(),c=sc.nextInt();
            insert(l1,r1,l2,r2,c);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                s[i][j]=b[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
                System.out.print(s[i][j]+" ");
            }
            System.out.println();
        }
    }
    public static void insert(int l1,int r1,int l2,int r2,int c){
        b[l1][r1]+=c;
        b[l2+1][r1]-=c;
        b[l1][r2+1]-=c;
        b[l2+1][r2+1]+=c;
    }
}

python

b=[[0]*1010 for i in range(1010)]
s=[[0]*1010 for i in range(1010)]
def insert(l1,r1,l2,r2,c):
    b[l1][r1]+=c
    b[l2+1][r1]-=c
    b[l1][r2+1]-=c
    b[l2+1][r2+1]+=c
n,m,q=map(int,input().split())
for i in range(n):
    a=list(map(int,input().split()))
    for j in range(len(a)):
        insert(i+1,j+1,i+1,j+1,a[j])
while q:
    l1,r1,l2,r2,c=map(int,input().split())
    insert(l1,r1,l2,r2,c);
    q-=1
for i in range(1,n+1):
    for j in range(1,m+1):
        s[i][j]=b[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1];
        print(s[i][j],end=" ")
    print()

最长连续不重复子序列 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],cnt[N];
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    int j=0,res=0;
    for(int i=0;i<n;i++){
        cnt[a[i]]++;
        while(j<i and cnt[a[i]]>1)cnt[a[j++]]--;
        res=max(res,i-j+1);
    }
    cout<<res<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        final int N=100010;
        int[] a=new int[N];
        int[] cnt=new int[N];
        int j=0,res=0;
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        for(int i=0;i<n;i++){
            cnt[a[i]]++;
            while(j<i&&cnt[a[i]]>1)cnt[a[j++]]--;
            res=Math.max(res,i-j+1);
        }
        System.out.println(res);
    }
}

python

cnt=[0 for i in range(100010)]
n=int(input())
a=list(map(int,input().split()))
res,j=0,0
for i in range(n):
    cnt[a[i]]+=1
    while j<i and cnt[a[i]]>1:
        cnt[a[j]]-=1
        j+=1
    res=max(res,i-j+1)
print(res)

数组元素的目标和 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],b[N];
int main(){
    int n,m,x;scanf("%d%d%d",&n,&m,&x);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<m;i++)scanf("%d",&b[i]);
    for(int i=0,j=m-1;i<n;i++){
        while(j>=0 and a[i]+b[j]>x)j--;
        if(a[i]+b[j]==x)printf("%d %d\n",i,j);
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt(),x=sc.nextInt();
        int[] a=new int[n];
        int[] b=new int[m];
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        for(int i=0;i<m;i++)b[i]=sc.nextInt();
        int j=m-1;
        for(int i=0;i<n;i++){
            while(j>=0&&a[i]+b[j]>x)j--;
            if(j>=0&&a[i]+b[j]==x)System.out.println(i+" "+j);
        }
    }
}

python

n,m,x=map(int,input().split())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
j=m-1
for i in range(n):
    while j>=0 and a[i]+b[j]>x:
       j-=1
    if j>=0 and a[i]+b[j]==x:
        print(i,j)

判断子序列 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],b[N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<m;i++)scanf("%d",&b[i]);
    int i=0,j=0;
    while(i<n and j<m){
        if(a[i]==b[j])i++;
        j++;
    }
    puts(i==n?"Yes":"No");
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        int[] a=new int[n];
        int[] b=new int[m];
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        for(int i=0;i<m;i++)b[i]=sc.nextInt();
        int i=0,j=0;
        while(i<n && j<m){
            if(a[i]==b[j])i++;
            j++;
        }
        System.out.println(i==n?"Yes":"No");
    }
}

python

n,m=map(int,input().split())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
i,j=0,0
while i<n and j<m:
    if a[i]==b[j]:
        i+=1
    j+=1
if i==n:
    print("Yes")
else:
    print("No")

二进制中1的个数 

C++

#include<bits/stdc++.h>
using namespace std;
void lowbit(int x){
    int cnt=0;
    for(int i=x;i;i-=i&-i)cnt++;
    cout<<cnt<<" ";
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        lowbit(x);
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            lowbit(x);
        }    
    }
    public static void lowbit(int x){
        int cnt=0;
        for(int i=x;i>0;i-=i&-i)cnt++;
        System.out.print(cnt+" ");
    }
}

python

def lowbit(x):
    cnt=0
    while x>0:
        cnt+=1
        x-=x&-x
    print(cnt,end=" ")
n=int(input())
a=list(map(int,input().split()))
for x in a:
    lowbit(x)

区间和 

C++

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
const int N=300010;
int a[N],s[N];
vector<int>alls;
vector<PII>query,add;
int find(int x){
    int l=0,r=alls.size()-1;
    while(l<r){
        int mid=(l+r)>>1;
        if(alls[mid]>=x)r=mid;
        else l=mid+1;
    }
    return l+1;
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        int x,c;scanf("%d%d",&x,&c);
        add.push_back({x,c});
        alls.push_back(x);
    }
    for(int i=0;i<m;i++){
        int l,r;scanf("%d%d",&l,&r);
        query.push_back({l,r});
        alls.push_back(l);
        alls.push_back(r);
    }
    sort(alls.begin(),alls.end());
    alls.erase(unique(alls.begin(),alls.end()),alls.end());
    for(auto [x,y]:add){
        x=find(x);
        a[x]+=y;
    }
    for(int i=1;i<=alls.size();i++)s[i]=s[i-1]+a[i];
    for(auto [l,r]:query){
        l=find(l),r=find(r);
        cout<<s[r]-s[l-1]<<'\n';
    }
    return 0;
}

java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        int N=300010;
        int[] a=new int[N];
        int[] s=new int[N];
        List<Integer>alls=new ArrayList<>();
        List<Pair>add=new ArrayList<>();
        List<Pair>query=new ArrayList<>();
        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            int c=sc.nextInt();
            alls.add(x);
            add.add(new Pair(x,c));
        }
        for(int i=0;i<m;i++){
            int l=sc.nextInt();
            int r=sc.nextInt();
            alls.add(l);
            alls.add(r);
            query.add(new Pair(l,r));
        }
        Collections.sort(alls);
        int unique=unique(alls);
        alls=alls.subList(0,unique);
        for(Pair item:add){
            int x=find(item.x,alls);
            a[x]+=item.y;
        }
        for(int i=1;i<=alls.size();i++)s[i]=s[i-1]+a[i];
        for(Pair item:query){
            int l=find(item.x,alls),r=find(item.y,alls);
            System.out.println(s[r]-s[l-1]);
        }
    }
    public static int unique(List<Integer>list){
        int j=0;
        for(int i=0;i<list.size();i++){
            if(i==0||list.get(i)!=list.get(i-1)){
                list.set(j,list.get(i));
                j++;
            }
        }
        return j;
    }
    public static int find(int x,List<Integer>list){
        int l=0,r=list.size()-1;
        while(l<r){
            int mid=(l+r)>>1;
            if(list.get(mid)>=x)r=mid;
            else l=mid+1;
        }
        return l+1;
    } 
}
class Pair{
    int x,y;
    public Pair(int x,int y){
        this.x=x;
        this.y=y;
    }
}

python

N=300010
a=[0 for i in range(N)]
s=[0 for i in range(N)]
add=[]
query=[]
alls=[]
def unique(list):
    j=0
    for i in range(len(list)):
        if i==0 or list[i] is not list[i-1]:
            list[j]=list[i]
            j+=1
    return j
def find(x):
    l,r=0,len(alls)-1
    while l<r:
        mid=(l+r)>>1
        if alls[mid]>=x:
            r=mid
        else:
            l=mid+1
    return l+1
n,m=map(int,input().split())
for i in range(n):
    x,c=map(int,input().split())
    add.append([x,c])
    alls.append(x)
for i in range(m):
    l,r=map(int,input().split())
    query.append([l,r])
    alls.append(l)
    alls.append(r)
alls.sort()
unique=unique(alls)
alls=alls[0:unique]
for [x,y] in add:
    x=find(x)
    a[x]+=y
for i in range(1,len(alls)+1):
    s[i]=s[i-1]+a[i]
for [l,r] in query:
    l,r=find(l),find(r)
    print(s[r]-s[l-1])

区间合并 

C++

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
void merge(vector<PII>&segs){
    vector<PII>res;
    sort(segs.begin(),segs.end());
    int st=-2e9,ed=-2e9;
    for(auto [l,r]:segs){
        if(ed<l){
            if(st!=-2e9)res.push_back({st,ed});
            st=l,ed=r;
        }
        else{
            ed=max(ed,r);
        }
    }
    if(st!=-2e9){
        res.push_back({st,ed});
    }
    segs=res;
}
int main(){
    int n;scanf("%d",&n);
    vector<PII>segs;
    for(int i=0;i<n;i++){
        int l,r;scanf("%d%d",&l,&r);
        segs.push_back({l,r});
    }
    merge(segs);
    cout<<segs.size()<<'\n';
    return 0;
}

java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        List<Pair>segs=new ArrayList<>();
        while(n-->0){
            int l=sc.nextInt(),r=sc.nextInt();
            segs.add(new Pair(l,r));
        }
        Collections.sort(segs);
        merge(segs);
    }
    public static void merge(List<Pair>segs){
        List<Pair>res=new ArrayList<>();

        int st=(int)-2e9,ed=(int)-2e9;
        for(Pair seg:segs){
            int l=seg.l,r=seg.r;
            if(ed<l){
                if(st!=-2e9)res.add(new Pair(st,ed));
                st=l;
                ed=r;
            }
            else ed=Math.max(ed,r);
        }
        if(st!=-2e9)res.add(new Pair(st,ed));
        segs=res;
        System.out.println(segs.size());
    }
}
class Pair implements Comparable<Pair>{
    int l,r;
    public Pair(int l,int r){
        this.l=l;
        this.r=r;
    }
    public int compareTo(Pair t){
        return l-t.l;
    }
}

python

def merge(segs):
    res=[]
    segs.sort()
    st,ed=-2e9,-2e9
    for [l,r] in segs:
        if ed<l:
            if st!=-2e9:
                res.append([st,ed])
            st,ed=l,r
        else:
            ed=max(ed,r)
    segs=res
    if st!=-2e9:
        res.append([st,ed])
    print(len(segs))
n=int(input())
segs=[]
for i in range(n):
    l,r=map(int,input().split())
    segs.append([l,r])
merge(segs)

数据结构 

单链表

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int e[N],ne[N],idx,head=-1;
void add_to_head(int x){
    e[idx]=x,ne[idx]=head,head=idx++;
}
void add(int k,int x){
    e[idx]=x,ne[idx]=ne[k],ne[k]=idx++;
}
void remove(int k){
    ne[k]=ne[ne[k]];
}
int main(){
    int m;scanf("%d",&m);
    while(m--){
        string op;cin>>op;
        if(op=="H"){
            int x;scanf("%d",&x);
            add_to_head(x);
        }
        else if(op=="D"){
            int k;scanf("%d",&k);
            if(!k)head=ne[head];
            else remove(k-1);
        }
        else{
            int k,x;scanf("%d%d",&k,&x);
            add(k-1,x);
        }
    }
    for(int i=head;~i;i=ne[i])cout<<e[i]<<" ";
    cout<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=200010;
    public static int[] e;
    public static int[] ne;
    public static int head=-1,idx=0;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        e=new int[N];
        ne=new int[N];
        while(n-->0){
            String op=sc.next();
            if(op.equals("H")){
                int x=sc.nextInt();
                add_to_head(x);
            }
            else if(op.equals("D")){
                int k=sc.nextInt();
                if(k==0)head=ne[head];
                else remove(k-1);
            }
            else{
                int k=sc.nextInt(),x=sc.nextInt();
                add(k-1,x);
            }
        }
        for(int i=head;i!=-1;i=ne[i]){
            System.out.print(e[i]+" ");
        }
    }
    public static void add_to_head(int x){
        e[idx]=x;ne[idx]=head;head=idx++;
    }
    public static void add(int k,int x){
        e[idx]=x;ne[idx]=ne[k];ne[k]=idx++;
    }
    public static void remove(int k){
        ne[k]=ne[ne[k]];
    }
}

python

N=200010
e=[0 for i in range(N)]
ne=[0 for i in range(N)]
head,idx=-1,0
def add_to_head(x):
    global head,idx
    e[idx]=x
    ne[idx]=head
    head=idx
    idx+=1
def remove(k):
    ne[k]=ne[ne[k]]
def add(k,x):
    global head,idx
    e[idx]=x
    ne[idx]=ne[k]
    ne[k]=idx
    idx+=1
n=int(input())
for i in range(n):
    s=input().split()
    if s[0]=="H":
        x=int(s[1])
        add_to_head(x)
    elif s[0]=="D":
        k=int(s[1])
        if k is 0:
            head=ne[head]
        else:
            remove(k-1)
    else:
        k,x=int(s[1]),int(s[2])
        add(k-1,x)
i=head
while True:
    print(e[i],end=" ")
    i=ne[i]
    if i==-1:
        break

双链表 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int e[N],l[N],r[N],idx;
void insert(int k,int x){
    e[idx]=x;
    l[idx]=k,r[idx]=r[k];
    l[r[k]]=idx,r[k]=idx;
    idx++;
}
void remove(int k){
    l[r[k]]=l[k];
    r[l[k]]=r[k];
}
int main(){
    int n;scanf("%d",&n);
    r[0]=1,l[1]=0;
    idx=2;
    while(n--){
        string op;cin>>op;
        if(op=="L"){
            int x;scanf("%d",&x);
            insert(0,x);
        }
        else if(op=="R"){
            int x;scanf("%d",&x);
            insert(l[1],x);
        }
        else if(op=="IL"){
            int k,x;scanf("%d%d",&k,&x);
            insert(l[k+1],x);
        }
        else if(op=="IR"){
            int k,x;scanf("%d%d",&k,&x);
            insert(k+1,x);
        }
        else{
            int k;scanf("%d",&k);
            remove(k+1);
        }
    }
    for(int i=r[0];i!=1;i=r[i]){
        cout<<e[i]<<" ";
    }
    cout<<endl;
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=200010,idx=2;
    public static int[] l,r,e;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        l=new int[N];
        r=new int[N];
        e=new int[N];
        r[0]=1;
        l[1]=0;
        int n=sc.nextInt();
        while(n-->0){
            String op=sc.next();
            if(op.equals("L")){
                int x=sc.nextInt();
                add(0,x);
            }
            else if(op.equals("R")){
                int x=sc.nextInt();
                add(l[1],x);
            }
            else if(op.equals("IL")){
                int k=sc.nextInt(),x=sc.nextInt();
                add(l[k+1],x);
            }
            else if(op.equals("IR")){
                int k=sc.nextInt(),x=sc.nextInt();
                add(k+1,x);
            }
            else {
                int k=sc.nextInt();
                remove(k+1);
            }
        }
        for(int i=r[0];i!=1;i=r[i]){
            System.out.print(e[i]+" ");
        }
    }
    public static void add(int k,int x){
        e[idx]=x;
        l[idx]=k;
        r[idx]=r[k];
        l[r[k]]=idx;
        r[k]=idx;
        idx++;
    }
    public static void remove(int k){
        l[r[k]]=l[k];
        r[l[k]]=r[k];
    }
}

python

N=200010
l=[0]*N
r=[0]*N
e=[0]*N
n=int(input())
r[0]=1
l[1]=0
idx=2
def add(k,x):
    global idx
    e[idx]=x
    l[idx]=k
    r[idx]=r[k]
    l[r[k]]=idx
    r[k]=idx
    idx+=1
def remove(k):
    l[r[k]]=l[k]
    r[l[k]]=r[k]
for i in range(n):
    s=input().split()
    if s[0]=="L":
        x=int(s[1])
        add(0,x)
    elif s[0]=="R":
        x=int(s[1])
        add(l[1],x)
    elif s[0]=="IL":
        k,x=int(s[1]),int(s[2])
        add(l[k+1],x)
    elif s[0]=="IR":
        k,x=int(s[1]),int(s[2])
        add(k+1,x)
    else:
        k=int(s[1])
        remove(k+1)
i=r[0]
while True:
    print(e[i],end=" ")
    i=r[i]
    if i==1:
        break

模拟栈 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int stk[N],top=-1;
int main(){
    int n;scanf("%d",&n);
    while(n--){
        string s;cin>>s;
        if(s=="push"){
            int x;scanf("%d",&x);
            stk[++top]=x;
        }
        else if(s=="pop"){
            top--;
        }
        else if(s=="query"){
            cout<<stk[top]<<'\n';
        }
        else {
            puts(top==-1?"YES":"NO");
        }
    }
    return 0;
}

java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Stack<Integer>stk=new Stack<>();
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            String s=sc.next();
            if(s.equals("push")){
                int x=sc.nextInt();
                stk.push(x);
            }
            else if(s.equals("query")){
                System.out.println(stk.peek());
            }
            else if(s.equals("pop")){
                stk.pop();
            }
            else{
                System.out.println(stk.empty()?"YES":"NO");
            }
        }
    }
}

python

n=int(input())
stk=[]
for i in range(n):
    s=input().split()
    if s[0]=="push":
        stk.append(int(s[1]))
    elif s[0]=="pop":
        stk.pop()
    elif s[0]=="query":
        print(stk[len(stk)-1])
    else:
        if len(stk) is 0:
            print("YES")
        else:
            print("NO")

 表达式求值

C++

#include<bits/stdc++.h>
using namespace std;
stack<int>num;
stack<char>op;
bool isInt(char x){
    if(x>='0' and x<='9')return true;
    return false;
}
void eval(){
    auto b=num.top();num.pop();
    auto a=num.top();num.pop();
    auto c=op.top();op.pop();
    int x;
    if(c=='+')x=a+b;
    if(c=='-')x=a-b;
    if(c=='*')x=a*b;
    if(c=='/')x=a/b;
    num.push(x);
}
int main(){
    map<char,int>pr;
    pr.insert({'+',1});
    pr.insert({'-',1});
    pr.insert({'*',2});
    pr.insert({'/',2});
    string s;cin>>s;
    for(int i=0;i<s.size();i++){
        auto c=s[i];
        if(isInt(c)){
            int x=0,j=i;
            while(j<s.size() and isInt(s[j])){
                x=x*10+s[j]-'0';
                j++;
            }
            i=j-1;
            num.push(x);
        }
        else if(c=='(')op.push(c);
        else if(c==')'){
            while(op.top()!='(')eval();
            op.pop();
        }
        else {
            while(op.size() and op.top()!='(' and pr[op.top()]>=pr[c])eval();
            op.push(c);
        }
    }
    while(op.size())eval();
    cout<<num.top()<<'\n';
    return 0;
}

java

import java.util.*;
public class Main{
    public static Stack<Integer>num=new Stack<>();
    public static Stack<Character>op=new Stack<>();
    public static Map<Character,Integer>pr=new HashMap<>();
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        pr.put('+',1);
        pr.put('-',1);
        pr.put('*',2);
        pr.put('/',2);
        String s=sc.next();
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(isInt(c)){
                int x=0,j=i;
                while(j<s.length()&&isInt(s.charAt(j))){
                    x=x*10+s.charAt(j)-'0';
                    j++;
                }
                i=j-1;
                num.push(x);
            }
            else if(c=='(')op.push(c);
            else if(c==')'){
                while(op.peek()!='(')eval();
                op.pop();
            }
            else{
                while(op.size()>0&&op.peek()!='('&&pr.get(op.peek())>=pr.get(c))eval();
                op.push(c);
            }
        }
        while(op.size()>0)eval();
        System.out.println(num.peek());
    }
    public static void eval(){
        int b=num.pop();
        int a=num.pop();
        char c=op.pop();
        int x=0;
        if(c=='+')x=a+b;
        if(c=='-')x=a-b;
        if(c=='*')x=a*b;
        if(c=='/')x=a/b;
        num.push(x);
    }
    public static boolean isInt(char x){
        if(x>='0'&&x<='9')return true;
        return false;
    }
}

python

pr={'+':1,'-':1,'*':2,'/':2}
op=[]
num=[]
s=input()
def eval():
    b=num.pop()
    a=num.pop()
    c=op.pop()
    x=0
    if c=='+':
        x=a+b
    elif c=='-':
        x=a-b
    elif c=='*':
        x=a*b
    else:
        x=int(a/b)
    num.append(x)
def isInt(x):
    if x>='0' and x<='9':
        return True
    return False
i=0
while i<len(s):
    if isInt(s[i]):
        x,j=0,i
        while j<len(s) and isInt(s[j]):
            x=x*10+int(s[j])
            j+=1
        num.append(x)
        i=j-1
    elif s[i]=='(':
        op.append(s[i])
    elif s[i]==')':
        while op[-1]!='(':
            eval()
        op.pop()
    else:
        while len(op)>0 and op[-1]!='(' and pr[op[-1]]>=pr[s[i]]:
            eval()
        op.append(s[i])
    i+=1
while len(op)>0:
    eval()
print(num[-1])

模拟队列 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int q[N],hh,tt=-1;
int main(){
    int n;scanf("%d",&n);
    while(n--){
        string op;cin>>op;
        if(op=="push"){
            int x;scanf("%d",&x);
            q[++tt]=x;
        }
        else if(op=="pop"){
            hh++;
        }
        else if(op=="query"){
            printf("%d\n",q[hh]);
        }
        else {
            puts(hh<=tt?"NO":"YES");
        }
    }
    return 0;
}

java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        Queue<Integer>q=new LinkedList<>();
        int n=sc.nextInt();
        while(n-->0){
            String op=sc.next();
            if(op.equals("push")){
                int x=sc.nextInt();
                q.add(x);
            }
            else if(op.equals("pop")){
                q.remove();
            }
            else if(op.equals("query")){
                System.out.println(q.peek());
            }
            else {
                System.out.println(q.isEmpty()?"YES":"NO");
            }
        }
    }
}

python

n=int(input())
q=[]
for i in range(n):
    s=input().split()
    if s[0]=="push":
        q.append(int(s[1]))
    elif s[0]=="pop":
        q.pop(0)
    elif s[0]=="query":
        print(q[0])
    else:
        if len(q):
            print("NO")
        else:
            print("YES")

单调栈 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int stk[N],top=-1;
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        while(top!=-1 and stk[top]>=x)top--;
        if(top==-1)cout<<-1<<" ";
        else cout<<stk[top]<<" ";
        stk[++top]=x;
    }
    return 0;
}

java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        Stack<Integer>stk=new Stack<>();
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            while(!stk.empty()&&stk.peek()>=x)stk.pop();
            if(stk.empty())System.out.print("-1 ");
            else System.out.print(stk.peek()+" ");
            stk.push(x);
        }
    }
}

python

n=int(input())
stk=[]
s=list(map(int,input().split()))
for x in s:
    while len(stk) and stk[-1]>=x:
        stk.pop()
    if len(stk)==0:
        print("-1",end=" ")
    else:
        print("%d"%(stk[-1]),end=" ")
    stk.append(x)

滑动窗口 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int a[N],q[N];
int main(){
    int n,k;scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    int hh=0,tt=-1;
    for(int i=0;i<n;i++){
        if(hh<=tt and q[hh]<i-k+1)hh++;
        while(hh<=tt and a[q[tt]]>=a[i])tt--;
        q[++tt]=i;
        if(i>=k-1)printf("%d ",a[q[hh]]);
    }
    cout<<'\n';
    hh=0,tt=-1;
    for(int i=0;i<n;i++){
        if(hh<=tt and q[hh]<i-k+1)hh++;
        while(hh<=tt and a[q[tt]]<=a[i])tt--;
        q[++tt]=i;
        if(i>=k-1)printf("%d ",a[q[hh]]);
    }
    return 0;
}

java

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws Exception{
        Scanner sc=new Scanner(System.in);
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n=sc.nextInt(),k=sc.nextInt();
        int[] a=new int[n];
        int[] q=new int[n];
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        int hh=0,tt=-1;
        for(int i=0;i<n;i++){
            if(hh<=tt&&q[hh]<i-k+1)hh++;
            while(hh<=tt&&a[q[tt]]>=a[i])tt--;
            q[++tt]=i;
            if(i>=k-1)bw.write(a[q[hh]]+" ");
        }
        hh=0;
        tt=-1;
        bw.write("\n");
        for(int i=0;i<n;i++){
            if(hh<=tt&&q[hh]<i-k+1)hh++;
            while(hh<=tt&&a[q[tt]]<=a[i])tt--;
            q[++tt]=i;
            if(i>=k-1)bw.write(a[q[hh]]+" ");
        }
        bw.flush();
    }
}

python

n,k=map(int,input().split())
a=list(map(int,input().split()))
q=[]
for i in range(n):
    if len(q) and q[0]<i-k+1:
        q.pop(0)
    while len(q) and a[q[-1]]>=a[i]:
        q.pop()
    q.append(i)
    if i>=k-1:
        print(a[q[0]],end=" ")
q.clear()
print()
for i in range(n):
    if len(q) and q[0]<i-k+1:
        q.pop(0)
    while len(q) and a[q[-1]]<=a[i]:
        q.pop()
    q.append(i)
    if i>=k-1:
        print(a[q[0]],end=" ")

KMP字符串

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=1000010;
int ne[N];
char s[M],p[N];
int main(){
    int n,m;cin>>n>>p+1>>m>>s+1;
    for(int i=2,j=0;i<=n;i++){
        while(j and p[i]!=p[j+1])j=ne[j];
        if(p[i]==p[j+1])j++;
        ne[i]=j;
    }
    for(int i=1,j=0;i<=m;i++){
        while(j and s[i]!=p[j+1])j=ne[j];
        if(s[i]==p[j+1])j++;
        if(n==j){
            printf("%d ",i-n);
            j=ne[j];
        }
    }
    return 0;
}

java

import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args) throws Exception{
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        Integer n=Integer.parseInt(br.readLine());
        String p=" "+br.readLine();
        Integer m=Integer.parseInt(br.readLine());
        String s=" "+br.readLine();
        int[] ne=new int[n+1];
        int j=0;
        for(int i=2;i<=n;i++){
            while(j!=0&&p.charAt(i)!=p.charAt(j+1))j=ne[j];
            if(p.charAt(i)==p.charAt(j+1))j++;
            ne[i]=j;
        }
        j=0;
        for(int i=1;i<=m;i++){
            while(j!=0&&s.charAt(i)!=p.charAt(j+1))j=ne[j];
            if(s.charAt(i)==p.charAt(j+1))j++;
            if(j==n){
                bw.write(i-n+" ");
                j=ne[j];
            }
        }
        bw.flush();
    }
}

python

n=int(input())
p=" "+input()
m=int(input())
s=" "+input()
ne=[0]*(n+1)
j=0
for i in range(2,n+1):
    while j and p[i]!=p[j+1]:
        j=ne[j]
    if p[i]==p[j+1]:
        j+=1
    ne[i]=j
j=0
for i in range(1,m+1):
    while j and s[i]!=p[j+1]:
        j=ne[j]
    if s[i]==p[j+1]:
        j+=1
    if j==n:
        print(i-n,end=" ")
        j=ne[j]

Trie字符串统计 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int son[N][26],cnt[N],idx;
void insert(string str){
    int p=0;
    for(int i=0;i<str.size();i++){
        int u=str[i]-'a';
        if(!son[p][u])son[p][u]=++idx;
        p=son[p][u];
    }
    cnt[p]++;
}
int query(string str){
    int p=0;
    for(int i=0;i<str.size();i++){
        int u=str[i]-'a';
        if(!son[p][u])return 0;
        p=son[p][u];
    }
    return cnt[p];
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        string op,str;cin>>op>>str;
        if(op=="I"){
            insert(str);
        }
        else{
            cout<<query(str)<<'\n';
        }
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=100010,idx=0;
    public static int[][] son=new int[N][26];
    public static int[] cnt=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            String op=sc.next(),str=sc.next();
            if(op.equals("I")){
                insert(str);
            }
            else {
                System.out.println(query(str));
            }
        }
    }
    public static void insert(String str){
        int p=0;
        for(int i=0;i<str.length();i++){
            int u=str.charAt(i)-'a';
            if(son[p][u]==0)son[p][u]=++idx;
            p=son[p][u];
        }
        cnt[p]++;
    }
    public static int query(String str){
        int p=0;
        for(int i=0;i<str.length();i++){
            int u=str.charAt(i)-'a';
            if(son[p][u]==0)return 0;
            p=son[p][u];
        }
        return cnt[p];
    }
}

python

N=100010
son=[[0]*26 for i in range(N)]
cnt=[0]*N
idx=0
def insert(str):
    global idx
    p=0
    for x in str:
        u=ord(x)-ord('a')
        if not son[p][u]:
            idx+=1
            son[p][u]=idx
        p=son[p][u]
    cnt[p]+=1
def query(str):
    p=0
    for x in str:
        u=ord(x)-ord('a')
        if not son[p][u]:
            return 0
        p=son[p][u]
    return cnt[p]
n=int(input())
for i in range(n):
    s=input().split()
    if s[0]=="I":
        insert(s[1])
    else:
        print(query(s[1]))

最大异或对 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=3000010;
int son[M][2],a[N],idx;
void insert(int x){
    int p=0;
    for(int i=30;i>=0;i--){
        int u=(x>>i)&1;
        if(!son[p][u])son[p][u]=++idx;
        p=son[p][u];
    }
}
int query(int x){
    int p=0,res=0;
    for(int i=30;i>=0;i--){
        int u=(x>>i)&1;
        if(son[p][!u]){
            p=son[p][!u];
            res+=(1<<i);
        }
        else p=son[p][u];
    }
    return res;
}
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        insert(a[i]);
    }
    int res=0;
    for(int i=0;i<n;i++){
        res=max(res,query(a[i]));
    }
    cout<<res<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=100010,M=3000010,idx=0;
    public static int[][] son=new int[M][2];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] a=new int[n];
        for(int i=0;i<n;i++){
            a[i]=sc.nextInt();
            insert(a[i]);
        }
        int res=0;
        for(int i=0;i<n;i++)res=Math.max(res,query(a[i]));
        System.out.println(res);
    }
    public static void insert(int x){
        int p=0;
        for(int i=30;i>=0;i--){
            int u=(x>>i)&1;
            if(son[p][u]==0)son[p][u]=++idx;
            p=son[p][u];
        }
    }
    public static int query(int x){
        int p=0,res=0;
        for(int i=30;i>=0;i--){
            int u=(x>>i)&1;
            if(son[p][u==0?1:0]!=0){
                res+=1<<i;
                p=son[p][u==0?1:0];
            }
            else {
                p=son[p][u];
            }
        }
        return res;
    }
}

python

N,idx=3000010,0
son=[[0]*2 for i in range(N)]
n=int(input())
a=list(map(int,input().split()))
def insert(x):
    global idx
    p=0
    for i in range(30,-1,-1):
        u=(x>>i)&1
        if not son[p][u]:
            idx+=1
            son[p][u]=idx
        p=son[p][u]
def query(x):
    p,res=0,0
    for i in range(30,-1,-1):
        u=(x>>i)&1
        if son[p][not u]:
            res+=1<<i
            p=son[p][not u]
        else:
            p=son[p][u]
    return res
for x in a:
    insert(x)
res=0
for x in a:
    res=max(res,query(x))
print(res)

合并集合

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int p[N];
int find(int x){
    if(p[x]!=x)p[x]=find(p[x]);
    return p[x];
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)p[i]=i;
    while(m--){
        char op[2];
        int x,y;
        scanf("%s%d%d",op,&x,&y);
        if(*op=='M'){
            p[find(x)]=find(y);
        }
        else {
            puts(find(x)==find(y)?"Yes":"No");
        }
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] p;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        p=new int[n+1];
        for(int i=1;i<=n;i++)p[i]=i;
        while(m-->0){
            String op=sc.next();
            int x=sc.nextInt(),y=sc.nextInt();
            if(op.equals("M")){
                p[find(x)]=find(y);
            }
            else{
                System.out.println(find(x)==find(y)?"Yes":"No");
            }
        }
    }
    public static int find(int x){
        if(x!=p[x])p[x]=find(p[x]);
        return p[x];
    }
}

python

n,m=map(int,input().split())
p=list(range(n+1))
def find(x):
    if p[x]!=x:
        p[x]=find(p[x])
    return p[x]
for i in range(m):
    s=input().split()
    a,b=int(s[1]),int(s[2])
    if s[0]=="M":
        p[find(a)]=find(b)
    else:
        if find(a)==find(b):
            print("Yes")
        else:
            print("No")

python 能过最后数据版本

n,m=map(int,input().split())
p=list(range(n+1))
def find(x):
    while x!=p[x]:
        p[x]=p[p[x]]
        x=p[x]
    return p[x]
for i in range(m):
    s=input().split()
    a,b=int(s[1]),int(s[2])
    if s[0]=="M":
        p[find(a)]=find(b)
    else:
        if find(a)==find(b):
            print("Yes")
        else:
            print("No")

 连通块中点的数量

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int p[N],cnt[N];
int find(int x){
    if(p[x]!=x)p[x]=find(p[x]);
    return p[x];
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)p[i]=i,cnt[i]=1;
    while(m--){
        string op;cin>>op;
        if(op=="C"){
            int a,b;scanf("%d%d",&a,&b);
            a=find(a),b=find(b);
            if(a!=b){
                p[a]=b;
                cnt[b]+=cnt[a];
            }
        }
        else if(op=="Q1"){
            int a,b;scanf("%d%d",&a,&b);
            puts(find(a)==find(b)?"Yes":"No");
        }
        else{
            int x;scanf("%d",&x);
            cout<<cnt[find(x)]<<'\n';
        }
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] p,cnt;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        p=new int[n+1];
        cnt=new int[n+1];
        for(int i=1;i<=n;i++){
            p[i]=i;
            cnt[i]=1;
        }
        while(m-->0){
            String op=sc.next();
            if(op.equals("C")){
                int a=sc.nextInt(),b=sc.nextInt();
                a=find(a);
                b=find(b);
                if(a!=b){
                    p[a]=b;
                    cnt[b]+=cnt[a];
                }
            }
            else if(op.equals("Q1")){
                int a=sc.nextInt(),b=sc.nextInt();
                System.out.println(find(a)==find(b)?"Yes":"No");
            }
            else{
                int x=sc.nextInt();
                System.out.println(cnt[find(x)]);
            }
        }
    }
    public static int find(int x){
        if(p[x]!=x)p[x]=find(p[x]);
        return p[x];
    }
}

python

n,m=map(int,input().split())
p=list(range(n+1))
cnt=[1 for i in range(n+1)]
def find(x):
    if p[x]!=x:
        p[x]=find(p[x])
    return p[x]
for i in range(m):
    s=input().split()
    if s[0]=="C":
        a,b=find(int(s[1])),find(int(s[2]))
        if a!=b:
            p[a]=b
            cnt[b]+=cnt[a]
    elif s[0]=="Q1":
        a,b=find(int(s[1])),find(int(s[2]))
        if a==b:
            print("Yes")
        else:
            print("No")
    else:
        x=find(int(s[1]))
        print(cnt[x])

食物链

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int p[N],d[N];
int find(int x){
    if(p[x]!=x){
        int t=find(p[x]);
        d[x]+=d[p[x]];
        p[x]=t;
    }
    return p[x];
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)p[i]=i;
    int res=0;
    while(m--){
        int t,x,y;scanf("%d%d%d",&t,&x,&y);
        if(x>n or y>n){
            res++;
            continue;
        }
        if(t==1){
            int px=find(x),py=find(y);
            if(px==py and (d[x]-d[y])%3)res++;
            else if(px!=py){
                p[px]=py;
                d[px]=d[y]-d[x];
            }
        }
        if(t==2){
            int px=find(x),py=find(y);
            if(px==py and (d[x]-d[y]-1)%3)res++;
            else if(px!=py){
                p[px]=py;
                d[px]=d[y]-d[x]+1;
            }
        }
    }
    cout<<res<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] p,d;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        p=new int[n+2];
        d=new int[n+2];
        for(int i=1;i<=n;i++)p[i]=i;
        int res=0;
        while(m-->0){
            int t=sc.nextInt(),x=sc.nextInt(),y=sc.nextInt();
            if(x>n||y>n)res++;
            else{
                int px=find(x),py=find(y);
                if(t==1){
                    if(px==py&&(d[x]-d[y])%3!=0)res++;
                    else if(px!=py){
                        p[px]=py;
                        d[px]=d[y]-d[x];
                    }
                }
                else{
                    if(px==py&&(d[x]-d[y]-1)%3!=0)res++;
                    else if(px!=py){
                        p[px]=py;
                        d[px]=d[y]-d[x]+1;
                    }
                }
            }
        }
        System.out.println(res);
    }
    public static int find(int x){
        if(p[x]!=x){
            int t=find(p[x]);
            d[x]+=d[p[x]];
            p[x]=t;
        }
        return p[x];
    }
}

python

n,m=map(int,input().split())
p=list(range(n+1))
d=[0]*(n+1)
def find(x):
    if p[x]!=x:
        t=find(p[x])
        d[x]+=d[p[x]]
        p[x]=t
    return p[x]
res=0
for i in range(m):
    t,x,y=map(int,input().split())
    if x>n or y>n:
        res+=1
    else:
        px,py=find(x),find(y)
        if t==1:
            if px==py and (d[x]-d[y])%3:
                res+=1
            elif px!=py:
                p[px]=py
                d[px]=d[y]-d[x]
        else:
            if px==py and (d[x]-d[y]-1)%3:
                res+=1
            elif px!=py:
                p[px]=py
                d[px]=d[y]-d[x]+1
print(res)

堆排序 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int h[N],cnt;
void down(int u){
    int t=u;
    if(u*2<=cnt and h[u*2]<h[t])t=u*2;
    if(u*2+1<=cnt and h[u*2+1]<h[t])t=u*2+1;
    if(u!=t){
        swap(h[u],h[t]);
        down(t);
    }
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&h[i]);
    cnt=n;
    for(int i=n/2;i>0;i--)down(i);
    while(m--){
        printf("%d ",h[1]);
        h[1]=h[cnt--];
        down(1);
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] h;
    public static int cnt;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        h=new int[n+1];
        cnt=n;
        for(int i=1;i<=n;i++)h[i]=sc.nextInt();
        for(int i=n/2;i>0;i--)down(i);
        while(m-->0){
            System.out.print(h[1]+" ");
            h[1]=h[cnt--];
            down(1);
        }
    }
    public static void down(int u){
        int t=u;
        if(u*2<=cnt&&h[u*2]<h[t])t=u*2;
        if(u*2+1<=cnt&&h[u*2+1]<h[t])t=u*2+1;
        if(t!=u){
            int x=h[t];
            h[t]=h[u];
            h[u]=x;
            down(t);
        }
    }
}

python

n,m=map(int,input().split())
h=[0]+list(map(int,input().split()))
cnt=n
def down(u):
    t=u
    if u*2<=cnt and h[u*2]<h[t]:
        t=u*2
    if u*2+1<=cnt and h[u*2+1]<h[t]:
        t=u*2+1
    if t!=u:
        h[t],h[u]=h[u],h[t]
        down(t)
for i in range(n//2,0,-1):
    down(i)
for i in range(m):
    print(h[1],end=" ")
    h[1]=h[cnt]
    down(1)
    cnt-=1

模拟堆 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int h[N],ph[N],hp[N],cnt;
void heap_swap(int a,int b){
    swap(ph[hp[a]],ph[hp[b]]);
    swap(hp[a],hp[b]);
    swap(h[a],h[b]);
}

void up(int u){
    while(u/2 and h[u]<h[u/2]){
        heap_swap(u,u/2);
        u>>=1;
    }
}
void down(int u){
    int t=u;
    if(u*2<=cnt and h[u*2]<h[t])t=u*2;
    if(u*2+1<=cnt and h[u*2+1]<h[t])t=u*2+1;
    if(t!=u){
        heap_swap(u,t);
        down(t);
    }
}
int main(){
    int n,m=0;scanf("%d",&n);
    while(n--){
        string op;
        int k,x;
        cin>>op;
        if(op=="I"){
            scanf("%d",&x);
            cnt++;
            m++;
            ph[m]=cnt,hp[cnt]=m;
            h[cnt]=x;
            up(cnt);
        }
        else if(op=="PM"){
            cout<<h[1]<<'\n';
        }
        else if(op=="DM"){
            heap_swap(1,cnt);
            cnt--;
            down(1);
        }
        else if(op=="D"){
            scanf("%d",&k);
            k=ph[k];
            heap_swap(k,cnt);
            cnt--;
            up(k);
            down(k);
        }
        else{
            scanf("%d%d",&k,&x);
            k=ph[k];
            h[k]=x;
            up(k);
            down(k);
        }
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=100010,cnt,m;
    public static int[] h=new int[N],hp=new int[N],ph=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            String op=sc.next();
            if(op.equals("I")){
                int x=sc.nextInt();
                cnt++;
                m++;
                ph[m]=cnt;
                hp[cnt]=m;
                h[cnt]=x;
                up(cnt);
            }
            else if(op.equals("DM")){
                heap_swap(1,cnt);
                cnt--;
                down(1);
            }
            else if(op.equals("PM")){
                System.out.println(h[1]);
            }
            else if(op.equals("D")){
                int k=sc.nextInt();
                k=ph[k];
                heap_swap(k,cnt);
                cnt--;
                up(k);
                down(k);
            }
            else {
                int k=sc.nextInt(),x=sc.nextInt();
                k=ph[k];
                h[k]=x;
                down(k);
                up(k);
            }
        }
    }
    public static void swap(int h[],int a,int b){
        int t=h[a];
        h[a]=h[b];
        h[b]=t;
    }
    public static void heap_swap(int a,int b){
        swap(ph,hp[a],hp[b]);
        swap(hp,a,b);
        swap(h,a,b);
    }
    public static void down(int u){
        int t=u;
        if(u*2<=cnt&&h[u*2]<h[t])t=u*2;
        if(u*2+1<=cnt&&h[u*2+1]<=h[t])t=u*2+1;
        if(u!=t){
            heap_swap(u,t);
            down(t);
        }
    }
    public static void up(int u){
        while(u/2!=0&&h[u/2]>h[u]){
            heap_swap(u/2,u);
            u>>=1;
        }
    }
}

python

cnt,m,N=0,0,100010
ph,hp,h=[0]*N,[0]*N,[0]*N
n=int(input())
def heap_swap(a,b):
    ph[hp[a]],ph[hp[b]]=ph[hp[b]],ph[hp[a]]
    hp[a],hp[b]=hp[b],hp[a]
    h[a],h[b]=h[b],h[a]
def down(u):
    t=u
    if u*2<=cnt and h[u*2]<h[t]:
        t=u*2
    if u*2+1<=cnt and h[u*2+1]<h[t]:
        t=u*2+1
    if u!=t:
        heap_swap(u,t)
        down(t)
def up(u):
    while u//2 and h[u//2]>h[u]:
        heap_swap(u//2,u)
        u>>=1
for i in range(n):
    s=input().split()
    if s[0]=="I":
        x=int(s[1])
        cnt+=1
        m+=1
        ph[m],hp[cnt]=cnt,m
        h[cnt]=x
        up(cnt)
    elif s[0]=="PM":
        print(h[1])
    elif s[0]=="DM":
        heap_swap(cnt,1)
        cnt-=1
        down(1)
    elif s[0]=="D":
        k=int(s[1])
        k=ph[k]
        heap_swap(k,cnt)
        cnt-=1
        up(k)
        down(k)
    else:
        k,x=int(s[1]),int(s[2])
        k=ph[k]
        h[k]=x
        up(k)
        down(k)

模拟散列表 

开放寻址法
C++

#include<bits/stdc++.h>
using namespace std;
const int N=100003,null=0x3f3f3f3f;
int h[N];
int find(int x){
    int t=(x%N+N)%N;
    while(h[t]!=null and h[t]!=x){
        t++;
        if(t==N)t=0;
    }
    return t;
}
int main(){
    int n;scanf("%d",&n);
    memset(h,0x3f,sizeof h);
    while(n--){
        string op;
        int x;cin>>op>>x;
        if(op=="I"){
            h[find(x)]=x;
        }
        else{
            puts(h[find(x)]!=0x3f3f3f3f?"Yes":"No");
        }
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=100003,inf=0x3f3f3f3f;
    public static int[] h=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        for(int i=0;i<N;i++)h[i]=inf;
        int n=sc.nextInt();
        while(n-->0){
            String op=sc.next();
            int x=sc.nextInt();
            if(op.equals("I")){
                h[find(x)]=x;
            }
            else{
                System.out.println(h[find(x)]!=inf?"Yes":"No");
            }
        }
    }
    public static int find(int x){
        int t=(x%N+N)%N;
        while(h[t]!=inf&&h[t]!=x){
            t++;
            if(t==N)t=0;
        }
        return t;
    }
}

python

n=int(input())
N,inf=100003,0x3f3f3f3f
h=[inf for i in range(N)]
def find(x):
    t=(x%N+N)%N
    while h[t]!=inf and h[t]!=x:
        t+=1
        if t==N:
            t=0
    return t
for i in range(n):
    s=input().split()
    x=int(s[1])
    if s[0]=="I":
        h[find(x)]=x
    else:
        if h[find(x)]!=inf:
            print("Yes")
        else:
            print("No")

拉链法
C++

#include<bits/stdc++.h>
using namespace std;
const int N=100003;
int h[N],e[N],ne[N],idx;
void add(int x){
    int t=(x%N+N)%N;
    e[idx]=x,ne[idx]=h[t],h[t]=idx++;
}
bool find(int x){
    int t=(x%N+N)%N;
    for(int i=h[t];~i;i=ne[i])
        if(e[i]==x)
            return true;
    return false;
}
int main(){
    int n;scanf("%d",&n);
    memset(h,-1,sizeof h);
    while(n--){
        string op;
        int x;cin>>op>>x;
        if(op=="I"){
            add(x);
        }
        else{
            puts(find(x)?"Yes":"No");
        }
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=100003,idx;
    public static int[] e=new int[N],ne=new int[N],h=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=0;i<N;i++)h[i]=-1;
        while(n-->0){
            String op=sc.next();
            int x=sc.nextInt();
            if(op.equals("I")){
                add(x);
            }
            else{
                System.out.println(find(x)?"Yes":"No");
            }
        }
    }
    public static void add(int x){
        int t=(x%N+N)%N;
        e[idx]=x;
        ne[idx]=h[t];
        h[t]=idx++;
    }
    public static boolean find(int x){
        int t=(x%N+N)%N;
        for(int i=h[t];i!=-1;i=ne[i]){
            if(e[i]==x){
                return true;
            }
        }
        return false;
    }
}

python

idx,N=0,100003
e,ne,h=[0]*N,[0]*N,[-1]*N
def add(x):
    global idx
    t=(x%N+N)%N;
    e[idx]=x
    ne[idx]=h[t]
    h[t]=idx
    idx+=1
def find(x):
    t=(x%N+N)%N
    i=h[t]
    while i!=-1:
        if e[i]==x:
            return True
        i=ne[i]
    return False
n=int(input())
for i in range(n):
    s=input().split()
    x=int(s[1])
    if s[0]=="I":
        add(x)
    else:
        if find(x):
            print("Yes")
        else:
            print("No")

字符串哈希 

C++

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=100010,P=131;
ull h[N],p[N];
ull get(int l,int r){
    return h[r]-h[l-1]*p[r-l+1];
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    p[0]=1;
    string s;cin>>s;
    s=" "+s;
    for(int i=1;i<=n;i++){
        h[i]=h[i-1]*P+s[i];
        p[i]=p[i-1]*P;
    }
    while(m--){
        int l1,r1,l2,r2;scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        puts(get(l1,r1)==get(l2,r2)?"Yes":"No");
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=100010,P=131;
    public static long[] h=new long[N],p=new long[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        p[0]=1;
        String s=" "+sc.next();
        for(int i=1;i<=n;i++){
            h[i]=h[i-1]*P+s.charAt(i);
            p[i]=p[i-1]*P;
        }
        while(m-->0){
            int l1=sc.nextInt(),r1=sc.nextInt(),l2=sc.nextInt(),r2=sc.nextInt();
            System.out.println(get(l1,r1)==get(l2,r2)?"Yes":"No");
        }
    }
    public static long get(int l,int r){
        return h[r]-h[l-1]*p[r-l+1];
    }
}

python

N,P=100010,131
mod=1<<64
h,p=[0]*N,[0]*N
n,m=map(int,input().split())
s=" "+input()
p[0]=1
def get(l,r):
    return (h[r]-h[l-1]*p[r-l+1])%mod
for i in range(1,n+1):
    h[i]=(h[i-1]*P+ord(s[i]))%mod
    p[i]=p[i-1]*P%mod
for i in range(m):
    l=list(map(int,input().split()))
    if get(l[0],l[1])==get(l[2],l[3]):
        print("Yes")
    else:
        print("No")

搜索与图论 

排列数字

C++

#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n,path[N];
bool st[N];
void dfs(int u){
    if(u>n){
        for(int i=1;i<=n;i++)cout<<path[i]<<" ";
        cout<<'\n';
        return ;
    }
    for(int i=1;i<=n;i++){
        if(!st[i]){
            st[i]=true;
            path[u]=i;
            dfs(u+1);
            st[i]=false;
        }
    }
}
int main(){
    scanf("%d",&n);
    dfs(1);
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] path=new int[10];
    public static boolean[] st=new boolean[10];
    public static int n;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        dfs(0);
    }
    public static void dfs(int u){
        if(u==n){
            for(int i=0;i<n;i++)System.out.print(path[i]+" ");
            System.out.println();
            return;
        }
        for(int i=0;i<n;i++){
            if(!st[i]){
                st[i]=true;
                path[u]=i+1;
                dfs(u+1);
                st[i]=false;
            }
        }
    }
}

python

n=int(input())
path=[]
st=[False]*10
def dfs(u):
    if u==n:
        for x in path:
            print(x,end=" ")
        print()
        return 
    for i in range(n):
        if st[i] is False:
            st[i]=True
            path.append(i+1)
            dfs(u+1)
            path.pop()
            st[i]=False
dfs(0)

 n-皇后问题

C++

#include<bits/stdc++.h>
using namespace std;
int n;
const int N=1010;
bool row[N],col[N],dg[N],udg[N];
char g[N][N];
void dfs(int x,int y,int s){
    if(s>n)return ;
    if(y==n)y=0,x++;
    if(x==n){
        if(s==n){
            for(int i=0;i<n;i++)cout<<g[i]<<'\n';
            cout<<'\n';
        }
        return;
    }
    g[x][y]='.';
    dfs(x,y+1,s);
    if(!row[x] and !col[y] and !dg[x+y] and !udg[x-y+n]){
        row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;
        g[x][y]='Q';
        dfs(x,y+1,s+1);
        g[x][y]='.';
        row[x]=col[y]=dg[x+y]=udg[x-y+n]=false;
    }
}
int main(){
    scanf("%d",&n);
    dfs(0,0,0);
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static final int N=1010;
    public static boolean[] row=new boolean[N],col=new boolean[N],dg=new boolean[N],udg=new boolean[N];
    public static char[][] g=new char[N][N];
    public static int n;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        dfs(0,0,0);
    }    
    public static void dfs(int x,int y,int s){
        if(s>n)return ;
        if(y==n){
            y=0;
            x++;
        }
        if(x==n){
            if(s==n){
                for(int i=0;i<n;i++){
                    for(int j=0;j<n;j++)
                        System.out.print(g[i][j]);
                    System.out.println();
                }
                System.out.println();
            }
            return ;
        }
        g[x][y]='.';
        dfs(x,y+1,s);
        if(!row[x]&&!col[y]&&!dg[x+y]&&!udg[x-y+n]){
            row[x]=col[y]=dg[x+y]=udg[x-y+n]=true;
            g[x][y]='Q';
            dfs(x,y+1,s+1);
            g[x][y]='.';
            row[x]=col[y]=dg[x+y]=udg[x-y+n]=false;
        }
    }
}

python

N=1010
g=[['.']*N for i in range(N)]
row,col,dg,udg=[False]*N,[False]*N,[False]*N*2,[False]*N*2
n=int(input())
def dfs(x,y,s):
    if s>n:
        return 
    if y==n:
        x+=1
        y=0
    if x==n:
        if s==n:
            for i in range(n):
                for j in range(n):
                    print(g[i][j],end="")
                print()
            print()
        return 
    if row[x] is False and col[y] is False and dg[x+y] is False and udg[x-y+n] is False:
        row[x]=col[y]=dg[x+y]=udg[x-y+n]=True
        g[x][y]='Q'
        dfs(x,y+1,s+1)
        g[x][y]='.'
        row[x]=col[y]=dg[x+y]=udg[x-y+n]=False
    dfs(x,y+1,s)
dfs(0,0,0)

走迷宫 

C++

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
const int N=1010,inf=0x3f3f3f3f;
int n,m;
int g[N][N],dist[N][N];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
void bfs(int x,int y){
    queue<PII>q;
    memset(dist,0x3f,sizeof dist);
    q.push({x,y});
    dist[x][y]=0;
    while(q.size()){
        auto t=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int a=dx[i]+t.first,b=dy[i]+t.second;
            if(a<0 or a>=n or b<0 or b>=m)continue;
            if(g[a][b]==1)continue;
            if(dist[a][b]!=inf)continue;
            dist[a][b]=dist[t.first][t.second]+1;
            q.push({a,b});
        }
    }
    cout<<dist[n-1][m-1]<<'\n';
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf("%d",&g[i][j]);
        }
    }
    bfs(0,0);
    return 0;
}

java

import java.util.*;
public class Main{
    public static int n,m,N=1010;
    public static int[][] g=new int[N][N],d=new int[N][N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++){
                g[i][j]=sc.nextInt();
                d[i][j]=-1;
            }
        bfs(0,0);
    }
    public static void bfs(int x,int y){
        Queue<Pair>q=new LinkedList<>();
        q.add(new Pair(x,y));
        d[x][y]=0;
        int[] dx={-1,0,1,0},dy={0,1,0,-1};
        while(q.size()>0){
            Pair t=q.peek();
            q.remove();
            for(int i=0;i<4;i++){
                int a=dx[i]+t.x,b=dy[i]+t.y;
                if(a<0||a>=n||b<0||b>=m)continue;
                if(g[a][b]==1)continue;
                if(d[a][b]!=-1)continue;
                d[a][b]=d[t.x][t.y]+1;
                q.add(new Pair(a,b));
            }
        }
        System.out.println(d[n-1][m-1]);
    }
}
class Pair{
    int x,y;
    public Pair(int x,int y){
        this.x=x;
        this.y=y;
    }
}

python

n,m=map(int,input().split())
g=[]
d=[[-1]*1010 for i in range(1010)]
def bfs(x,y):
    q=[]
    q.append([x,y])
    d[x][y]=0
    dx,dy=[-1,0,1,0],[0,1,0,-1]
    while len(q):
        t=q[0]
        q.pop(0)
        for i in range(4):
            a,b=t[0]+dx[i],t[1]+dy[i]
            if a<0 or a>=n or b<0 or b>=m:
                continue
            if g[a][b]==1:
                continue
            if d[a][b]!=-1:
                continue
            d[a][b]=d[t[0]][t[1]]+1
            q.append([a,b])
    print(d[n-1][m-1])
for i in range(n):
    s=list(map(int,input().split()))
    g.append(s)
bfs(0,0)

八数码 

C++

#include<bits/stdc++.h>
using namespace std;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int bfs(string state){
    string end="12345678x";
    queue<string>q;
    unordered_map<string,int>d;
    q.push(state);
    d[state]=0;
    while(q.size()){
        string t=q.front();
        q.pop();
        if(t==end)return d[t];
        int dist=d[t];
        int k=0;
        for(int i=0;i<9;i++){
            if(t[i]=='x'){
                k=i;
                break;
            }
        }
        int x=k/3,y=k%3;
        for(int i=0;i<4;i++){
            int a=dx[i]+x,b=dy[i]+y;
            if(a<0 or a>2 or b<0 or b>2)continue;
            swap(t[a*3+b],t[k]);
            if(!d.count(t)){
                d[t]=dist+1;
                q.push(t);
            }
            swap(t[a*3+b],t[k]);
        }
    }
    return -1;
}
int main(){
    string s,state;
    for(int i=0;i<9;i++){
        cin>>s;
        state+=s;
    }
    cout<<bfs(state)<<'\n';
    return 0;
}

java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String state="";
        for(int i=0;i<9;i++){
            String op=sc.next();
            state+=op;
        }
        System.out.println(bfs(state));
    }
    public static int bfs(String state){
        Queue<String>q=new LinkedList<>();
        Map<String,Integer>d=new HashMap<>();
        q.add(state);
        d.put(state,0);
        String end="12345678x";
        int[] dx={-1,0,1,0},dy={0,1,0,-1};
        while(!q.isEmpty()){
            String t=q.remove();
            if(t.equals(end))return d.get(t);
            int dist=d.get(t);
            int k=0;
            for(int i=0;i<9;i++){
                if(t.charAt(i)=='x'){
                    k=i;
                    break;
                }
            }
            int x=k/3,y=k%3;
            for(int i=0;i<4;i++){
                int a=dx[i]+x,b=dy[i]+y;
                if(a<0||a>2||b<0||b>2)continue;
                char[] ss=t.toCharArray();
                swap(ss,a*3+b,k);
                t=new String(ss);
                if(d.get(t)==null){
                    d.put(t,dist+1);
                    q.add(t);
                }
                ss=t.toCharArray();
                swap(ss,a*3+b,k);
                t=new String(ss);
            }
        }
        return -1;
    }
    public static void swap(char[] ss,int a,int b){
        char t=ss[a];
        ss[a]=ss[b];
        ss[b]=t;
    }
}

python

from collections import deque
def bfs(state):
    q=deque()
    d=dict()
    dx,dy=[-1,0,1,0],[0,1,0,-1]
    d[state]=0
    q.append(state)
    end="12345678x"
    while len(q):
        t=q.popleft()
        if t==end:
            return d[t]
        dist=d[t]
        k=0
        for i in range(9):
            if t[i]=='x':
                k=i
                break
        x,y=k//3,k%3
        for i in range(4):
            a,b=x+dx[i],y+dy[i]
            if a<0 or a>2 or b<0 or b>2:
                continue
            u=list(t)
            u[a*3+b],u[k]=u[k],u[a*3+b]
            t="".join(u)
            if t not in d:
                d[t]=dist+1
                q.append(t)
            u=list(t)
            u[a*3+b],u[k]=u[k],u[a*3+b]
            t="".join(u)
    return -1
state=""
s=input().split()
for x in s:
    state+=x
print(bfs(state))

树的重心

C++

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int idx,e[2*N],ne[2*N],h[N];
int n;
int sign[N];
int ans=N;
int add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u)
{
    if(sign[u]==1)return 0;
    sign[u]=1;
    int sum=1,res=0;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int t=dfs(e[i]);
        sum+=t;
        res=max(res,t);
    }
    res=max(n-sum,res);
    ans=min(ans,res);
    return sum;
}
int main()
{
    memset(h,-1,sizeof h);
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        int a,b;cin>>a>>b;
        add(a,b);add(b,a);
    }
    dfs(1);
    cout<<ans;
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int n,N=200010,idx,res=200010;
    public static int[] e=new int[N],ne=new int[N],h=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        for(int i=0;i<N;i++)h[i]=-1;
        for(int i=1;i<n;i++){
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b);
            add(b,a);
        }
        dfs(1);
        System.out.println(res);
    }
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static int dfs(int u){
        st[u]=true;
        int size=0,sum=0;
        for(int i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(st[j])continue;
            int s=dfs(j);
            sum+=s;
            size=Math.max(size,s);
        }
        size=Math.max(size,n-sum-1);
        res=Math.min(res,size);
        return sum+1;
    }
}

python

N=200010
e,ne,h,st=[0]*N,[0]*N,[-1]*N,[False]*N
res,idx=N,0
n=int(input())
def add(a,b):
    global idx
    e[idx] = b
    ne[idx] = h[a]
    h[a] = idx
    idx += 1
def dfs(u):
    global res
    st[u]=True
    size,sum=0,0
    i=h[u]
    while i!=-1:
        j=e[i]
        i=ne[i]
        if st[j]:
            continue
        s=dfs(j)
        size=max(size,s)
        sum+=s
    size=max(size,n-sum-1)
    res=min(size,res)
    return sum+1
for i in range(1,n):
    a,b=map(int,input().split())
    add(a,b)
    add(b,a)
dfs(1)
print(res)

图中点的层次 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int h[N],e[N],ne[N],idx;
int dist[N];
int n,m;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void bfs(int u){
    queue<int>q;
    memset(dist,0x3f,sizeof dist);
    dist[u]=0;
    q.push(u);
    while(q.size()){
        int t=q.front();
        q.pop();
        for(int i=h[t];~i;i=ne[i]){
            int j=e[i];
            if(dist[j]>dist[t]+1){
                dist[j]=dist[t]+1;
                q.push(j);
            }
        }
    }
    if(dist[n]==0x3f3f3f3f)cout<<-1<<'\n';
    else cout<<dist[n]<<'\n';
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--){
        int a,b;scanf("%d%d",&a,&b);
        add(a,b);
    }
    bfs(1);
    return 0;
}

java

import java.util.*;
public class Main{
    public static int idx,n,m,N=200010;
    public static int[] h=new int[N],e=new int[N],ne=new int[N],dist=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        for(int i=0;i<N;i++){
            h[i]=-1;
            dist[i]=Integer.MAX_VALUE;
        }
        n=sc.nextInt();
        m=sc.nextInt();
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b);
        }
        bfs(1);
    }
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static void bfs(int u){
        Queue<Integer>q=new LinkedList<>();
        q.add(u);
        dist[u]=0;
        while(q.size()>0){
            int t=q.remove();
            for(int i=h[t];i!=-1;i=ne[i]){
                int j=e[i];
                if(dist[j]>dist[t]+1){
                    dist[j]=dist[t]+1;
                    q.add(j);
                }
            }
        }
        System.out.println(dist[n]!=Integer.MAX_VALUE?dist[n]:-1);
    }
}

python

idx,N=0,100010
h,e,ne,dist=[-1]*N,[0]*N,[0]*N,[0x3f3f3f3f]*N
n,m=map(int,input().split())
def add(a,b):
    global idx
    e[idx]=b
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def bfs(u):
    q=[]
    q.append(u)
    dist[u]=0
    while len(q):
        t=q[0]
        q.pop(0)
        i=h[t]
        while i!=-1:
            j=e[i]
            if dist[j]>dist[t]+1:
                dist[j]=dist[t]+1
                q.append(j)
            i=ne[i]
    if dist[n]==0x3f3f3f3f:
        print(-1)
    else:
        print(dist[n])
for i in range(m):
    a,b=map(int,input().split())
    add(a,b)
bfs(1)

有向图的拓扑序列

C++

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int h[N],e[N],ne[N],d[N],idx;
int n,m;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void topsort(){
    queue<int>q;
    for(int i=1;i<=n;i++){
        if(!d[i]){
            q.push(i);
        }
    }
    vector<int>v;
    while(q.size()){
        int t=q.front();
        q.pop();
        v.push_back(t);
        for(int i=h[t];~i;i=ne[i]){
            int j=e[i];
            d[j]--;
            if(d[j]==0){
                q.push(j);
            }
        }
    }
    if(v.size()!=n)cout<<"-1"<<'\n';
    else {
        for(auto x:v)cout<<x<<" ";
    }
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--){
        int a,b;scanf("%d%d",&a,&b);
        add(a,b);
        d[b]++;
    }
    topsort();
    return 0;
}

java

import java.util.*;
public class Main{
    public static int N=200010,idx,n,m;
    public static int[] e=new int[N],ne=new int[N],h=new int[N],d=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++){
            h[i]=-1;
        }
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b);
            d[b]++;
        }
        topsort();
    }
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static void topsort(){
        Queue<Integer>q=new LinkedList<>();
        for(int i=1;i<=n;i++){
            if(d[i]==0)q.add(i);
        }
        ArrayList<Integer>a=new ArrayList<>();
        while(q.size()>0){
            int t=q.remove();
            a.add(t);
            for(int i=h[t];i!=-1;i=ne[i]){
                int j=e[i];
                d[j]--;
                if(d[j]==0){
                    q.add(j);
                }
            }
        }
        if (a.size()!=n)System.out.println(-1);
        else{
            for(int it:a){
                System.out.print(it+" ");
            }
        }
    }
}

python

idx,N=0,200010
e,ne,h,d=[0]*N,[0]*N,[-1]*N,[0]*N
n,m=map(int,input().split())
def add(a,b):
    global idx
    e[idx]=b
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def topsort():
    l,q=[],[]
    for i in range(1,n+1):
        if d[i]==0:
            q.append(i)

    while len(q):
        t=q[0]
        l.append(t)
        q.pop(0)
        i=h[t]
        while i!=-1:
            j=e[i]
            d[j]-=1
            if d[j]==0:
                q.append(j)
            i=ne[i]
    if len(l)!=n:
        print(-1)
    else:
        for x in l:
            print(x,end=" ")
for i in range(m):
    a,b=map(int,input().split())
    add(a,b)
    d[b]+=1
topsort()

Dijkstra求最短路 I 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=2010;
int dist[N],g[N][N];
int n,m;
bool st[N];
void dijkstra(){
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    for(int i=0;i<n;i++){
        int t=-1;
        for(int j=1;j<=n;j++){
            if(!st[j] and (t==-1 or dist[t]>dist[j])){
                t=j;
            }
        }
        st[t]=true;
        for(int j=1;j<=n;j++)dist[j]=min(dist[j],dist[t]+g[t][j]);
    }
    if(dist[n]==0x3f3f3f3f)cout<<-1<<'\n';
    else cout<<dist[n]<<'\n';
}
int main(){
    scanf("%d%d",&n,&m);
    memset(g,0x3f,sizeof g);
    while(m--){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        g[a][b]=min(g[a][b],c);
    }
    dijkstra();
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int n,m,N=1010;
    public static int[][] g=new int[N][N];
    public static int[] dist=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++){
            dist[i]=Integer.MAX_VALUE/2;
            for(int j=0;j<N;j++)
                g[i][j]=Integer.MAX_VALUE/2;
        }
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            g[a][b]=Math.min(g[a][b],c);
        }
        dijkstra();
    }
    public static void dijkstra(){
        dist[1]=0;
        for(int i=0;i<n;i++){
            int t=-1;
            for(int j=1;j<=n;j++)
                if(!st[j]&&(t==-1||dist[t]>dist[j]))
                    t=j;
            st[t]=true;
            for(int j=1;j<=n;j++)dist[j]=Math.min(dist[j],dist[t]+g[t][j]);
        }
        System.out.println(dist[n]==Integer.MAX_VALUE/2?-1:dist[n]);
    }
}

python

N,inf=1010,0x3f3f3f3f
g=[[inf]*N for i in range(N)]
st,dist=[False]*N,[inf]*N
n,m=map(int,input().split())
def dijkstra():
    dist[1]=0
    for i in range(n):
        t=-1
        for j in range(1,n+1):
            if not st[j] and (t==-1 or dist[t]>dist[j]):
                t=j
        st[t]=True
        for j in range(1,n+1):
            dist[j]=min(dist[j],dist[t]+g[t][j])
    if dist[n]==inf:
        print(-1)
    else:
        print(dist[n])
for i in range(m):
    a,b,c=map(int,input().split())
    g[a][b]=min(g[a][b],c)
dijkstra()

 Dijkstra求最短路 II 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int h[N],e[N],w[N],ne[N],idx;
int dist[N];
bool st[N];
typedef pair<int,int>PII;
int n,m;
void add(int a,int b,int c){
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dijkstra(){
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    priority_queue<PII,vector<PII>,greater<PII>>heap;
    heap.push({0,1});
    while(heap.size()){
        auto t=heap.top();
        heap.pop();
        int u=t.second;
        if(st[u])continue;
        st[u]=true;
        for(int i=h[u];~i;i=ne[i]){
            int j=e[i];
            if(dist[j]>dist[u]+w[i]){
                dist[j]=dist[u]+w[i];
                heap.push({dist[j],j});
            }
        }
    }
    if(dist[n]!=0x3f3f3f3f)cout<<dist[n]<<'\n';
    else cout<<-1<<'\n';
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    dijkstra();
    return 0;
}

java

import java.util.*;
public class Main{
    public static int n,m,N=200010,idx,inf=0x3f3f3f3f;
    public static int[] h=new int[N],e=new int[N],w=new int[N],ne=new int[N],dist=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++){
            h[i]=-1;
            dist[i]=inf;
        }
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            add(a,b,c);
        }
        dijkstra();
    }
    public static void add(int a,int b,int c){
        e[idx]=b;
        w[idx]=c;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static void dijkstra(){
        dist[1]=0;
        Queue<Pair>heap=new PriorityQueue<>();
        heap.add(new Pair(0,1));
        while(heap.size()>0){
            Pair t=heap.remove();
            int u=t.y; 
            if(st[u])continue;
            st[u]=true;
            for(int i=h[u];i!=-1;i=ne[i]){
                int j=e[i];
                if(dist[j]>dist[u]+w[i]){
                    dist[j]=dist[u]+w[i];
                    heap.add(new Pair(dist[j],j));
                }
            }
        }
        System.out.println(dist[n]==inf?-1:dist[n]);
    }
}
class Pair implements Comparable<Pair>{
    int x,y;
    public Pair(int x,int y){
        this.x=x;
        this.y=y;
    }
    public int compareTo(Pair t){
         return x-t.x;
    }
}

python

from heapq import *;
idx,N,inf=0,200010,0x3f3f3f3f
e,w,ne,h,dist,st=[0]*N,[0]*N,[0]*N,[-1]*N,[inf]*N,[False]*N
n,m=map(int,input().split())
def add(a,b,c):
    global idx
    e[idx]=b
    w[idx]=c
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def dijkstra():
    dist[1]=0
    heap=[]
    heappush(heap,(0,1))
    while len(heap):
        u=heappop(heap)[1]
        if st[u]:
            continue
        st[u]=True
        i=h[u]
        while i!=-1:
            j=e[i]
            if dist[j]>dist[u]+w[i]:
                dist[j]=dist[u]+w[i]
                heappush(heap,(dist[j],j))
            i=ne[i]
    if dist[n]==inf:
        print(-1)
    else:
        print(dist[n])
for i in range(m):
    a,b,c=map(int,input().split())
    add(a,b,c)
dijkstra()

有边数限制的最短路 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010,inf=0x3f3f3f3f;
int n,m,k;
int dist[N],last[N];
struct Edge{
    int a,b,c;
}edges[N];
void bellman_ford(){
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    for(int i=0;i<k;i++){
        memcpy(last,dist,sizeof dist);
        for(int j=0;j<m;j++){
            auto e=edges[j];
            dist[e.b]=min(dist[e.b],last[e.a]+e.c);
        }
    }
    if(dist[n]>inf/2)cout<<"impossible"<<'\n';
    else cout<<dist[n]<<'\n';
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<m;i++){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        edges[i]={a,b,c};
    }
    bellman_ford();
    return 0;
}

java

import java.util.*;
public class Main{
    public static int n,m,k,N=510,inf=0x3f3f3f3f;
    public static List<Edge>edges=new ArrayList<>();
    public static int[] dist=new int[N],last=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        k=sc.nextInt();
        for(int i=0;i<m;i++){
            int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            edges.add(new Edge(a,b,c));
        }
        bellman_ford();
    }
    public static void bellman_ford(){
        for(int i=0;i<N;i++){
            dist[i]=inf;
        }
        dist[1]=0;
        for(int i=0;i<k;i++){
            copy(last,dist);
            for(int j=0;j<m;j++){
                Edge e=edges.get(j);
                dist[e.b]=Math.min(dist[e.b],last[e.a]+e.c);
            }
        }
        System.out.println(dist[n]>inf/2?"impossible":dist[n]);
    }
    public static void copy(int[] last,int[] dist){
        for(int i=0;i<N;i++){
            last[i]=dist[i];
        }
    }

}
class Edge{
    int a,b,c;
    public Edge(int a,int b,int c){
        this.a=a;
        this.b=b;
        this.c=c;
    }
}

python

inf,N=0x3f3f3f3f,510
n,m,k=map(int,input().split())
last,dist,edges=[inf]*N,[inf]*N,[]
def bellman_ford():
    dist[1]=0
    for i in range(k):
        for j in range(N):
            last[j]=dist[j]
        for j in range(m):
            a,b,c=edges[j]
            dist[b]=min(dist[b],last[a]+c)

    if dist[n]>inf/2:
        print("impossible")
    else:
        print(dist[n])
for i in range(m):
    edges.append(list(map(int,input().split())))
bellman_ford()

spfa求最短路

C++

#include<bits/stdc++.h>
using namespace std;
const int N=200010,inf=0x3f3f3f3f;
int h[N],e[N],w[N],ne[N],idx;
int dist[N];
bool st[N];
int n,m;
void add(int a,int b,int c){
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void spfa(){
    memset(dist,0x3f,sizeof dist);
    queue<int>q;
    q.push(1);
    dist[1]=0;
    st[1]=true;
    while(q.size()){
        int t=q.front();
        q.pop();
        st[t]=false;
        for(int i=h[t];~i;i=ne[i]){
            int j=e[i];
            if(dist[j]>dist[t]+w[i]){
                dist[j]=dist[t]+w[i];
                if(!st[j]){
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    if(dist[n]>inf/2)cout<<"impossible"<<'\n';
    else cout<<dist[n]<<'\n';
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    spfa();
    return 0;
}

java

import java.util.*;
public class Main{
    public static int n,m,N=100010,inf=0x3f3f3f3f,idx;
    public static int[] e=new int[N],w=new int[N],ne=new int[N],h=new int[N],dist=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++){
            h[i]=-1;
            dist[i]=inf;
        }
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            add(a,b,c);
        }
        spfa();
    }
    public static void spfa(){
        dist[1]=0;
        Queue<Integer>q=new LinkedList<>();
        q.add(1);
        st[1]=true;
        while(q.size()>0){
            int t=q.remove();
            st[t]=false;
            for(int i=h[t];i!=-1;i=ne[i]){
                int j=e[i];
                if(dist[j]>dist[t]+w[i]){
                    dist[j]=dist[t]+w[i];
                    if(!st[j]){
                        st[j]=true;
                        q.add(j);
                    }
                }
            }
        }
        System.out.println(dist[n]>inf/2?"impossible":dist[n]);
    }
    public static void add(int a,int b,int c){
        e[idx]=b;
        w[idx]=c;
        ne[idx]=h[a];
        h[a]=idx++;
    }
}

python

idx,N,inf=0,100010,0x3f3f3f3f
n,m=map(int,input().split())
e,w,ne,h,dist,st=[0]*N,[0]*N,[0]*N,[-1]*N,[inf]*N,[False]*N
def add(a,b,c):
    global idx
    e[idx]=b
    w[idx]=c
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def spfa():
    q=[]
    q.append(1)
    dist[1]=0
    st[1]=True
    while len(q):
        t=q[0]
        q.pop(0)
        st[t]=False
        i=h[t]
        while i!=-1:
            j=e[i]
            if dist[j]>dist[t]+w[i]:
                dist[j]=dist[t]+w[i]
                if not st[j]:
                    q.append(j)
                    st[j]=True
            i=ne[i]
    if dist[n]>inf/2:
        print("impossible")
    else:
        print(dist[n])
for i in range(m):
    a,b,c=map(int,input().split())
    add(a,b,c)
spfa()

 spfa判断负环

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int h[N],e[N],w[N],ne[N],idx;
int dist[N],cnt[N];
bool st[N];
int n,m;
void add(int a,int b,int c){
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
bool spfa(){
    queue<int>q;
    for(int i=1;i<=n;i++){
        q.push(i);
        st[i]=true;
    }
    while(q.size()){
        int t=q.front();
        q.pop();
        st[t]=false;
        for(int i=h[t];~i;i=ne[i]){
            int j=e[i];
            if(dist[j]>dist[t]+w[i]){
                dist[j]=dist[t]+w[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n)return true;
                if(!st[j]){
                    q.push(j);
                    st[j]=true;
                }
            }
        }
    }
    return false;
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    puts(spfa()?"Yes":"No");
    return 0;
}

java

import java.util.*;
public class Main{
    public static int n,m,inf=0x3f3f3f3f,N=100010,idx;
    public static int[] h=new int[N],e=new int[N],w=new int[N],ne=new int[N],dist=new int[N],cnt=new int[N];
    public static boolean[] st=new boolean[N]; 
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++)h[i]=-1;
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            add(a,b,c);
        }
        System.out.println(spfa()?"Yes":"No");
    }
    public static void add(int a,int b,int c){
        e[idx]=b;
        w[idx]=c;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static boolean spfa(){
        Queue<Integer>q=new LinkedList<>();
        for(int i=1;i<=n;i++){
            q.add(i);
            st[i]=true;
        }
        while(q.size()>0){
            int t=q.remove();
            st[t]=false;
            for(int i=h[t];i!=-1;i=ne[i]){
                int j=e[i];
                if(dist[j]>dist[t]+w[i]){
                    dist[j]=dist[t]+w[i];
                    cnt[j]=cnt[t]+1;
                    if(cnt[j]>=n)return true;
                    if(!st[j]){
                        st[j]=true;
                        q.add(j);
                    }
                }
            }
        }
        return false;
    }
}

python

idx,N=0,100010
e,w,ne,h,st,dist,cnt=[0]*N,[0]*N,[0]*N,[-1]*N,[False]*N,[0]*N,[0]*N;
n,m=map(int,input().split())
def add(a,b,c):
    global idx
    e[idx]=b
    w[idx]=c
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def spfa():
    q=[]
    hh,tt=0,-1
    for i in range(1,n+1):
        tt+=1
        q.append(i)
        st[i]=True
    while hh<=tt:
        t=q[hh]
        hh+=1
        st[t]=False
        i=h[t]
        while i!=-1:
            j=e[i]
            if dist[j]>dist[t]+w[i]:
                dist[j]=dist[t]+w[i]
                cnt[j]=cnt[t]+1
                if cnt[j]>=n:
                    return True
                if not st[j]:
                    st[j]=True
                    tt+=1
                    q.append(j)
            i=ne[i]
    return False
for i in range(m):
    a,b,c=map(int,input().split())
    add(a,b,c)
if spfa():
    print("Yes")
else:
    print("No")

Floyd求最短路

C++

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int g[N][N];
int n,m,k;
void floyd(){
    for(int t=1;t<=n;t++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                g[i][j]=min(g[i][j],g[i][t]+g[t][j]);
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    memset(g,0x3f,sizeof g);
    for(int i=1;i<=n;i++)g[i][i]=0;
    while(m--){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        g[a][b]=min(g[a][b],c);
    }
    floyd();
    while(k--){
        int a,b;scanf("%d%d",&a,&b);
        if(g[a][b]>0x3f3f3f3f/2)cout<<"impossible"<<'\n';
        else cout<<g[a][b]<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int n,m,k,inf=0x3f3f3f3f;
    public static int[][] g=new int[1010][1010];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        k=sc.nextInt();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(i==j)g[i][j]=0;
                else g[i][j]=inf;
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            g[a][b]=Math.min(g[a][b],c);
        }
        floyd();
        while(k-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            System.out.println(g[a][b]>inf/2?"impossible":g[a][b]);
        }
    }
    public static void floyd(){
        for(int t=1;t<=n;t++)
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    g[i][j]=Math.min(g[i][j],g[i][t]+g[t][j]);
    }
}

python

g,inf=[[0]*1010 for i in range(1010)],0x3f3f3f3f
n,m,k=map(int,input().split())
def floyd():
    for t in range(1,n+1):
        for i in range(1,n+1):
            for j in range(1,n+1):
                g[i][j]=min(g[i][j],g[i][t]+g[t][j])
for i in range(n+1):
    for j in range(n+1):
        if i!=j:
            g[i][j]=inf
for i in range(m):
    a,b,c=map(int,input().split())
    g[a][b]=min(g[a][b],c)
floyd()
for i in range(k):
    a,b=map(int,input().split())
    if g[a][b]>inf/2:
        print("impossible")
    else:
        print(g[a][b])

Prim算法求最小生成树 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=510,inf=0x3f3f3f3f;
int n,m;
int g[N][N];
int dist[N];
bool st[N];
int prim(){
    memset(dist,0x3f,sizeof dist);
    int res=0;
    for(int i=0;i<n;i++){
        int t=-1;
        for(int j=1;j<=n;j++){
            if(!st[j] and (t==-1 or dist[t]>dist[j]))
                t=j;
        }
        if(i and dist[t]==inf)return inf;
        if(i)res+=dist[t];
        st[t]=true;
        for(int j=1;j<=n;j++){
            dist[j]=min(dist[j],g[t][j]);
        }
    }
    return res;
}
int main(){
    scanf("%d%d",&n,&m);
    memset(g,0x3f,sizeof g);
    while(m--){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        g[b][a]=g[a][b]=min(g[a][b],c);
    }
    int t=prim();
    if(t==inf)cout<<"impossible"<<'\n';
    else cout<<t<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=510,n,m,inf=0x3f3f3f3f;
    public static int[][] g=new int[N][N];
    public static int[] dist=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++)
            for(int j=0;j<N;j++)
                g[i][j]=inf;
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt(),c=sc.nextInt();
            g[b][a]=g[a][b]=Math.min(g[a][b],c);
        }
        int t=prim();
        System.out.println(t==inf?"impossible":t);
    }
    public static int prim(){
        int res=0;
        for(int i=0;i<N;i++)dist[i]=inf;
        for(int i=0;i<n;i++){
            int t=-1;
            for(int j=1;j<=n;j++){
                if(!st[j]&&(t==-1||dist[t]>dist[j])){
                    t=j;
                }
            }
            st[t]=true;
            if(i!=0&&dist[t]==inf)return inf;
            if(i!=0)res+=dist[t];
            for(int j=1;j<=n;j++)dist[j]=Math.min(dist[j],g[t][j]);
        }
        return res;
    }
}

python

inf,N=0x3f3f3f3f,510
g=[[inf]*N for i in range(N)]
dist,st=[inf]*N,[False]*N
def prim():
    res=0
    for i in range(n):
        t=-1
        for j in range(1,n+1):
            if not st[j] and (t==-1 or dist[t]>dist[j]):
                t=j
        if i!=0 and dist[t]==inf:
            return inf
        if i!=0:
            res+=dist[t]
        st[t]=True
        for j in range(1,n+1):
            dist[j]=min(dist[j],g[t][j])
    return res
n,m=map(int,input().split())
for i in range(m):
    a,b,c=map(int,input().split())
    g[b][a]=g[a][b]=min(g[a][b],c)
t=prim()
if t==inf:
    print("impossible")
else:
    print(t)

Kruskal算法求最小生成树

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=200010,inf=0x3f3f3f3f;
int n,m;
int p[N];
struct Edge{
    int a,b,w;
    bool operator<(const Edge &W)const{
        return w<W.w;
    }
}edges[M];
int find(int x){
    if(p[x]!=x)p[x]=find(p[x]);
    return p[x];
}
int kruskal(){
    sort(edges,edges+m);
    int res=0,cnt=0;
    for(int i=0;i<m;i++){
        int a=edges[i].a,b=edges[i].b,w=edges[i].w;
        a=find(a),b=find(b);
        if(a!=b){
            p[a]=b;
            res+=w;
            cnt++;
        }
    }
    if(cnt!=n-1)return inf;
    return res;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)p[i]=i;
    for(int i=0;i<m;i++){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        edges[i]={a,b,c};
    }
    int t=kruskal();
    if(t==inf)cout<<"impossible"<<'\n';
    else cout<<t<<'\n';
    return 0;
}

java

import java.util.*;
public class Main{
    public static int inf=0x3f3f3f3f,N=100010,M=200010,n,m;
    public static int[] p=new int[N];
    public static List<Edge>edges=new ArrayList<>();
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=1;i<=n;i++)p[i]=i;
        for(int i=0;i<m;i++){
            int a=sc.nextInt(),b=sc.nextInt(),w=sc.nextInt();
            edges.add(new Edge(a,b,w));
        }
        int t=kruskal();
        System.out.println(t==inf?"impossible":t);
    }
    public static int find(int x){
        if(p[x]!=x)p[x]=find(p[x]);
        return p[x];
    }
    public static int kruskal(){
        Collections.sort(edges);
        int res=0,cnt=0;
        for(int i=0;i<m;i++){
            Edge e=edges.get(i);
            int a=find(e.a),b=find(e.b),w=e.w;
            if(a!=b){
                p[a]=b;
                res+=w;
                cnt++;
            }
        }
        if(cnt!=n-1)return inf;
        return res;
    }

}
class Edge implements Comparable<Edge>{
    int a,b,w;
    public Edge(int a,int b,int w){
        this.a=a;
        this.b=b;
        this.w=w;
    }
    public int compareTo(Edge t){
        return w-t.w;
    }
}

python

inf,N=0x3f3f3f3f,100010
p,e=list(range(N)),[]
n,m=map(int,input().split())
def find(x):
    if p[x]!=x:
        p[x]=find(p[x])
    return p[x]
def kruskal():
    e.sort(key=lambda s:s[2])
    res,cnt=0,0
    for i in range(m):
        a,b,w=e[i]
        a,b=find(a),find(b)
        if a!=b:
            p[a]=b
            cnt+=1
            res+=w
    if cnt!=n-1:
        return inf
    return res
for i in range(m):
    e.append(list(map(int,input().split())))
t=kruskal()
if t==inf:
    print("impossible")
else:
    print(t)

 染色法判定二分图

C++

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int h[N],e[N],ne[N],idx;
int color[N];
int n,m;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool dfs(int u,int c){
    color[u]=c;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(!color[j]){
            if(!dfs(j,3-c))return false;
        }
        else if(color[j]==c)return false;
    }
    return true;
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    while(m--){
        int a,b;scanf("%d%d",&a,&b);
        add(a,b),add(b,a);
    }
    bool flag=true;
    for(int i=1;i<=n;i++){
        if(!color[i]){
            if(!dfs(i,1)){
                flag=false;
                break;
            }
        }
    }
    puts(flag?"Yes":"No");
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int n,m,N=200010,idx;
    public static int[] h=new int[N],e=new int[N],ne=new int[N],color=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++)h[i]=-1;
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b);
            add(b,a);
        }
        boolean flag=true;
        for(int i=1;i<=n;i++){
            if(color[i]==0){
                if(!dfs(i,1)){
                    flag=false;
                    break;
                }
            }
        }
        System.out.println(flag?"Yes":"No");
    }
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static boolean dfs(int u,int c){
        color[u]=c;
        for(int i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(color[j]==0){
                if(!dfs(j,3-c))return false;
            }
            else if(color[j]==c)return false;
        }
        return true;
    }
}

python(爆栈)

N,idx=200010,0
h,e,ne,color=[-1]*N,[0]*N,[0]*N,[0]*N
n,m=map(int,input().split())
def add(a,b):
    global idx
    e[idx]=b
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def dfs(u,c):
    color[u]=c
    i=h[u]
    while i!=-1:
        j=e[i]
        if not color[j]:
            if not dfs(j,3-c):
                return False
        elif color[j]==c:
            return False
        i=ne[i]
    return True
for i in range(m):
    a,b=map(int,input().split())
    add(a,b)
    add(b,a)
flag=True
for i in range(1,n+1):
    if not color[i]:
        if not dfs(i,1):
            flag=False
            break
if flag:
    print("Yes")
else:
    print("No")

python(用bfs过)

N,idx=200010,0
h,e,ne,color=[-1]*N,[0]*N,[0]*N,[0]*N
n,m=map(int,input().split())
def add(a,b):
    global idx
    e[idx]=b
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def bfs(u,c):
    q=[]
    hh,tt=0,-1
    q.append([u,c])
    tt+=1
    while hh<=tt:
        t,c=q[hh]
        hh+=1
        color[t]=c
        i=h[t]
        while i!=-1:
            j=e[i]
            if not color[j]:
                tt+=1
                q.append([j,3-c])
            elif color[j]==c:
                return False
            i=ne[i]
    return True
for i in range(m):
    a,b=map(int,input().split())
    add(a,b)
    add(b,a)
flag=True
for i in range(1,n+1):
    if not color[i]:
        if not bfs(i,1):
            flag=False
            break
if flag:
    print("Yes")
else:
    print("No")

二分图的最大匹配 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int h[N],e[N],ne[N],idx;
int match[N];
bool st[N];
int n1,n2,m;
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool find(int u){
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(st[j])continue;
        st[j]=true;
        if(!match[j] or find(match[j])){
            match[j]=u;
            return true;
        }
    }
    return false;
}
int main(){
    scanf("%d%d%d",&n1,&n2,&m);
    memset(h,-1,sizeof h);
    while(m--){
        int a,b;scanf("%d%d",&a,&b);
        add(a,b);
    }
    int res=0;
    for(int i=1;i<=n1;i++){
        memset(st,false,sizeof st);
        if(find(i))res++;
    }
    cout<<res<<"\n";
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int n1,n2,m,N=510,M=100010,idx;
    public static int[] h=new int[N],e=new int[M],ne=new int[M],match=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n1=sc.nextInt();
        n2=sc.nextInt();
        m=sc.nextInt();
        for(int i=0;i<N;i++)h[i]=-1;
        while(m-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            add(a,b);
        }
        int res=0;
        for(int i=1;i<=n1;i++){
            remake(st);
            if(find(i))res++;
        }
        System.out.println(res);
    }
    public static void remake(boolean[] st){
        for(int j=0;j<N;j++)st[j]=false;
    }
    public static void add(int a,int b){
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    public static boolean find(int u){
        for(int i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(st[j])continue;
            st[j]=true;
            if(match[j]==0||find(match[j])){
                match[j]=u;
                return true;
            }
        }
        return false;
    }
}

python

idx,N,M=0,510,100010
h,e,ne,match,st=[-1]*N,[0]*M,[0]*M,[0]*N,[False]*N
n1,n2,m=map(int,input().split())
def add(a,b):
    global idx
    e[idx]=b
    ne[idx]=h[a]
    h[a]=idx
    idx+=1
def remake():
    for i in range(N):
        st[i]=False
def find(u):
    i=h[u]
    while i!=-1:
        j=e[i]
        i=ne[i]
        if st[j]:
            continue
        st[j]=True
        if not match[j] or find(match[j]):
            match[j]=u
            return True
    return False
for i in range(m):
    a,b=map(int,input().split())
    add(a,b)
res=0
for i in range(1,n1+1):
    remake()
    if find(i):
        res+=1
print(res)

数学知识

试除法判定质数

C++

#include<bits/stdc++.h>
using namespace std;
bool isPrime(int x){
    if(x<2)return false;
    for(int i=2;i<=x/i;i++){
        if(x%i==0)return false;
    }
    return true;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        puts(isPrime(x)?"Yes":"No");
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            System.out.println(isPrime(x)?"Yes":"No");
        }
    }
    public static boolean isPrime(int x){
        if(x<2)return false;
        for(int i=2;i<=x/i;i++){
            if(x%i==0)return false;
        }
        return true;
    }
}

python

def isPrime(x):
    if x<2:
        return False
    for i in range(2,round(x**0.5)+1):
        if x%i==0:
            return False
    return True
n=int(input())
for i in range(n):
    x=int(input())
    if isPrime(x):
        print("Yes")
    else:
        print("No")

分解质因数 

C++

#include<bits/stdc++.h>
using namespace std;
void divide(int x){
    for(int i=2;i<=x/i;i++){
        if(x%i==0){
            int s=0;
            while(x%i==0){
                x/=i,s++;
            }
            cout<<i<<" "<<s<<"\n";
        }
    }
    if(x>1)cout<<x<<" "<<1<<'\n';
    cout<<'\n';
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        divide(x);
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            divide(x);
        }
    }
    public static void divide(int x){
        for(int i=2;i<=x/i;i++){
            if(x%i==0){
                int s=0;
                while(x%i==0){
                    s++;
                    x/=i;
                }
                System.out.println(i+" "+s);
            }
        }
        if(x>1)System.out.println(x+" "+1);
        System.out.println();
    }
}

python

n=int(input())
def divide(x):
    for i in range(2,int(x**0.5)+1):
        if x%i==0:
            s=0
            while x%i==0:
                x//=i
                s+=1
            print(i,s)
    if x>1:
        print(x,1)
    print()
for i in range(n):
    x=int(input())
    divide(x)

 筛质数

C++

#include<bits/stdc++.h>
using namespace std;
const int N=2000010;
int primes[N],cnt;
bool st[N];
void getPrimes(int n){
    for(int i=2;i<=n;i++){
        if(!st[i])primes[cnt++]=i;
        for(int j=0;primes[j]*i<=n;j++){
            st[primes[j]*i]=true;
            if(i%primes[j]==0)break;
        }
    }
}
int main(){
    int n;scanf("%d",&n);
    getPrimes(n);
    cout<<cnt<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int cnt,N=1000010;
    public static int[] primes=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        getPrimes(n);
        System.out.println(cnt);
    }
    public static void getPrimes(int n){
        for(int i=2;i<=n;i++){
            if(!st[i])primes[cnt++]=i;
            for(int j=0;primes[j]*i<=n;j++){
                st[primes[j]*i]=true;
                if(i%primes[j]==0)break;
            }
        }
    }
}

python

cnt,N=0,1000010
primes,st=[0]*N,[False]*N
def getPrimes(n):
    global cnt
    for i in range(2,n+1):
        if not st[i]:
            primes[cnt]=i
            cnt+=1
        j=0
        while primes[j]*i<=n:
            st[primes[j]*i]=True
            if i%primes[j]==0:
                break
            j+=1
n=int(input())
getPrimes(n)
print(cnt)

试除法求约数

C++

#include<bits/stdc++.h>
using namespace std;
void getDivisors(int n){
    vector<int>res;
    for(int i=1;i<=n/i;i++)
        if(n%i==0){
            res.push_back(i);
            if(n/i!=i)
                res.push_back(n/i);
        }        
    sort(res.begin(),res.end());
    for(int it:res)cout<<it<<' ';
    cout<<'\n';
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        getDivisors(x);
    }
    return 0;
}

java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            getDivisor(x);
        }
    }
    public static void getDivisor(int n){
        List<Integer>res=new ArrayList<>();
        for(int i=1;i<=n/i;i++){
            if(n%i==0){
                res.add(i);
                if(n/i!=i)res.add(n/i);
            }
        }
        Collections.sort(res);
        for(Integer it:res)System.out.print(it+" ");
        System.out.println();
    }
}

python

def getDivisor(n):
    res=[]
    for i in range(1,int(n**0.5)+1):
        if n%i==0:
            res.append(i)
            if n//i!=i:
                res.append(n//i)
    res.sort()
    for x in res:
        print(x,end=" ")
    print()
n=int(input())
for i in range(n):
    x=int(input())
    getDivisor(x)

约数个数 

C++

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int mod=1e9+7;
map<int,int>mp;
void echo(int n){
    for(int i=2;i<=n/i;i++){
        if(n%i==0){
            while(n%i==0){
                mp[i]++;
                n/=i;
            }
        }
    }
    if(n>1)mp[n]++;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        echo(x);
    }
    ll res=1;
    for(auto [x,y]:mp){
        res=res*(y+1)%mod;
    }
    cout<<res<<'\n';
    return 0;
}

java

import java.util.*;
public class Main{
    public static Map<Integer,Integer>mp=new HashMap<>();
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            echo(x);
        }
        long res=1,mod=(long)1e9+7;
        for(Integer value:mp.values()){
            res=res*(value+1)%mod;
        }
        System.out.println(res);
    }
    public static void echo(int x){
        for(int i=2;i<=x/i;i++){
            if(x%i==0){
                while(x%i==0){
                    mp.put(i,mp.getOrDefault(i,0)+1);
                    x/=i;
                }
            }
        }
        if(x>1)mp.put(x,mp.getOrDefault(x,0)+1);
    }
}

python

mp=dict()
def echo(x):
    for i in range(2,int(x**0.5)+1):
        while x%i==0:
            if i in mp:
                mp[i]+=1
            else:
                mp[i]=1
            x//=i
    if x>1:
        if x in mp:
            mp[x]+=1
        else:
            mp[x]=1
n=int(input())
for i in range(n):
    x=int(input())
    echo(x)
res,mod=1,int(1e9+7)
for y in mp.values():
    res=res*(y+1)%mod
print(res)

约数之和 

C++

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int mod=1e9+7;
map<int,int>mp;
void echo(int x){
    for(int i=2;i<=x/i;i++){
        while(x%i==0){
            mp[i]++;
            x/=i;
        }
    }
    if(x>1)mp[x]++;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        echo(x);
    }
    ll res=1;
    for(auto [x,y]:mp){
        ll p=1;
        for(int i=0;i<y;i++)p=(p*x+1)%mod;
        res=p*res%mod;
    }
    cout<<res<<'\n';
    return 0;
}

java

import java.util.*;
public class Main{
    public static int mod=(int)1e9+7;
    public static Map<Integer,Integer>mp=new HashMap<>();
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            echo(x);
        }
        long res=1;
        for(int a:mp.keySet()){
            int b=mp.get(a);
            long t=1;
            while(b-->0)t=(t*a+1)%mod;
            res=res*t%mod;
        }
        System.out.println(res);
    }
    public static void echo(int x){
        for(int i=2;i<=x/i;i++){
            while(x%i==0){
                mp.put(i,mp.getOrDefault(i,0)+1);
                x/=i;
            }
        }
        if(x>1)mp.put(x,mp.getOrDefault(x,0)+1);
    }
}

python

mod,mp=int(1e9+7),dict()
def echo(x):
    for i in range(2,int(x**0.5)+1):
        while x%i==0:
            x//=i
            if i in mp:
                mp[i]+=1
            else:
                mp[i]=1
    if x>1:
        if x in mp:
            mp[x]+=1
        else:
            mp[x]=1
n=int(input())
for i in range(n):
    x=int(input())
    echo(x)
res=1
for it in mp:
    a,b=it,mp[it]
    t=1
    for j in range(b):
        t=(t*a+1)%mod
    res=res*t%mod
print(res)

最大公约数

C++

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int a,b;scanf("%d%d",&a,&b);
        cout<<__gcd(a,b)<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            System.out.println(gcd(a,b));
        }
    }
    public static int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
}

python

def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)
n=int(input())
for i in range(n):
    a,b=map(int,input().split())
    print(gcd(a,b))

欧拉函数 

C++

#include<bits/stdc++.h>
using namespace std;
int phi(int x){
    int res=x;
    for(int i=2;i<=x/i;i++){
        if(x%i==0){
            res=res/i*(i-1);
            while(x%i==0)x/=i;
        }    
    }
    if(x>1)res=res/x*(x-1);
    return res;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int x;scanf("%d",&x);
        cout<<phi(x)<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int x=sc.nextInt();
            System.out.println(phi(x));
        }
    }
    public static int phi(int x){
        int res=x;
        for(int i=2;i<=x/i;i++){
            if(x%i==0){
                res=res/i*(i-1);
                while(x%i==0)x/=i;
            }
        }
        if(x>1)res=res/x*(x-1);
        return res;
    }
}

python

def phi(x):
    res=x
    for i in range(2,int(x**0.5)+1):
        if x%i==0:
            res=res//i*(i-1)
            while x%i==0:
                x//=i
    if x>1:
        res=res//x*(x-1)
    return res
n=int(input())
for i in range(n):
    print(phi(int(input())))

筛法求欧拉函数

C++

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1000010;
int primes[N],euler[N],cnt;
bool st[N];
void getEuler(int n){
    euler[1]=1;
    for(int i=2;i<=n;i++){
        if(!st[i])primes[cnt++]=i,euler[i]=i-1;
        for(int j=0;primes[j]*i<=n;j++){
            st[primes[j]*i]=true;
            if(i%primes[j]==0){
                euler[i*primes[j]]=euler[i]*primes[j];
                break;
            }
            euler[i*primes[j]]=euler[i]*(primes[j]-1);
        }
    }
}
int main(){
    int n;scanf("%d",&n);
    getEuler(n);
    ll res=0;
    for(int i=1;i<=n;i++)res+=euler[i];
    cout<<res<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=1000010,cnt;
    public static int[] primes=new int[N],euler=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        getEuler(n);
        long res=0;
        for(int i=1;i<=n;i++)res+=euler[i];
        System.out.println(res);
    }
    public static void getEuler(int n){
        euler[1]=1;
        for(int i=2;i<=n;i++){
            if(!st[i]){
                primes[cnt++]=i;
                euler[i]=i-1;
            }
            for(int j=0;primes[j]*i<=n;j++){
                int t=primes[j]*i;
                st[t]=true;
                if(i%primes[j]==0){
                    euler[t]=euler[i]*primes[j];
                    break;
                }
                euler[t]=euler[i]*(primes[j]-1);
            }
        }
    }
}

python

cnt,N=0,1000010
primes,euler,st=[0]*N,[0]*N,[False]*N
def getEuler(n):
    global cnt
    euler[1]=1
    for i in range(2,n+1):
        if not st[i]:
            primes[cnt]=i
            cnt+=1
            euler[i]=i-1
        j=0
        while primes[j]*i<=n:
            t=primes[j]*i
            st[t]=True
            if i%primes[j]==0:
                euler[t]=euler[i]*primes[j]
                break
            euler[t]=euler[i]*(primes[j]-1)
            j+=1
n=int(input())
getEuler(n)
res=0
for i in range(1,n+1):
    res+=euler[i]
print(res)

快速幂

C++

#include<bits/stdc++.h>
using namespace std;
int qmi(int a,int b,int p){
    int res=1;
    while(b){
        if(b&1)res=1ll*res*a%p;
        a=1ll*a*a%p;
        b>>=1;
    }
    return res;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int a,b,p;scanf("%d%d%d",&a,&b,&p);
        cout<<qmi(a,b,p)<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            long a=sc.nextInt(),b=sc.nextInt(),p=sc.nextInt();
            System.out.println(qmi(a,b,p));
        }
    }
    public static long qmi(long a,long b,long p){
        long res=1;
        while(b!=0){
            if((b&1)==1)res=res*a%p;
            a=a*a%p;
            b>>=1;
        }
        return res;
    }
}

python

def qmi(a,b,p):
    res=1
    while b:
        if b&1:
            res=res*a%p
        a=a*a
        b>>=1
    return res
n=int(input())
for i in range(n):
    a,b,p=map(int,input().split())
    print(qmi(a,b,p))

快速幂求逆元

C++

#include<bits/stdc++.h>
using namespace std;
int qmi(int a,int b,int mod){
    int res=1;
    while(b){
        if(b&1)res=1ll*res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int a,p;scanf("%d%d",&a,&p);
        if(__gcd(a,p)!=1)cout<<"impossible"<<'\n';
        else{
            cout<<qmi(a,p-2,p)<<'\n';
        }
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            long a=sc.nextLong(),p=sc.nextLong();
            System.out.println(gcd(a,p)!=1?"impossible":qmi(a,p-2,p));
        }
    }
    public static long gcd(long a,long b){
        return b==0?a:gcd(b,a%b);
    }
    public static long qmi(long a,long b,long mod){
        long res=1;
        while(b!=0){
            if((b&1)==1)res=res*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return res;
    }
}

python

n=int(input())
def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)
def qmi(a,b,mod):
    res=1
    while b:
        if b&1:
            res=res*a%mod
        a=a*a%mod
        b>>=1
    return res
for i in range(n):
    a,p=map(int,input().split())
    if gcd(a,p)!=1:
        print("impossible")
    else:
        print(qmi(a,p-2,p))

 扩展欧几里得算法

C++

#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int& x,int& y){
    if(b==0){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int a,b,x,y;scanf("%d%d",&a,&b);
        exgcd(a,b,x,y);
        cout<<x<<" "<<y<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] x=new int[1],y=new int[1];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            exgcd(a,b,x,y);
            System.out.println(x[0]+" "+y[0]);
        }
    }
    public static int exgcd(int a,int b,int[] x,int[] y){
        if(b==0){
            x[0]=1;
            y[0]=0;
            return a;
        }
        int d=exgcd(b,a%b,y,x);
        y[0]-=a/b*x[0];
        return d;
    }
}

python

x,y=[0],[0]
n=int(input())
def exgcd(a,b,x,y):
    if b==0:
        x[0],y[0]=1,0
        return a
    d=exgcd(b,a%b,y,x)
    y[0]-=a//b*x[0]
    return d
for i in range(n):
    a,b=map(int,input().split())
    exgcd(a,b,x,y)
    print(x[0],y[0])

线性同余方程

C++

#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int& x,int& y){
    if(b==0){
        x=1,y=0;
        return a;
    }
    int d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        int a,b,m;scanf("%d%d%d",&a,&b,&m);
        int x,y;
        int d=exgcd(a,m,x,y);
        int t=b/d;
        if(b%d)puts("impossible");
        else cout<<1ll*t*x%m<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int[] x=new int[1],y=new int[1];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            int a=sc.nextInt(),b=sc.nextInt(),m=sc.nextInt();
            int d=exgcd(a,m,x,y);
            System.out.println(b%d>0?"impossible":(long)b/d*x[0]%m);
        }
    }
    public static int exgcd(int a,int b,int[] x,int[] y){
        if(b==0){
            x[0]=1;
            y[0]=0;
            return a;
        }
        int d=exgcd(b,a%b,y,x);
        y[0]-=a/b*x[0];
        return d;
    }
}

python

x,y=[0],[0]
n=int(input())
def exgcd(a,b,x,y):
    if b==0:
        x[0],y[0]=1,0
        return a
    d=exgcd(b,a%b,y,x)
    y[0]-=a//b*x[0]
    return d
for i in range(n):
    a,b,m=map(int,input().split())
    d=exgcd(a,m,x,y);
    if b%d>0:
        print("impossible")
    else:
        print(b//d*x[0]%m)

表达整数的奇怪方式 

C++

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll exgcd(ll a,ll b,ll& x,ll& y){
    if(b==0){
        x=1,y=0;
        return a;
    }
    ll d=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
int main(){
    int n;scanf("%d",&n);
    ll x=0,a1,m1;scanf("%lld%lld",&a1,&m1);
    for(int i=0;i<n-1;i++){
        ll a2,m2;scanf("%lld%lld",&a2,&m2);
        ll k1,k2;
        ll d=exgcd(a1,-a2,k1,k2);
        if((m2-m1)%d){
            x=-1;
            break;
        }
        k1*=(m2-m1)/d;
        ll t=a2/d;
        k1=(k1%t+t)%t;
        m1=k1*a1+m1;
        a1=abs(a1/d*a2);
    }
    if(x==-1)cout<<-1<<'\n';
    else cout<<(m1%a1+a1)%a1<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static long[] k1=new long[1],k2=new long[1];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long x=0,a1=sc.nextLong(),m1=sc.nextLong();
        for(int i=0;i<n-1;i++){
            long a2=sc.nextLong(),m2=sc.nextLong();
            long d=exgcd(a1,-a2,k1,k2);
            if((m2-m1)%d>0){
                x=-1;
                break;
            }
            k1[0]*=(m2-m1)/d;
            long t=a2/d;
            k1[0]=(k1[0]%t+t)%t;
            m1+=a1*k1[0];
            a1=Math.abs(a1/d*a2);
        }
        System.out.println(x==-1?x:(m1%a1+a1)%a1);
    }
    public static long exgcd(long a,long b,long[] x,long[] y){
        if(b==0){
            x[0]=1;
            y[0]=0;
            return a;
        }
        long d=exgcd(b,a%b,y,x);
        y[0]-=a/b*x[0];
        return d;
    }
}

python

k1,k2=[0],[0]
def exgcd(a,b,x,y):
    if b==0:
        x[0],y[0]=1,0
        return a
    d=exgcd(b,a%b,y,x)
    y[0]-=a//b*x[0]
    return d
n=int(input())
x=0
a1,m1=map(int,input().split())
for i in range(n-1):
    a2,m2=map(int,input().split())
    d=exgcd(a1,-a2,k1,k2)
    if (m2-m1)%d:
        x=-1
        break
    k1[0]*=(m2-m1)//d
    t=a2//d
    k1[0]=(k1[0]%t+t)%t
    m1+=a1*k1[0]
    a1=abs(a1//d*a2)
if x==-1:
    print("-1")
else:
    print((m1%a1+a1)%a1)

高斯消元解线性方程组

C++

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const double eps=1e-8;
double a[N][N];
int gauss(int n){
    int r=0,c=0;
    for(;c<n;c++){
        int t=r;
        for(int i=r;i<n;i++)
            if(fabs(a[i][c])>fabs(a[t][c]))
                t=i;
        if(fabs(a[t][c])<eps)continue;
        for(int i=c;i<=n;i++)swap(a[r][i],a[t][i]);
        for(int i=n;i>=c;i--)a[r][i]/=a[r][c];
        for(int i=r+1;i<n;i++)
            if(fabs(a[i][c])>eps)
                for(int j=n;j>=c;j--){
                    a[i][j]-=a[i][c]*a[r][j];
                }
        r++;
    }
    if(r<n){
        for(int i=r;i<n;i++)
            if(fabs(a[i][n])>eps)
                return 2;
        return 1;
    }
    for(int i=n-1;i>=0;i--)
        for(int j=i+1;j<n;j++)
            a[i][n]-=a[i][j]*a[j][n];
    return 0;
}
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++)
        for(int j=0;j<n+1;j++)
            scanf("%lf",&a[i][j]);
    int t=gauss(n);
    if(t==2)puts("No solution");
    else if(t==1)puts("Infinite group solutions");
    else{
        for(int i=0;i<n;i++)printf("%.2lf\n",a[i][n]);
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=110;
    public static double eps=1e-8;
    public static double[][] a=new double[N][N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=0;i<n;i++){
            for(int j=0;j<n+1;j++){
                a[i][j]=sc.nextDouble();
            }
        }
        int t=gauss(n);
        if(t==2)System.out.println("No solution");
        else if(t==1)System.out.println("Infinite group solutions");
        else for(int i=0;i<n;i++)System.out.printf("%.2f\n",a[i][n]);
    }
    public static int gauss(int n){
        int r=0,c=0;
        for(;c<n;c++){
            int t=r;
            for(int i=r;i<n;i++)
                if(Math.abs(a[i][c])>Math.abs(a[t][c]))
                    t=i;
            if(Math.abs(a[t][c])<eps)continue;
            for(int i=c;i<=n;i++){
                double temp=a[r][i];
                a[r][i]=a[t][i];
                a[t][i]=temp;
            }
            for(int i=n;i>=c;i--)a[r][i]/=a[r][c];
            for(int i=r+1;i<n;i++)
                if(Math.abs(a[i][c])>eps)
                    for(int j=n;j>=0;j--)
                        a[i][j]-=a[r][j]*a[i][c];
            r++;
        }
        if(r<n){
            for(int i=r;i<n;i++)
                if(Math.abs(a[i][n])>eps)
                    return 2;
            return 1;
        }
        for(int i=n-1;i>=0;i--)
            for(int j=i+1;j<n;j++)
                a[i][n]-=a[i][j]*a[j][n];
        return 0;
    }
}

python

eps,N=1e-8,110
a=[]
n=int(input())
def gauss():
    r=0
    for c in range(n):
        t=r
        for i in range(r,n):
            if abs(a[i][c])>abs(a[t][c]):
                t=i
        if abs(a[t][c])<eps:
            continue
        for i in range(c,n+1):
            a[t][i],a[r][i]=a[r][i],a[t][i]
        for i in range(n,c-1,-1):
            a[r][i]/=a[r][c]
        for i in range(r+1,n):
            for j in range(n,c-1,-1):
                a[i][j]-=a[i][c]*a[r][j];
        r+=1
    if r<n:
        for i in range(r,n):
            if abs(a[i][n])>eps:
                return 2
        return 1
    for i in range(n-1,-1,-1):
        for j in range(i+1,n):
            a[i][n]-=a[i][j]*a[j][n];
    return 0
for i in range(n):
    a.append(list(map(float,input().split())))
t=gauss()
if t==2:
    print("No solution")
elif t==1:
    print("Infinite group solutions")
else:
    for i in range(n):
        print("%.2lf"%(a[i][n]))

高斯消元解异或线性方程组

C++

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N][N];
int gauss(int n){
    int r=0,c=0;
    for(;c<n;c++){
        int t=r;
        for(int i=r;i<n;i++)
            if(a[i][c])
                t=i;
        if(!a[t][c])continue;
        for(int i=c;i<=n;i++)swap(a[r][i],a[t][i]);
        for(int i=r+1;i<n;i++)
            if(a[i][c])
                for(int j=n;j>=c;j--)
                    a[i][j]^=a[r][j];
        r++;
    }
    if(r<n){
        for(int i=r;i<n;i++)
            if(a[i][n])
                return 2;
        return 1;
    }
    for(int i=n-1;i>=0;i--)
        for(int j=i+1;j<n;j++)
            a[i][n]^=a[i][j]*a[j][n];
    return 0;
}
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++)
        for(int j=0;j<n+1;j++)
            scanf("%d",&a[i][j]);
    int t=gauss(n);
    if(t==2)puts("No solution");
    else if(t==1)puts("Multiple sets of solutions");
    else{
        for(int i=0;i<n;i++)cout<<a[i][n]<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=110;
    public static int[][] a=new int[N][N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        for(int i=0;i<n;i++)
            for(int j=0;j<n+1;j++)
                a[i][j]=sc.nextInt();
        int t=gauss(n);
        if(t==2)System.out.println("No solution");
        else if(t==1)System.out.println("Multiple sets of solutions");
        else{
            for(int i=0;i<n;i++){
                System.out.println(a[i][n]);
            }
        }
    }
    public static int gauss(int n){
        int r=0,c=0;
        for(;c<n;c++){
            int t=r;
            for(int i=r;i<n;i++)
                if(a[i][c]==1)
                    t=i;
            if(a[t][c]==0)continue;
            for(int i=c;i<=n;i++){
                int temp=a[t][i];
                a[t][i]=a[r][i];
                a[r][i]=temp;
            }
            for(int i=r+1;i<n;i++)
                if(a[i][c]==1)
                    for(int j=n;j>=c;j--)
                        a[i][j]^=a[r][j];
            r++;
        }
        if(r<n){
            for(int i=r;i<n;i++)
                if(a[i][n]==1) 
                    return 2;
            return 1;
        }
        for(int i=n-1;i>=0;i--)
            for(int j=i+1;j<n;j++)
                a[i][n]^=a[i][j]*a[j][n];
        return 0;
    }
}

python

a=[]
n=int(input())
def gauss():
    r=0
    for c in range(n):
        t=r
        for i in range(r,n):
            if a[i][c]:
                t=i
        if a[t][c]==0:
            continue
        for i in range(c,n+1):
            a[r][i],a[t][i]=a[t][i],a[r][i]
        for i in range(r+1,n):
            if a[i][c]:
                for j in range(n,c-1,-1):
                    a[i][j]^=a[r][j]
        r+=1
    if r<n:
        for i in range(r,n):
            if a[i][n]:
                return 2
        return 1
    for i in range(n-1,-1,-1):
        for j in range(i+1,n):
            a[i][n]^=a[i][j]&a[j][n]
    return 0
for i in range(n):
    a.append(list(map(int,input().split())))
t=gauss()
if t==2:
    print("No solution")
elif t==1:
    print("Multiple sets of solutions")
else:
    for i in range(n):
        print(a[i][n])

求组合数 I

C++

#include<bits/stdc++.h>
using namespace std;
const int N=2010,mod=1e9+7;
int c[N][N];
void init(){
    for(int i=0;i<N;i++)
        for(int j=0;j<=i;j++)
            if(!j)c[i][j]=1;
            else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;

}
int main(){
    int n;scanf("%d",&n);
    init();
    while(n--){
        int a,b;scanf("%d%d",&a,&b);
        cout<<c[a][b]<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=2010,mod=(int)1e9+7;
    public static int[][] c=new int[N][N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        init();
        int n=sc.nextInt();
        while(n-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            System.out.println(c[a][b]);
        }
    }
    public static void init(){
        for(int i=0;i<N;i++)
            for(int j=0;j<=i;j++)
                if(j==0)c[i][j]=1;
                else c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
    }
}

python

N,mod=2010,int(1e9+7)
c=[[0]*N for i in range(N)]
def init():
    for i in range(N):
        for j in range(i+1):
            if not j:
                c[i][j]=1
            else:
                c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod
n=int(input())
init()
for i in range(n):
    a,b=map(int,input().split())
    print(c[a][b])

 求组合数 II

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010,mod=1e9+7;
int f[N],rf[N];
int qmi(int a,int b){
    int res=1;
    while(b){
        if(b&1)res=1ll*res*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }
    return res;
}
int C(int a,int b){
    if(a<b)
        return 0;
    return 1ll*f[a]*rf[b]%mod*rf[a-b]%mod;
}
int main(){
    int n;scanf("%d",&n);
    f[0]=rf[0]=1;
    for(int i=1;i<N;i++)f[i]=1ll*f[i-1]*i%mod;
    rf[N-1]=qmi(f[N-1],mod-2);
    for(int i=N-2;i>=1;i--)rf[i]=1ll*rf[i+1]*(i+1)%mod;
    while(n--){
        int a,b;scanf("%d%d",&a,&b);
        cout<<C(a,b)<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=100010;
    public static long mod=(int)1e9+7;
    public static long[] f=new long[N],rf=new long[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        f[0]=rf[0]=1;
        for(int i=1;i<N;i++)f[i]=f[i-1]*i%mod;
        rf[N-1]=qmi(f[N-1],mod-2);
        for(int i=N-2;i>=0;i--)rf[i]=rf[i+1]*(i+1)%mod;
        int n=sc.nextInt();
        while(n-->0){
            int a=sc.nextInt(),b=sc.nextInt();
            System.out.println(C(a,b));
        }
    }
    public static long C(int a,int b){
        if(a<b)return 0;
        return f[a]*rf[b]%mod*rf[a-b]%mod;
    }
    public static long qmi(long a,long b){
        long res=1;
        while(b>0){
            if((b&1)==1)res=res*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return res;
    }
}

python

N,mod=100010,int(1e9+7)
f=[0]*N
rf=[0]*N
n=int(input())
def qmi(a,b):
    res=1
    while b:
        if b&1:
            res=res*a%mod
        a=a*a%mod
        b>>=1
    return res
def C(a,b):
    if a<b:
        return 0
    return f[a]*rf[b]%mod*rf[a-b]%mod
f[0]=rf[0]=1
for i in range(1,N):
    f[i]=f[i-1]*i%mod
rf[N-1]=qmi(f[N-1],mod-2)
for i in range(N-2,0,-1):
    rf[i]=rf[i+1]*(i+1)%mod
for i in range(n):
    a,b=map(int,input().split())
    print(C(a,b))

求组合数 III 

C++

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int qmi(int a,int b,int p){
    int res=1;
    while(b){
        if(b&1)res=1ll*res*a%p;
        a=1ll*a*a%p;
        b>>=1;
    }
    return res;
}
int C(int a,int b,int p){
    int res=1;
    int j=a;
    for(int i=1;i<=b;i++,j--){
        res=1ll*res*j%p;
        res=1ll*res*qmi(i,p-2,p)%p;

    }
    return res;
}
int lucas(ll a,ll b,int p){
    if(a<p and b<p)return C(a,b,p);
    return 1ll*C(a%p,b%p,p)*lucas(a/p,b/p,p)%p;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        ll a,b,p;scanf("%lld%lld%lld",&a,&b,&p);
        cout<<lucas(a,b,p)<<'\n';
    }
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        while(n-->0){
            long a=sc.nextLong(),b=sc.nextLong(),p=sc.nextLong();
            System.out.println(lucas(a,b,p));
        }
    }
    public static long lucas(long a,long b,long p){
        if(a<p&&b<p)return C(a,b,p);
        return C(a%p,b%p,p)*lucas(a/p,b/p,p)%p;
    }
    public static long C(long a,long b,long p){
        long j=a;
        long res=1;
        for(int i=1;i<=b;i++,j--){
            res=res*j%p;
            res=res*qmi(i,p-2,p)%p;
        }
        return res;
    }
    public static long qmi(long a,long b,long p){
        long res=1;
        while(b>0){
            if((b&1)==1)res=res*a%p;
            a=a*a%p;
            b>>=1;
        }
        return res;
    }
}

python

def qmi(a,b,p):
    res=1
    while b:
        if b&1:
            res=res*a%p
        a=a*a%p
        b>>=1
    return res
def C(a,b,p):
    res,j=1,a
    for i in range(1,b+1):
        res=res*j%p
        res=res*qmi(i,p-2,p)%p
        j-=1
    return res
def lucas(a,b,p):
    if a<p and b<p:
        return C(a,b,p)
    return C(a%p,b%p,p)*lucas(a//p,b//p,p)%p
n=int(input())
for i in range(n):
    a,b,p=map(int,input().split())
    print(lucas(a,b,p))

求组合数 IV 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int cnt,primes[N];
bool st[N];
int sum[N];
void getPrimes(int n){
    for(int i=2;i<=n;i++){
        if(!st[i])primes[cnt++]=i;
        for(int j=0;primes[j]*i<=n;j++){
            st[primes[j]*i]=true;
            if(i%primes[j]==0)break;
        }
    }
}
int get(int n,int p){
    int res=0;
    while(n){
        res+=n/p;
        n/=p;
    }
    return res;
}
vector<int>mul(vector<int>&a,int b){
    vector<int>res;
    int t=0;
    for(int i=0;i<a.size() or t;i++){
        if(i<a.size()){
            t+=a[i]*b;
        }
        res.push_back(t%10);
        t/=10;
    }
    return res;
}
int main(){
    int a,b;scanf("%d%d",&a,&b);
    getPrimes(a);
    for(int i=0;i<cnt;i++){
        int p=primes[i];
        sum[i]=get(a,p)-get(a-b,p)-get(b,p);
    }
    vector<int>res;
    res.push_back(1);
    for(int i=0;i<cnt;i++){
        for(int j=0;j<sum[i];j++){
            res=mul(res,primes[i]);
        }
    }
    for(int i=res.size()-1;i>=0;i--)cout<<res[i];
    puts("");
    return 0;
}

java

import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static int N=100010,cnt;
    public static int[] primes=new int[N],sum=new int[N];
    public static boolean[] st=new boolean[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt(),b=sc.nextInt();
        getPrimes(a);
        for(int i=0;i<cnt;i++){
            int p=primes[i];
            sum[i]=get(a,p)-get(a-b,p)-get(b,p);
        }
        BigInteger res=new BigInteger("1");
        for(int i=0;i<cnt;i++){
            int p=primes[i];
            for(int j=0;j<sum[i];j++)
            res=res.multiply(new BigInteger(String.valueOf(p)));
        }
        System.out.println(res);
    }
    public static void getPrimes(int n){
        for(int i=2;i<=n;i++){
            if(!st[i])primes[cnt++]=i;
            for(int j=0;primes[j]*i<=n;j++){
                st[primes[j]*i]=true;
                if(i%primes[j]==0)break;
            }
        }
    }
    public static int get(int n,int p){
        int res=0;
        while(n!=0){
            res+=n/p;
            n/=p;
        }
        return res;
    }
}

python

N=5050
f=[0]*N
f[0]=1
for i in range(1,N):
    f[i]=f[i-1]*i
def C(a,b):
    return f[a]//f[b]//f[a-b]
a,b=map(int,input().split())
print(C(a,b))

满足条件的01序列 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=200010,mod=1e9+7;
int f[N],rf[N];
int qmi(int a,int b){
    int res=1;
    while(b){
        if(b&1)res=1ll*res*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }
    return res;
}
int C(int a,int b){
    if(a<b)return 0;
    return 1ll*f[a]*rf[a-b]%mod*rf[b]%mod;
}
int main(){
    f[0]=rf[0]=1;
    for(int i=1;i<N;i++)f[i]=1ll*f[i-1]*i%mod;
    rf[N-1]=qmi(f[N-1],mod-2);
    for(int i=N-2;i>=1;i--)rf[i]=1ll*rf[i+1]*(i+1)%mod;
    int n;scanf("%d",&n);
    cout<<(C(n*2,n)-C(n*2,n-1)+mod)%mod<<endl;
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=200010,mod=(int)1e9+7;
    public static long[] f=new long[N],rf=new long[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        f[0]=rf[0]=1;
        for(int i=1;i<N;i++)f[i]=f[i-1]*i%mod;
        rf[N-1]=qmi(f[N-1],mod-2);
        for(int i=N-2;i>=1;i--)rf[i]=rf[i+1]*(i+1)%mod;
        int n=sc.nextInt();
        long res=(C(n*2,n)-C(n*2,n-1)+mod)%mod;
        System.out.println(res);
    }
    public static long qmi(long a,long b){
        long res=1;
        while(b>0){
            if((b&1)==1)res=res*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return res;
    }
    public static long C(int a,int b){
        return f[a]*rf[a-b]%mod*rf[b]%mod;
    }
}

python

N,mod=200010,int(1e9+7)
f,rf=[0]*N,[0]*N
f[0]=rf[0]=1
def qmi(a,b):
    res=1
    while b:
        if b&1:
            res=res*a%mod
        a=a*a%mod
        b>>=1
    return res
def C(a,b):
    return f[a]*rf[a-b]%mod*rf[b]%mod
for i in range(1,N):
    f[i]=f[i-1]*i%mod
rf[N-1]=qmi(f[N-1],mod-2);
for i in range(N-2,0,-1):
    rf[i]=rf[i+1]*(i+1)%mod
n=int(input())
res=(C(n*2,n)-C(n*2,n-1)+mod)%mod
print(res)

能被整除的数

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int p[N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)scanf("%d",&p[i]);
    int sum=0;
    for(int i=1;i<1<<m;i++){
        int t=1,s=0;
        for(int j=0;j<m;j++){
            if(i>>j&1){     
                if(1ll*t*p[j]>n){
                    t=-1;
                    break;
                }
                t*=p[j];
                s++;
            }
        }
        if(t!=-1){
            if(s&1)sum+=n/t;
            else sum-=n/t;
        }
    }
    cout<<sum<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        int[] p=new int[m];
        for(int i=0;i<m;i++){
            p[i]=sc.nextInt();
        }
        int sum=0;
        for(int i=1;i<1<<m;i++){
            int t=1,s=0;
            for(int j=0;j<m;j++){
                if((i>>j&1)==1){
                    if((long)t*p[j]>(long)n){
                        t=-1;
                        break;
                    }
                    t=t*p[j];
                    s++;
                }
            }
            if(t!=-1){
                if(s%2==1)sum+=n/t;
                else sum-=n/t;
            }
        }
        System.out.println(sum);
    }
}

python

n,m=map(int,input().split())
p=list(map(int,input().split()))
sum=0
for i in range(1,1<<m):
    t,s=1,0
    for j in range(0,m):
        if i>>j&1:
            if t*p[j]>n:
                t=-1
                break
            t*=p[j]
            s+=1
    if t!=-1:
        if s&1:
            sum+=n//t
        else:
            sum-=n//t
print(sum)

 Nim游戏

C++

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;scanf("%d",&n);
    int res=0;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        res^=x;
    }
    puts(res?"Yes":"No");
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int res=0;
        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            res^=x;
        }
        System.out.println(res>0?"Yes":"No");
    }
}

python

n=int(input())
s=list(map(int,input().split()))
res=0
for x in s:
    res^=x
if res:
    print("Yes")
else :
    print("No")

台阶-Nim游戏

C++

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;scanf("%d",&n);
    int res=0;
    for(int i=1;i<=n;i++){
        int x;scanf("%d",&x);
        if(i&1)res^=x;
    }
    puts(res?"Yes":"No");
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int res=0;
        for(int i=1;i<=n;i++){
            int x=sc.nextInt();
            if((i&1)==1)res^=x;
        }
        System.out.println(res>0?"Yes":"No");
    }
}

python

n=int(input())
s=list(map(int,input().split()))
cnt,res=0,0
for x in s:
    cnt+=1
    if cnt%2==1:
        res^=x
if res:
    print("Yes")
else:
    print("No")

集合-Nim游戏 

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],f[N];
int n;
int sg(int x){
    if(f[x]!=-1)return f[x];
    set<int>s;
    for(int i=0;i<n;i++){
        if(x>=a[i])s.insert(sg(x-a[i]));
    }
    for(int i=0;;i++){
        if(!s.count(i)){
            f[x]=i;
            return f[x];
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    int m;scanf("%d",&m);
    int sum=0;
    memset(f,-1,sizeof f);
    while(m--){
        int x;scanf("%d",&x);
        sum^=sg(x);
    }
    puts(sum?"Yes":"No");
    return 0;
}

java

import java.util.*;
public class Main{
    public static int N=100010,n;
    public static int[] f=new int[N],a=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        for(int i=0;i<n;i++)a[i]=sc.nextInt();
        int m=sc.nextInt();
        int res=0;
        Arrays.fill(f,-1);
        while(m-->0){
            int x=sc.nextInt();
            res^=sg(x);
        }
        System.out.println(res>0?"Yes":"No");
    }
    public static int sg(int x){
        if(f[x]!=-1)return f[x];
        Set<Integer>s=new HashSet<>();
        for(int i=0;i<n;i++){
            if(x>=a[i])s.add(sg(x-a[i]));
        }
        for(int i=0;;i++){
            if(!s.contains(i)){
                f[x]=i;
                return f[x];
            }
        }
    }
}

python

f=[-1]*100010
n=int(input())
a=list(map(int,input().split()))
m=int(input())
b=list(map(int,input().split()))
res=0
def sg(x):
    s=set()
    if f[x]!=-1:
        return f[x]
    for i in range(n):
        if x-a[i]>=0:
            s.add(sg(x-a[i]))
    i=0
    while True:
        if i not in s:
            f[x]=i
            return f[x]
        i+=1
for x in b:
    res^=sg(x)
if res:
    print("Yes")
else:
    print("No")

拆分-Nim游戏 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N],f[N];
int sg(int x){
    if(f[x]!=-1)return f[x];
    set<int>s;
    for(int i=0;i<x;i++)
        for(int j=0;j<=i;j++)
            s.insert(sg(i)^sg(j));
    for(int i=0;;i++)
        if(!s.count(i))
            return f[x]=i;
}
int main(){
    int n;scanf("%d",&n);
    int res=0;
    memset(f,-1,sizeof f);
    for(int i=0;i<n;i++){
        int x;scanf("%d",&x);
        res^=sg(x);
    }
    puts(res?"Yes":"No");
    return 0;
}

java

import java.util.*;
public class Main{
    public static int[] f=new int[100010];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int res=0;
        Arrays.fill(f,-1);
        for(int i=0;i<n;i++){
            int x=sc.nextInt();
            res^=sg(x);
        }
        System.out.println(res>0?"Yes":"No");
    }
    public static int sg(int x){
        if(f[x]!=-1)return f[x];
        Set<Integer>s=new HashSet<>();
        for(int i=0;i<x;i++)
            for(int j=0;j<=i;j++)
                s.add(sg(i)^sg(j));
        for(int i=0;;i++)
            if(!s.contains(i))
                return f[x]=i;
    }
}

python

f=[-1]*100010
n=int(input())
s=list(map(int,input().split()))
res=0
def sg(x):
    if f[x]!=-1:
        return f[x]
    ss=set()
    for i in range(x):
        for j in range(0,i+1):
            ss.add(sg(i)^sg(j))
    i=0
    while True:
        if i not in ss:
            f[x]=i
            return f[x]
        i+=1
for x in s:
    res^=sg(x)
if res:
    print("Yes")
else:
    print("No")

动态规划 

01背包问题

未优化
C++

#include<bits/stdc++.h>
using namespace std;
const int N=2020;
int f[N][N];
int v[N],w[N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            if(v[i]>j)f[i][j]=f[i-1][j];
            else f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<f[n][m]<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=2020;
    public static int[][] f=new int[N][N];
    public static int[] v=new int[N],w=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=1;i<=n;i++){
            v[i]=sc.nextInt();
            w[i]=sc.nextInt();
        }
        for(int i=1;i<=n;i++)
            for(int j=0;j<=m;j++)
                if(v[i]>j)f[i][j]=f[i-1][j];
                else f[i][j]=Math.max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
        System.out.println(f[n][m]);
    }
}

python

N=2020
v,w=[0]*N,[0]*N
f=[[0]*N for i in range(N)]
n,m=map(int,input().split())
for i in range(1,n+1):
    v[i],w[i]=map(int,input().split())
for i in range(1,n+1):
    for j in range(0,m+1):
        if j<v[i]:
            f[i][j]=f[i-1][j]
        else:
            f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]);
print(f[n][m])

优化后
C++

#include<bits/stdc++.h>
using namespace std;
const int N=2020;
int f[N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        int v,w;scanf("%d%d",&v,&w);
        for(int j=m;j>=0;j--){
            if(j>=v)f[j]=max(f[j],f[j-v]+w);
        }
    }
    cout<<f[m]<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static int N=2020;
    public static int[] f=new int[N];
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=1;i<=n;i++){
            int v=sc.nextInt(),w=sc.nextInt();
            for(int j=m;j>=0;j--)
                if(j>=v) f[j]=Math.max(f[j],f[j-v]+w);
        }
        System.out.println(f[m]);
    }
}

python

N=2020
f=[0]*N
n,m=map(int,input().split())
for i in range(0,n):
    v,w=map(int,input().split())
    for j in range(m,-1,-1):
        if j>=v:
            f[j]=max(f[j],f[j-v]+w);
print(f[m])

完全背包问题 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int f[N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
        int v,w;scanf("%d%d",&v,&w);
        for(int j=0;j<=m;j++)
            if(j>=v)f[j]=max(f[j],f[j-v]+w);
    }
    cout<<f[m]<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        int[] f=new int[m+1];      
        for(int i=0;i<n;i++){
            int v=sc.nextInt(),w=sc.nextInt();
            for(int j=0;j<=m;j++){
                if(j>=v)f[j]=Math.max(f[j],f[j-v]+w);
            }
        }
        System.out.println(f[m]);
    }
}

python

n,m=map(int,input().split())
f=[0]*(m+1)
for i in range(n):
    v,w=map(int,input().split())
    for j in range(m+1):
        if j>=v:
            f[j]=max(f[j],f[j-v]+w)
print(f[m])

多重背包问题 

C++

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int v[N],w[N],s[N];
int f[N][N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d%d%d",&v[i],&w[i],&s[i]);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=m;j++)
            for(int k=0;k<=s[i] and k*v[i]<=j;k++)
                f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
    cout<<f[n][m]<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        int[] v=new int[n+1];
        int[] w=new int[n+1];
        int[] s=new int[n+1];
        int[][] f=new int[n+1][m+1];
        for(int i=1;i<=n;i++){
            v[i]=sc.nextInt();
            w[i]=sc.nextInt();
            s[i]=sc.nextInt();
        }
        for(int i=1;i<=n;i++)
            for(int j=0;j<=m;j++)
                for(int k=0;k<=s[i] && k*v[i]<=j;k++)
                    f[i][j]=Math.max(f[i][j],f[i-1][j-v[i]*k]+w[i]*k);
        System.out.println(f[n][m]);
    }
}

python

n,m=map(int,input().split())
f=[[0]*(m+1) for i in range(n+1)]
for i in range(1,n+1):
    v,w,s=map(int,input().split())
    for j in range(0,m+1):
        for k in range(0,s+1):
            if k*v>j:
                break
            f[i][j]=max(f[i][j],f[i-1][j-v*k]+k*w)
print(f[n][m])

多重背包问题 II

C++

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int v[N],w[N];
int f[N];
int main(){
    int n,m;scanf("%d%d",&n,&m);
    int cnt=0;
    for(int i=0;i<n;i++){
        int a,b,s;scanf("%d%d%d",&a,&b,&s);
        int k=1;
        while(k<=s){
            cnt++;
            v[cnt]=k*a;
            w[cnt]=k*b;
            s-=k;
            k*=2;
        }
        if(s>0){
            cnt++;
            v[cnt]=s*a;
            w[cnt]=s*b;
        }
    }
    for(int i=1;i<=cnt;i++)
        for(int j=m;j>=v[i];j--)
            f[j]=max(f[j],f[j-v[i]]+w[i]);
    cout<<f[m]<<'\n';
    return 0;
}

java

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        int N=100010,cnt=0;
        int[] v=new int[N],w=new int[N],f=new int[N];
        for(int i=0;i<n;i++){
            int a=sc.nextInt(),b=sc.nextInt(),s=sc.nextInt();
            int k=1;
            while(k<=s){
                cnt++;
                v[cnt]=a*k;
                w[cnt]=b*k;
                s-=k;
                k*=2;
            }
            if(s>0){
                cnt++;
                v[cnt]=s*a;
                w[cnt]=s*b;
            }
        }
        for(int i=1;i<=cnt;i++)
            for(int j=m;j>=v[i];j--)
                f[j]=Math.max(f[j],f[j-v[i]]+w[i]);
        System.out.println(f[m]);
    }
}

python

n,m=map(int,input().split())
N,cnt=100010,0
v,w,f=[0]*N,[0]*N,[0]*N
for i in range(n):
    a,b,s=map(int,input().split())
    k=1
    while k<=s:
        cnt+=1
        v[cnt]=a*k
        w[cnt]=b*k
        s-=k
        k*=2
    if s>0:
        cnt+=1
        v[cnt]=a*s
        w[cnt]=b*s
for i in range(1,cnt+1):
    for j in range(m,v[i]-1,-1):
        f[j]=max(f[j],f[j-v[i]]+w[i]);
print(f[m])

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值