【模板】基础算法&&小算法

来源:互联网 发布:北大青鸟网络培训课程 编辑:程序博客网 时间:2024/05/21 17:20

逆序对:

void msort(ll l,ll r){    if(l == r)return;    else    {        int mid = (l + r) >> 1;        int a = l,b = mid + 1,c = 1;        msort(l,mid);        msort(mid + 1,r);        while(a <= mid && b <= r)        {            if(p[a].y > p[b].y)            {                t[c] = p[b].y;                num += mid - a + 1;                c ++;b ++;            }            else            {                t[c] = p[a].y;                c ++;a ++;            }        }        while(a <= mid)        {            t[c] = p[a].y;            a ++;c ++;        }        while(b <= r)        {            t[c] = p[b].y;            b ++;c ++;        }        for(int i = 1;i <= r - l + 1;i ++)        p[l-1+i].y = t[i];    }   }

尺取法:

void cqf(){     int sum = 0,s = 1,e = 1;          int ans = n + 1;          for(;;)          {              while(e <= n && sum < S)              {                  sum += num[e++];              }              if(sum < S)              {                  break;              }              ans = min(ans ,e - s);              sum -= num[s++];          }  }

高精度 + :

#include<iostream>#include<cstring>#include<cstdio>using namespace std;char a1[505],b1[505];int a[505],b[505],c[505],lena,lenb,lenc;int main(){    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    memset(c,0,sizeof(c));    scanf("%s%s",&a1,&b1);    lena = strlen(a1);    lenb = strlen(b1);    for(int i = 0; i < lena;i ++)        a[lena - i] = a1[i] - '0';    for(int i = 0; i < lenb;i ++)        b[lenb - i] = b1[i] - '0';    lenc = 1;    int x = 0;    while(lenc <= lena || lenc <= lenb)    {        c[lenc] = a[lenc] + b[lenc] + x;        x = c[lenc] / 10;        c[lenc] %= 10;        lenc ++;    }    c[lenc] = x;    if(c[lenc] == 0) lenc --;    for(int i = lenc;i >= 1; i --)    cout << c[i];    return 0;}

高精度 - :

#include<iostream>  #include<string>  using namespace std;  int main()  {      string a,b;      cin>>a>>b;      if (a.size()<b.size()||(a.size()==b.size()&&a<b))  /* 保证a>b */      {          swap(a,b);          cout<<"-";      }      for (int i=1;i<=b.size();i++)      {          a[a.size()-i]=a[a.size()-i]-b[b.size()-i]+'0'; /*从个位减起,每一位简单相减*/      }      for (int i=1;i<=a.size();i++)      {          if (a[a.size()-i]<'0')          /*退位*/            {              a[a.size()-i-1]-=1;              a[a.size()-i]+=10;          }      }      int book;      for (book=0;book<a.size();book++)      /*对没有意义的0的处理*/      {          if(a[book]!='0')  break;      }      for (int i=book;i<a.size();i++)      {          if (a[i]>='0'&&a[i]<='9')                cout<<a[i];      }      return 0;  }

高精度 * :

#include<iostream>#include<cstdio>#include<cstring>using namespace std;char a1[1000],b1[1000];int i,j,lena,lenb,a[1000],b[1000],c[2000];int main(){    scanf("%s%s",&a1,&b1) ;lena = strlen(a1) ;lenb = strlen(b1) ;    for(i = 0;i < lena; i ++)   a[lena - i - 1] =  a1[i] - '0';    for(i = 0;i < lenb; i ++)   b[lenb - i - 1] =  b1[i] - '0';    for(i = 0;i < lenb;i ++)        for(j = 0;j < lena; j++)        {            c[j + i] += b[i] * a[j];        }    for(i = 0;i < lena + lenb ; i ++)    {        if(c[i] >= 10)        {            c[i + 1] += c[i] / 10;            c[i] = c[i] % 10;        }    }    i = lena + lenb - 1;    while(c[i]  == 0 && i != 0)        i--;    for(;i >= 0;i --)        printf("%d",c[i]);    return 0;}
0 0