快速排序:
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=(int)(1e6+5);
static int mod=1000000007;
static int a[]=new int[N];
public static void quick_sort(int l,int r){
if(l>=r) return;
int x=a[l],i=l-1,j=r+1;
while(l<r){
do{i++;}while(a[i]<x);
do{j--;}while(a[j]>x);
if(i<j){
int tmp=a[i];a[i]=a[j];a[j]=tmp;
}
}
quick_sort(l,j);
quick_sort(j+1,r);
}
public static void main(String[] args) throws IOException {
int n=cin.nextInt();
for(int i=1;i<=n;i++) a[i]=cin.nextInt();
quick_sort(1,n);
System.out.close();
}
}
归并排序:
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=(int)(1e6+5);
static int mod=1000000007;
static int a[]=new int[N],tmp[]=new int[N];
public static void merge_sort(int l,int r){
if(l>=r) return;
int mid=l+r>>1;
merge_sort(l,mid);merge_sort(mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r){
if(a[i]<=a[j]) tmp[k++]=a[i++];
else tmp[k++]=a[j++];
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++) a[i]=tmp[j];
}
public static void main(String[] args) throws IOException {
int n=cin.nextInt();
for(int i=0;i<n;i++) a[i]=cin.nextInt();
merge_sort(0,n-1);
for(int i=0;i<n;i++)
System.out.print(a[i]+" ");
System.out.close();
}
}
浮点数二分:
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=(int)(1e6+5);
static int mod=1000000007;
public static void main(String[] args) throws IOException {
double x=cin.nextDouble();
double l=0,r=x;
while(r-l>1e-8){
double mid=(l+r)/2;
if(mid*mid>=x) r=mid;
else l=mid;
}
System.out.printf("%.4f",r);
System.out.close();
}
}
高精度加法:
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static Vector a=new Vector(),b=new Vector(),c=new Vector();
public static void add(Vector a,Vector b){
int tmp=0;
for(int i=0,j=0;i<a.size()||j<b.size();i++,j++){
if(i<a.size()) tmp+=(int) a.get(i);
if(j<b.size()) tmp+=(int) b.get(i);
c.add(tmp%10);
tmp/=10;
}
if(tmp>0) c.add(tmp);
}
public static void main(String[] args) throws IOException {
String s1=cin.next();char c1[]=s1.toCharArray();
String s2=cin.next();char c2[]=s2.toCharArray();
for(int i=s1.length()-1;i>=0;i--) a.add(c1[i]-'0');
for(int i=s2.length()-1;i>=0;i--) b.add(c2[i]-'0');
add(a,b);
for(int i=c.size()-1;i>=0;i--) System.out.print(c.get(i));
System.out.close();
}
}
高精度减法:
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static Vector a=new Vector(),b=new Vector(),c=new Vector();
public static boolean cmp(Vector a,Vector b){
if(a.size()!=b.size()) return a.size()>b.size();
for(int i=a.size()-1;i>=0;i--){
if(a.get(i)!=b.get(i)) return (int)(a.get(i))>=(int)(b.get(i));
}
return true;
}
public static void sub(Vector a,Vector b){
for(int i=0,t=0;i<a.size();i++){
t=(int)a.get(i)-t;
if(i<b.size()) t-=(int)b.get(i);
c.add((t+10)%10);
if(t>=0) t=0;
else t=1;
}
while(c.size()>1&&(int)c.get(c.size()-1)==0)
c.remove(c.size()-1);
}
public static void main(String[] args) throws IOException {
String s1=cin.next();char c1[]=s1.toCharArray();
String s2=cin.next();char c2[]=s2.toCharArray();
for(int i=s1.length()-1;i>=0;i--) a.add(c1[i]-'0');
for(int i=s2.length()-1;i>=0;i--) b.add(c2[i]-'0');
if(cmp(a,b)==true){
sub(a,b);
for(int i=c.size()-1;i>=0;i--) System.out.print(c.get(i));
} else{
System.out.print("-");
sub(b,a);
for(int i=c.size()-1;i>=0;i--) System.out.print(c.get(i));
}
System.out.close();
}
}
高精度乘法
一个大数用vector,一个int类型数字相乘
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static Vector a=new Vector(),c=new Vector();
public static void mul(Vector a,int b){
for(int i=0,tmp=0;i<a.size()||tmp>0;i++){
if(i<a.size()) tmp=(int)a.get(i)*b;
c.add(tmp%10);
tmp/=10;
}
}
public static void main(String[] args) throws IOException {
String s=cin.next();char c1[]=s.toCharArray();
int b=cin.nextInt();
for(int i=s.length()-1;i>=0;i--) a.add(c1[i]-'0');
mul(a,b);
for(int i=c.size()-1;i>=0;i--)
System.out.print(c.get(i));
System.out.close();
}
}
高精度除法
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static Vector a=new Vector(),c=new Vector<>();
public static void divide(Vector a,int b){
int tmp=0;
for(int i=a.size()-1;i>=0;i--){
tmp=tmp*10+(int)a.get(i);
if(tmp>=b){
c.add(tmp/b);
tmp%=b;
}else{
c.add(0);
}
}
while(c.size()>1&&(int)c.get(0)==0)
c.remove(0);
}
public static void main(String[] args) throws IOException {
String s=cin.next();char c1[]=s.toCharArray();
int b=cin.nextInt();
for(int i=s.length()-1;i>=0;i--) a.add(c1[i]-'0');
divide(a,b);
for(int i=0;i<c.size();i++)
System.out.print(c.get(i));
System.out.close();
}
}
子矩阵的和
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static int a[][]=new int[1005][1005],s[][]=new int[1005][1005];
public static void main(String[] args) throws IOException {
int n=cin.nextInt(),m=cin.nextInt(),q=cin.nextInt();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=cin.nextInt();
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
while(m-->0){
int x1=cin.nextInt(),y1=cin.nextInt(),x2=cin.nextInt(),y2=cin.nextInt();
int ans=s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];
System.out.println(ans);
}
}
}
差分
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static int a[]=new int[N],b[]=new int[N];
public static void main(String[] args) throws IOException {
int n=cin.nextInt();int m=cin.nextInt();
for(int i=1;i<=n;i++) a[i]=cin.nextInt();
for(int i=1;i<=n;i++) b[i]=a[i]-a[i-1];
while(m-->0){
int l=cin.nextInt(),r=cin.nextInt(),x=cin.nextInt();
b[l]+=x;b[r+1]-=x;
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=b[i];
System.out.print(ans+" ");
}
}
}
二维差分
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static int a[][]=new int[1005][1005],b[][]=new int[1005][1005];
public static void insert(int x1,int y1,int x2,int y2,int c){
b[x1][y1]+=c;
b[x2+1][y1]-=c;
b[x1][y2+1]-=c;
b[x2+1][y2+1]+=c;
}
public static void main(String[] args) throws IOException {
int n=cin.nextInt(),m=cin.nextInt(),q=cin.nextInt();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=cin.nextInt();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
insert(i,j,i,j,a[i][j]);
while(q-->0){
int x1=cin.nextInt(),y1=cin.nextInt(),x2=cin.nextInt(),y2=cin.nextInt(),c=cin.nextInt();
insert(x1,y1,x2,y2,c);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
System.out.print(b[i][j]+" ");
System.out.println();
}
System.out.close();
}
}
/*
3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
1 1 2 2 1
1 3 2 3 2
3 1 3 4 1
*/
双指针
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static int a[]=new int[1005];
public static void main(String[] args) throws IOException {
char s[]=cin.next().toCharArray();
int res=0;
for(int i=0,j=0;i<s.length;i++){
a[s[i]-'0']++;
while(a[s[i]-'0']>1){
a[s[j]-'0']--;
j++;
}
res=Math.max(res,i-j+1);
}
System.out.println(res);
System.out.close();
}
}
统计1的个数
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=1000010;
static int mod=1000000007;
static int a[]=new int[1005];
public static int lowbit(int x){
return x&(-x);
}
public static void main(String[] args) throws IOException {
int n=cin.nextInt();
int res=0;
while(n>0){
n-=lowbit(n);res++;
}
System.out.println(res);
System.out.close();
}
}
离散化求区间和
import java.io.IOException;
import java.util.*;
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=7000010;
static int mod=1000000007;
static int a[]=new int[N],sum[]=new int[N];
static Vector all=new Vector();
static Node add[]=new Node[N],query[]=new Node[N];
public static int unique(Vector a){
int j=0;
for(int i=0;i<a.size();i++){
if(i==0||a.get(i)!=a.get(i-1)){
int tmp=(int)a.get(i);
a.set(j++,tmp);
}
}
while(a.size()!=j) a.remove(j);
return j;
}
public static int find(int x){
int l=0,r=all.size()-1,mid,ans=0;
while(l<=r){
mid=l+r>>1;
if((int)all.get(mid)>=x) {
r=mid-1;ans=mid;
}
else l=mid+1;
}
return ans+1;
}
public static void main(String[] args) throws IOException {
int n=cin.nextInt(),m=cin.nextInt();
for(int i=0;i<n;i++){
int x=cin.nextInt(),c=cin.nextInt();
add[i]=new Node();
add[i].x=x;add[i].y=c;
all.add(x);
}
for(int i=0;i<m;i++){
int l=cin.nextInt(),r=cin.nextInt();
query[i]=new Node();
query[i].x=l;query[i].y=r;
all.add(l);all.add(r);
}
Collections.sort(all);
int len=unique(all);
// 处理插入
for(int i=0;i<n;i++){
int x=find(add[i].x);
a[x]+=add[i].y;
}
// 前缀和
for(int i=1;i<=all.size();i++) sum[i]=sum[i-1]+a[i];
// 查询
for(int i=0;i<m;i++){
int l=find(query[i].x),r=find(query[i].y);
System.out.println(sum[r]-sum[l-1]);
}
System.out.close();
}
}
class Node{
int x,y;
}
/*
3 3
1 2
3 6
7 5
1 3
4 6
7 8
*/
区间合并
public class Main {
static Scanner cin=new Scanner(System.in);
static int N=7000010,mod=1000000007;
static int a[]=new int[N],sum[]=new int[N];
public static void main(String[] args) throws IOException {
int n=cin.nextInt();
List<Node> e=new ArrayList<>();
for(int i=0;i<n;i++){
int st=cin.nextInt(),ed=cin.nextInt();
Node tmp=new Node();tmp.st=st;tmp.ed=ed;
e.add(tmp);
}
Collections.sort(e, new Comparator<Node>() {
@Override
public int compare(Node p1, Node p2) {
if(p1.st==p2.st)
return p1.ed-p2.ed;
return p1.st-p2.st;
}
});
int ans=1,tmp=e.get(0).ed;
for(int i=1;i<e.size();i++){
int st=e.get(i).st,ed=e.get(i).ed;
if(st<=tmp&&ed>tmp) tmp=ed;
else if(tmp<st){
ans++;tmp=ed;
}
}
System.out.println(ans);
System.out.close();
}
}
class Node{
int st,ed;
}