首页 > 编程语言 >2024/1/14 算法笔记

2024/1/14 算法笔记

时间:2024-01-14 22:57:23浏览次数:39  
标签:直线 14 int 2024 算法 b0 b1 交点 gcd

1. 图论的反向建边

一般问题:有向图的多个起点到一个终点的最短距离 是最短路的变式。

我们只需要把图的箭头反向(正向变逆向,逆向变正向)

矩阵: mp[u,v] = cost ---->mp[v,u] = cost
邻接表也是类似的方法

[P2853 USACO06DEC] Cow Picnic S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这里为什么要反向建边,因为我们要牧场去找牛,相反的,我们可以让含有牛的牧场去找牧场。

2. DAG图的求点1到点n两点之间的最长路

关键问题是可能不止有点1是入度为0的点。如果不删除这些点,我们无法做到通过删点边的方式来求到1到n的路径。所以应该先遍历一次从点2到点n的入度为0的点找到那些点,再把延伸出来的点的入度 −1,如果这些点入读 −1后又变成了入度为 0 的点,那么再做同样的处理。至于一个点的最长路的转移方程就是:
max{入度1+相应的边,入度2+相应的边……入度n加相应的边} 类似于dijkstra的更新距离操作。

vector<int>g[1505];
vector<int>d[1505];
queue<int>q;
int v[1505];//存最长路
int n,m;
int ru[1505];

void solve(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v,val;
        cin>>u>>v>>val;
        g[u].eb(v);
        d[u].eb(val);
        ru[v]++;
    }

    for(int i=2;i<=n;i++){
        v[i] = -inf;
        if(!ru[i]) q.push(i);
    }

    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int i=0;i<g[x].size();i++){
            if(!(--ru[g[x][i]])) q.push(g[x][i]);
        }
    }

    q.push(1);
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(int i=0;i<g[x].size();i++){
            if(v[g[x][i]]<v[x]+d[x][i]) v[g[x][i]] = v[x]+d[x][i];
            if(!(--ru[g[x][i]])) q.push(g[x][i]);
        }
    }

    if(v[n] == -inf) cout<<"-1"<<endl;
    else cout<<v[n]<<endl;
}

3. m条直线交点(三点不重合)的情况数计算

n=4 的情况:

1)4 条直线全部平行,则 0 交点 { =4*(4-4)}。

2)其中 3 条直线平行,则 3 交点 { =3*(4-3) }。

3)其中 2 条直线平行,则这2条直线与另2条直线的交点数为4,而另2条直线之间可能有0个或1个交点(见 n=2 的情况,共 4 个交点或 5 个交点。{=2*(4-2)+0 或 1 }

4)4 条直线均不平行(可看成 1 条直线平行),这 1 条直线与其它 3 条直线的交点数为 3,而其 它 3 条直线之间的交点数为 3,共 6 个交点。{ =1*(4-1)+3 }

结论:m 条直线的交点方案=r 条平行线与(m-r)条直线交叉的交点数+(m-r)条直线本身的交点方案

=r*(m-r)+(m-r)条直线本身的交点方案 (1<=r<=m)

  • 写成递归程序
void g(int n,int k){  //交点数k   n是平行线数量
    if(n==0) {f[k]=1;maxn = max(maxn,k);}
    else {
        for(int r=n;r>=1;r--){
            g(n-r,(n-r)*r+k);
        }
    }
}

4. 最大公约数,最小公倍数的一些结论

  1. 求gcd() , 方法一是直接调用c++的库中的gcd函数。方法二:
ull gcd(ull a, ull b)
{
    return b == 0 ? a : gcd(b, a % b);
}
  1. 求lcm(),方法是a*b/gcd(a,b)
ull lcm(ull a, ull b)
{
    return a / gcd(a, b) * b;  //这样写是防止a*b溢出。
}
  1. 一些固有知识:gcd(x,a0) = a1 ---> gcd(x/a1 , a0/a1) = 1 暂且叫它为结论p

    lcm(x,b0) = b1 = x*b0/gcd(x,b0)

    使用结论p我们可以得到:gcd(x , b0) = x*b0/b1 ----> gcd(b1/b0 , b1/x) = 1 结论q

    用心体会这两个式子,你会发现x是a1的整数倍而且是b1的因子

    如果我们知道a0,a1,b0,b1想要求x的个数,我们可以遍历1~sqrt(b1) 找到能整除的数,且满足结论p和结论q,就能找到x的情况了。

    int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
    
    int a0,a1,b0,b1;
    void solve(){
        int t;
        cin>>t;
        while(t--){
            cin>>a0>>a1>>b0>>b1;
            int p = a0/a1;
            int q = b1/b0;
            int cnt = 0;
            for(int i=1;i*i<=b1;i++){
                if(b1%i==0){
                    if(i%a1==0&&gcd(i/a1,p)==1 && gcd(q,b1/i)==1) cnt++;
                    int j = b1/i;
                    if(i==j) continue;
                    if(j%a1==0&&gcd(j/a1,p)==1&& gcd(q,b1/j)==1) cnt++;
                }
            }
            cout<<cnt<<endl;
        }
    }
    

标签:直线,14,int,2024,算法,b0,b1,交点,gcd
From: https://www.cnblogs.com/Akimizuss101/p/17964361

相关文章

  • 【愚公系列】2024年01月 WPF控件专题 ProgressBar控件详解
    ......
  • 1.14寒假每日总结5
    小型物联网应用系统设计图(模拟器上截图)   (2)简述实现过程中的相关步骤及配置各设备配置如下:接入交换机:划分vlan,将终端连接接口划到相应vlan中,开启生成树,开启dhcpsnooping。核心交换机:划分vlan,将设备连接接口修改为trunk接口模式。无线路由器:接口配置ip地址、掩码和......
  • 闲话1.14
    哎呀今天颓废了一天。上午还不是很敢颓废,写了一两个SAM题吧......
  • 20240113-力扣704二分查找
    leetcode链接:https://leetcode.cn/problems/binary-search/solutions/980494/er-fen-cha-zhao-by-leetcode-solution-f0xw/代码随想录链接:https://programmercarl.com/0704.二分查找.html#算法公开课考点:二分查找解决代码:classSolution{publicintsearch(int[]num......
  • 南外集训 2024.1.12 T3/AGC022F Checkers 加强版
    第一步转化比较套路,DP设计需要很强的洞察力,最后的优化也很考验基本功。有\(n\)个\(n\)维空间中的点,第\(i\)个点\(x_i\)满足\(x_{i,i}=1,x_{i,j}=0(\foralli\neqj)\)。接下来进行\(n-1\)次操作,每次任选两个点,将第一个点关于第二个点对称,然后删掉第二个点。......
  • 1.14闲话
    感觉近期接近神话的都神话了,现在中V里貌似没有几个接近神话的了,所以稔就直接用大量的联动去大力推歌行四方来机械降神了是吧推歌:降临宇宙/洛天依by索尼音乐当时第一遍看的时候最开始看到染成黑色的十周年的模型其实挺蒙的,但是十周年的模型确实好看,后面拿出电吉他那一刻其实挺......
  • C++U6-02-最短路算法1-dijkstra迪杰斯特拉最短路径
    学习目标 最短路径的基本概念  练习1 最短路的定义 本节课迪杰斯特拉dijkstra最短路算法 算法流程:以下是Dijkstra最短路径算法的逐步计算松弛的过程:初始化起始节点的距离为0,其他节点的距离为无穷大。选择当前距离最小且未被访问的节点作为当前节点。......
  • 1.14学习进度
    1.executor和container01.Spark中的executor进程是跑在container中,所以container的最大内存会直接影响到executor的最大可用内存02.yarn.nodemanager.pmem-check-enabled该参数默认是true,也就是会由它来控制监控container的内存使用03.yarn.scheduler.maximum-allocation......
  • 本周(2024.1.8-2024.1.14)C语言学习小结
    既然之前说了要尝试坚持写博客,那就试试吧。本周花在C语言上的时间不多,简要回顾一下。动态数组学习并实践了基本的动态数组知识,即calloc、malloc、relloc、free。以下是基本综合所学内容写的代码,实现动态数据添加。#include<stdio.h>#include<stdlib.h>intmain(){......
  • 1.14
    霍金奔向萝莉岛。昨天放假了,玩了3个小时手机,rks+=0.01。在机房留下卫生纸就意味着抛弃它。推歌テリトリーバトル-ツユ听起来很好听可是歌词很悲伤啊。没搞到歌词,输。没有学科学术。没有学术。快期末考试了,所以根据一些人的要求,以后好像不能来机房了,输。期......