算法笔记

发布时间 2023-04-03 17:00:12作者: 96痴呆敲码

笔记仅为个人总结模板和理解。。。

快速幂:

    while (n) //n为多少次方{
        if (n & 1)
            k = k * x % mod;
        n >>= 1;
        x = x * x % mod;
    }
    return k ;
}

 

差分:

    for(int i=1;i<=n;i++)
    {
        int t,c;
        cin>>t>>c;
        int l=max(0,t-k-c+1);
        int r=max(0,t-k);
        s[l]++;
        s[r+1]--;
    }
    for(int i=1;i<=200010;i++)s[i]+=s[i-1];

“差分是前缀和的逆运算”,只是感觉是有点像,可能还得再理解理解

筛质数:

bool finds(int n)
{
    if(n<=1)return false;
    for(int i=2;i<=n/i;i++)
    {
        if(n%i==0)
        return false;
    }
    return true;
}

发现这种筛质数方法好像更节约时间

dfs(深度优先搜索)/bfs(广度优先搜索):

    for(int i=0;i<4;i++)
    {
        int tx=x+dx[i];
        int ty=y+dy[i];
        if(tx>0&&ty>0&&tx<=n&&ty<=m&&!maps[tx][ty])
        {
            maps[tx][ty]=1;
            dfs(tx,ty);
            maps[tx][ty]=0;//应对路径进行回溯
        }
    }

搜索中,部分题需要回溯;以及部分题不需要重开标记数组,直接在原数组上修改即可

邻接表:

  vector<ll>v[100010];//多维数组,邻接表的初始化
    for(int i=1;i<n;i++)
    {
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
 int dfs(int step,int t)//邻接表的遍历
{
    if(a[step])t++;
    else t=0;
    if(t>m||vis[step])return 0;
    vis[step]=1;
    int ans=0;
     if (step > 1 && v[step].size() == 1) return 1;
    for(int i=0;i<v[step].size();i++)
    {
        ans+=dfs(v[step][i],t);
    }
    return ans;
}

进制转换:

string s;//十转高进制
char a[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 65, 66, 67, 68, 69, 70};
int main() {
    ll n;
    cin >> n;
    while (n) {
        s = s + a[n % 16];
        n /= 16;
    }
cout<<s;

并查集:

   while(n--)p[n]=n;//初始化
。。。。。。。。。//缺少并的过程
  int find(int x)//查找
{
    if(p[x]!=x)p[x]=find(p[x]);//其中x为子节点,f[x]为父亲节点;
    return p[x];
}

记录不同斜率直线数量(避免爆精度)

                  map<pair<int,int>,int>maps;//初始化,建立map容器存储分子分母
        pair<int,int>ans;//以下为核心代码
        ans.first=k1/gcd(k1,k2);//利用欧几里得算法求最简形式
        ans.second=k2/gcd(k1,k2);
        if(maps[ans]==0)
        {
            maps[ans]=5;
            res++;
        }

哈希:

unordered_map<char,int>mp;//初始化
    char ch;//和谐算法
    ll ans=0;
    while(cin>>ch)
    {
        mp[ch]++;
    }
    for(int i='0';i<='9';i++)
    {
        ans+=(ll)mp[i]*mp[i];
    }
    cout<<ans;

杂类算法及注释:

1.vector中pair的排序

vector<pair<int ,int> >v;
sort(v.begin(),v.end());//排序以v.first为准

2.

#include <iostream>
#include<algorithm>
using namespace std;
 
int main(int argc, char** argv) {
    int a[4]={1,2,3,4};
    sort(a,a+4);
    do{
        //cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
        for(int i=0;i<4;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a,a+4));
    return 0;
}

3.注意

t*=k%mod不等于t=t*k%mod;

=========================================================

更新中,未完全搬运。。。大概率不会更新太久(懒),权当复习