基础算法

区间合并:

#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;
}

 

posted @ 2022-04-29 18:51  好腻友Π  阅读(24)  评论(0)    收藏  举报