基础算法
区间合并:
#include <bits/stdc++.h> using namespace std; typedef pair <int,int> pii; vector<pii>pos; void merge(vector<pii>&pos) { vector <pii>ans; sort(pos.begin(),pos.end()); int st=-1e9+10,ed=-1e9+10; for (auto ver:pos) { if (ed<ver.first) { if (st!=-1e9+10)ans.push_back({st,ed}); st=ver.first,ed=ver.second; } else { ed=max(ed,ver.second); } } if (st!=-1e9+10)ans.push_back({st,ed}); pos=ans; } int main() { int n; cin>>n; while (n--) { int l,r; cin>>l>>r; pos.push_back({l,r}); } merge(pos); cout<<pos.size()<<endl; //for (auto ver:pos)cout<<ver.first<<' '<<ver.second<<endl; return 0; }
归并排序
#include <iostream> #include <cstring> #include <algorithm> #include <math.h> using namespace std; typedef long long ll; const int N=1e5+10; ll a[N],tmp[N]; ll cnt; void merge(ll a[],int l,int r) { if (l>=r)return; int mid=l+r>>1; int i=l,j=mid+1; merge(a,l,mid); merge(a,mid+1,r); int hh=0; while (i<=mid&&j<=r) { if (a[i]<=a[j])tmp[hh++]=a[i++]; else { tmp[hh++]=a[j++]; cnt+=(mid-i+1);//当a[i]>a[j]时,i后面所有元素都要比a[j]大,i前面
所有元素都要比a[j]小,所以j的逆序对数量就是i到mid的数量 } } while (i<=mid)tmp[hh++]=a[i++]; while (j<=r)tmp[hh++]=a[j++]; for (int i=l,j=0;i<=r;i++,j++)a[i]=tmp[j]; } signed main() { int n; scanf("%d",&n); for (int i=0;i<n;i++)cin>>a[i]; merge(a,0,n-1); cout<<cnt<<"\n"; return 0; }
二分(整数二分)
#include <iostream> #include <cstring> #include <algorithm> #include <math.h> using namespace std; typedef long long ll; const int N=1e5+10; int a[N]; signed main() { int n,q; scanf("%d%d",&n,&q); for (int i=0;i<n;i++)scanf("%d",&a[i]); while (q--) { int x; scanf("%d",&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)puts("-1 -1"); else { printf("%d ",l); int l=0,r=n-1; while (l<r) { int mid=l+r+1>>1; if (a[mid]<=x)l=mid; else r=mid-1; } printf("%d\n",l); } } return 0; }
高精度除法
#include <iostream> #include <cstring> #include <algorithm> #include <math.h> #include <vector> using namespace std; typedef long long ll; vector<int>div(vector<int>&A,int b,int &r) { vector<int>C; r=0; 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&&C.back()==0)C.pop_back(); return C; } signed 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'); int r; auto C=div(A,b,r); for (int i=C.size()-1;i>=0;i--)printf("%d",C[i]); puts(""); printf("%d\n",r); return 0; }
双指针算法
#include <iostream> #include <algorithm> #include <cstring> #include <math.h> using namespace std; typedef long long ll; const int N=1e5+10; signed main() { string s; getline(cin,s); int len=s.size(); for (int i=0;i<len;i++) { int j=i; while (j<len&&s[j]!=' ')j++; for (int k=i;k<=j;k++)cout<<s[k]; puts(""); i=j; } return 0; }

浙公网安备 33010602011771号