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

2024/1/19 算法笔记

时间:2024-01-19 22:44:41浏览次数:28  
标签:19 luogu 个数 最大公约数 cin 2024 int 算法 com

题目1:最大公约数的延伸问题

P1414 又是毕业季II - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目上提及了最大公约数,但是解答却没有直接使用最大公约数doge

题目意思是 给定n个数,再给定一个k,往这n个数中取k个,求这k个数的最大公约数是多少?

然后题目的要求是k的取值为1到n全部取一遍,分别求出对应的最大公约数。

我们知道,当取的数的个数越多,最大公约数肯定是小于等于取的个数少时的答案的。因为限制会变多。

一开始很容易想到枚举n个数取k个的所有组合,然后分别用辗转相除法求最大公约数,但是复杂度明显不符合要求,于是必须换一种思路。

我们想到,k个数的公约数含义就是这k个数均含有某个因数,如果我们把所有数的因数全部求出来,发现有k个数均含有某个因数,那么这个数必然是这k个数的公约数。其中找出最大的就是它们的最大公约数。但是要如何高效的做到这点呢?考虑到对于k=1,2……,n都要求出,我们可以这么做:

* 1、 求出每个因数出现的次数。

* 2、 对于每个次数记录最大的因数。

我们在输出答案的时候 选择默契值的最大值t开始往小查找。只要这个默契值的出现次数大于等于当前我们遍历到的人数,就可以认定为它是最大公约数,因为是从大到小遍历的。

于是我们的 做法如下:

void solve(){
    int t = 0;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        t = max(t,x);
        int m = sqrt(x);
        for(int j=1;j<=m;j++){
            if(x%j==0){
                c[j]++;  //c[]用于记录某个因子的出现次数。
                if(x!=j*j) c[x/j]++;
            }
        }
    }
    //输出结果。
    int x= t;
    for(int i=1;i<=n;i++){
        while(c[x]<i)x--;
        cout<<x<<endl;
    }
}   

题目2:前缀和&差分

基础:

前缀和解答区间查询问题:P8218 【深进1.例1】求区间和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

解答:

int a[100005],b[100005];
void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i] = b[i-1]+a[i];   //这里做出前缀和
    }
    int m;
    cin>>m;
    for(int i=1;i<=m;i++){
        int l,r;
        cin>>l>>r;
        cout<<b[r]-b[l-1]<<endl;  //这里记住如何求区间和
    }
}   

前缀和+差分解答多次区间增值问题:P2367 语文成绩 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

解答:

int a[5000005],b[5000005];
void solve(){
    int n,t;
    cin>>n>>t;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i] = a[i]-a[i-1];   //差分数组,事实上是后一项减去前一项的差值。
    }
    for(int i=1;i<=t;i++){
        int l,r,x;
        cin>>l>>r>>x;
        b[l]+=x;
        b[r+1]-=x;            //公式化的区间增值。记住就好,可以画图理解。
    }
    int minn=inf;
    for(int i=1;i<=n;i++){
        a[i] =a[i-1] + b[i];    //这里是差分数组转换为正常数组,也就是前缀和的逆形式。  可以观察和前面差分处理的区别。
        minn = min(a[i],minn);
    }
    cout<<minn<<endl;
}   

拓展:二维前缀和 和 二维差分

P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

int main()
{
	cin>>n>>t;
	while(t--)   //二维差分
	{
		cin>>lx>>ly>>rx>>ry;
		++b[lx][ly];
		--b[rx+1][ly];
		--b[lx][ry+1];
		++b[rx+1][ry+1];
	}
	for(int i=1;i<=n;i++) 
		for(int j=1;j<=n;j++) 
		{
			a[i][j]=b[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1];  //求原数组
			cout<<a[i][j]<<" ";
			if(j==n) cout<<endl;
		}
	return 0;
}

题目3:离散化

暂时没找到专门讲这个的题,后面再补充吧

题目4:滑动窗口

做了一个类似的滑动窗口,不知道是不是,因为这个题归类归到了离散化名下。

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

做法是将距离(struct node中的x)由小到大排序,然后在一个窗口中框住含有每一个不同种类的奶牛,维护距离的最小值,然后处理窗口左边界。

struct node {
    int x,p;
}s[70005];


bool cmp(node a,node b){
    return a.x<b.x;
}

void solve(){
    int n;
    cin>>n;
    map<int,int>t;
    map<int,bool>vis;
    int sum=0;
    for(int i=1;i<=n;i++){
        cin>>s[i].x>>s[i].p;
        if(vis[s[i].p]==0){
            sum++;
            vis[s[i].p] = 1;
        }
    }    
    sort(s+1,s+1+n,cmp);
    int tail = 1;
    t[s[1].p]++;//最左边,第一格
    int tmp = 1;
    int ans = inf;
    //滑动窗口思想
    for(int i=1;i<=n;i++){
        while(tmp<sum&&tail<n){
            tail++;
            t[s[tail].p]++;
            if(t[s[tail].p]==1) tmp++;
        }
        if(tmp == sum) ans = min(ans,s[tail].x - s[i].x);
        t[s[i].p]--;
        if(t[s[i].p] == 0)tmp--;//处理左端   相当于左边界往后挪了一格。
    }
    cout<<ans<<endl;
}   

另外,今日有一场萌新赛,打得很垃圾,5/8。希望这几天能补满。

标签:19,luogu,个数,最大公约数,cin,2024,int,算法,com
From: https://www.cnblogs.com/Akimizuss101/p/17975793

相关文章

  • 2024/1/19 每日一记
    2024/1/19每日一记python文件操作打开分两种方式:open()#分别是文件名(包括路径),对文件的操作方式,编码方式f=open("E:/test.txt","r",encoding="UTF-8")withopen()as变量:withopen("E:/test.txt","r",encoding="UTF-8")asfr......
  • GD动角题解(2024.1.19)
    $upd:$2024.1.19改正了一些错误题目讲解只看第三题若在三角板开始转动的同时,射线\(OC\)也绕点\(O\)以每秒25°的速度逆时针旋转一周,从旋转开始多长时间,射线\(OC\)平分\(∠BOD\)?最重要的一点:动角角度\(=\)初始值\(+\)角度\((vt)\)明确了这一点之后我们看题这题可以分......
  • 1.19
    教练:精彩。距离退役还有2天......
  • 2024年常用的数据恢复软件推荐
    引言:在现代社会中,我们越来越依赖于电子设备来保存和管理我们的个人和工作数据。然而,数据丢失的风险也随之增加。无论是由于误删除、硬件故障还是其他原因,数据丢失对我们造成的损失都是不可忽视的。因此,具备一款可靠的、专业的数据恢复软件是非常有必要的。本文将向大家推荐几款值得......
  • 1.19闲话
    推歌:凉雨/洛天依byCOPY今天中午看了一中午之前买的天依的珍藏色纸,腿看起来肉肉的好想捏一下诶但是非常伤心捏不到呜呜呜图论复习篇?加个字符串吧最短路﹣洛依の(Floyd,最前面的是个负号)这个的名字我比较喜欢,但是复杂度\(O(n^3)\)不太好,所以我想要尝试对其优化原版就是一......
  • 【LGR-172-Div.4】洛谷入门赛 #19 题解
    比赛链接:\(link\)T1分饼干I题目描述洛谷网校举行了期末考试,同学们经过课程的学习,考出了优异的成绩。Z在考试中获得了第一名,yz在考试中获得了第二名,老师决定买一些饼干奖励两名小朋友。老师买了三盒饼干,第一盒有\(a\)块饼干,第二盒有\(b\)块饼干,第三盒有\(c\)块饼干......
  • 南外集训 2024.1.19 T3
    给定正整数\(m,n\)使得\(m|n\),求\([1,n]\cap\mathbbZ\)的所有子集中有多少和是\(m\)的倍数。\(1\leT\le10^4,1\lem\le10^7,1\len\le10^{18}\)相当于求\(F(z)=(1+z^0)(1+z^1)\dots(1+z^{n-1})\)的\(0,m,2m,\dots\)项之和。单位根反演可得\(Ans=......
  • AGC019F Yes or No
    洛谷AT思路先思考最优策略是什么,如果你想尽可能多的对,那么一定是答当前剩的数目最多的答案。比如当前还有\(x\)道\(\text{YES}\),\(y\)道\(\text{NO}\),在\(x>y\)时一定答\(\text{YES}\),\(x<y\)时一定答\(\text{NO}\),\(x=y\)时两者皆可,不妨设他都选\(\text{YES}\)。......
  • 闲话1.19
    摆。上午模拟赛摆了,哈哈,交都没交......
  • 题解 CF1909H
    题意给定一个长度为\(n\)的排列\(p\)。你可以进行不超过\(10^6\)次操作,每次操作是选择一个长度为偶数的区间\([l,r]\),然后交换\((p_l,p_{l+1}),(p_{l+2},p_{l+3}),...,(p_{r-1},p_r)\)。你需要将排列排序。数据范围:\(n\le3\times10^5\)。题解刚才有个群友问我Z......