基础算法
快速排序
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])