牛客小白月赛101(栈、差分、调和级数、滑动窗口)

news2024/9/21 0:24:56

文章目录

  • 牛客小白月赛101(栈、差分、调和级数、滑动窗口)
    • A. tb的区间问题
    • B. tb的字符串问题(栈)
    • C. tb的路径问题(思维)
    • D. tb的平方问题(差分)
    • E. tb的数数问题(调和级数)
    • F. tb的排列问题(滑动窗口)

牛客小白月赛101(栈、差分、调和级数、滑动窗口)


A. tb的区间问题

维护连续 (n-k)个元素的sum,取max即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 1e5 + 5;

ll a[maxn];

int main(){
	
	int n, k;
	cin >> n >> k;	
	for(int i = 1; i <= n; i++) cin >> a[i];
    ll sum = 0;
	for(int i = 1; i <= n-k; i++) sum += a[i];
    
    ll res = sum;
    for(int i = 1; i <= k; i++){
        sum -= a[i];
        sum += a[n-(k-i)];
        res = max(res, sum);
    }
    
    cout << res << endl;
	
	return 0;
}

B. tb的字符串问题(栈)

考虑需要不断弹出已经遍历部分子串的尾部,使用栈维护即可。

#include<bits/stdc++.h>
using namespace std;

int main(){
	
	int n;
	cin >> n;
	string s;
	cin >> s;
	
	stack<char> st;
	for(auto c : s){
		if(c == 'c'){
			if(!st.empty() && st.top() == 'f') st.pop();
			else st.push(c);
		}
		else if(c == 'b'){
			if(!st.empty() && st.top() == 't') st.pop();
			else st.push(c);
		}
		else st.push(c);
	}
	
    cout << st.size() << endl;
	
	return 0;
}

C. tb的路径问题(思维)

打表:

1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
1  2  1  2  1  2  1  2  1  2  1  2  1  2  1
1  1  3  1  1  3  1  1  3  1  1  3  1  1  3
1  2  1  4  1  2  1  4  1  2  1  4  1  2  1
1  1  1  1  5  1  1  1  1  5  1  1  1  1  5
1  2  3  2  1  6  1  2  3  2  1  6  1  2  3
1  1  1  1  1  1  7  1  1  1  1  1  1  7  1
1  2  1  4  1  2  1  8  1  2  1  4  1  2  1
1  1  3  1  1  3  1  1  9  1  1  3  1  1  3
1  2  1  2  5  2  1  2  1  10 1  2  1  2  5
1  1  1  1  1  1  1  1  1  1  11 1  1  1  1
1  2  3  4  1  6  1  4  3  2  1  12 1  2  3
1  1  1  1  1  1  1  1  1  1  1  1  13 1  1
1  2  1  2  1  2  7  2  1  2  1  2  1  14 1
1  1  3  1  5  3  1  1  3  5  1  3  1  1  15

可以发现,当 n 比较大时一定存在如下路径,

  • n % 2 = 0时:起点 -> 1 —> 2 —> 2(传送) —> 1 - > n
  • n % 2 = 1时:起点 -> 1 —> 2 —> 2(传送,上一个偶数行的2) —> 1 or 3 —> 1 —> 1 —> n
#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 1e5 + 5;

int gcd(int x, int y){
	if(y) return gcd(y, x%y);
	return x;
}

void func(){ // 打表用
	int n = 15;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			printf("%-3d", gcd(i, j));
		}
		printf("\n");
	}
}

int main(){
	
	int n;
    cin >> n;
    if(n == 1) cout << 0 << endl;
    else if(n == 2) cout << 2 << endl;
    else if(n == 3) cout << 4 << endl;
    else if(n % 2 == 0) cout << 4 << endl;
    else cout << 6 << endl;
    
	return 0;
}

D. tb的平方问题(差分)

n 比较小,枚举每个区间(l,r),如果区间元素sum为完全平方数,则 l 到 r 之间每个位置多一个完全平方数,用差分维护即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 1e5 + 5;

ll a[maxn], v[maxn];

map<int, int> POS;

int main(){
	
	for(int i = 1; i <= 1e4; i++) POS[i*i] = i;
	
	int n, q;
	cin >> n >> q;
	for(int i = 1; i <= n; i++) cin >> a[i];
	
	for(int i = 1; i <= n; i++){
		int sum = 0;
		for(int j = i; j <= n; j++){
			sum += a[j];
			if(POS[sum] != 0){
				v[i]++;
				v[j+1]--;
			}
		}
	}
	
	for(int i = 1; i <= n; i++) v[i] += v[i-1];
	
	while(q--){
		int x;
		cin >> x;
		cout << v[x] << endl;
	}
			
	return 0;
}

E. tb的数数问题(调和级数)

根据题意,好的数字不会超过 m a x ( a i ) , i ∈ ( 1 , n ) max(a_i), i\in(1,n) max(ai),i(1,n)

直接枚举每个数的约数的个数,再判断与数组a能提供的约数的个数是否一致即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn = 2e6 + 5;

int a[maxn], v[maxn], f[maxn];

int main(){
	
	int n;
    scanf("%d", &n);
	for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    
    sort(a+1, a+1+n);
    
	for(int i = 1; i <= n; i++){ 	// 判断 a 中元素能提供的约数个数
        if(a[i] != a[i-1]){
            int num = a[i];
            while(num <= 1e6){
                v[num]++;
                num += a[i];
            }
        }
    }
    
    int res = 0;
    for(int i = 1; i <= 1e6; i++){	// 判断 i 需要的约数个数,调和级数,时间复杂度O(n*log(n))
        int num = i;
        while(num <= 1e6){
            v[num]--;
            num += i;
        }
        if(v[i] == 0) res++;	// 为零则一致
    }
    
	printf("%d", res);
				
	return 0;
}

F. tb的排列问题(滑动窗口)

从左到右枚举 i , i ∈ [ 1 , n ] i,i \in [1,n] ii[1,n],维护 [ i , i + w + 1 ] [i, i+w+1] [i,i+w+1] 这个区间中,-1的个数和已知位置的元素。

对于每一次枚举,称 [ i , i + w + 1 ] [i, i+w+1] [i,i+w+1] 为当前窗口。
令当前方案数用res表示,有以下几种情况:

  • b[i] 位置未知:

    • 当前窗口有-1:则可以用当前窗口中任意一个-1变换为 b[i],让 a[i] 与之交换。res = res * 当前-1的个数。

      注意,如果此时的 a[i] != -1 的话,交换后,可以理解为 a[i] 被放到了下一个窗口中。
      
    • 当前窗口没有-1 :res = 0。

  • b[i] 位置已知:

    • b[i] 在当前窗口中,直接交换,res不变
    • b[i] 不在当前窗口中,不能交换得到,且不能使用-1,res = 0
#include<bits/stdc++.h>
#define ll long long
using namespace std;

const ll mod = 998244353;
const int maxn = 2e6 + 5;

int a[maxn], b[maxn];
int v[maxn], pos[maxn];

int main(){
	
	int ncase;
	cin >> ncase;
	
	while(ncase--){
		int n, w;
		cin >> n >> w;
		for(int i = 1; i <= n; i++) cin >> a[i];
		for(int i = 1; i <= n; i++) cin >> b[i];
		
		for(int i = 1; i <= n; i++) if(a[i] != -1) pos[a[i]] = i; 	// 所有已知的数的位置 
		
		int count = 0;
		for(int i = 1; i <= w; i++){ 	// 先维护 1 到 w 
			if(a[i] == -1) count++;
			else v[a[i]] = 1;
		}
		
		ll res = 1;
		for(int i = 1; i <= n; i++){
            if(i+w <= n){
            	if(a[i+w] == -1) count++; 
            	else v[a[i+w]] = 1;
			} 
			if(pos[b[i]]){	// b[i]位置已知 
				if(v[b[i]] == 0) res = 0;	// b[i] 不在【i,i+w+1】之间,不能交换得来
				else v[b[i]] = 0; 			// b[i] 在【i,i+w+1】之间,交换到该位置 
			}
			else{			// b[i]位置未知 
				if(count){  
					// 还有-1,则可以用当前位置的数,与任意的一个-1交换,方案数 * count 
					res = res * count % mod;
					count--;
				}
				else{	
					// -1不够用,res = 0 
					res = 0;
				} 
			}
		}
		cout << res << endl;
		for(int i = 1; i <= n; i++) if(a[i] != -1) v[a[i]] = pos[a[i]] = 0;
	}
					
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑灵服务端源码(c#版本+数据库+配套客户端+服务端)

剑灵服务端源码&#xff0c;喜欢的下载研究研究。谁技术牛B的话&#xff0c;能把最新版本的客户端接上&#xff0c;就好了。 剑灵服务端源码&#xff08;c#版本数据库配套客户端服务端&#xff09; 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】剑灵服务端源码…

利士策分享,自我和解:通往赚钱与内心富足的和谐之道

利士策分享&#xff0c;自我和解&#xff1a;通往赚钱与内心富足的和谐之道 在这个快节奏、高压力的时代&#xff0c;我们往往在追求物质财富的同时&#xff0c;忽略了内心世界的和谐与平衡。 赚钱&#xff0c;作为现代生活中不可或缺的一部分&#xff0c;它不仅仅是生存的手段…

YOLOv8改进 - 注意力篇 - 引入ECA注意力机制

一、本文介绍 作为入门性第一篇&#xff0c;这里介绍了ECA注意力在YOLOv8中的使用。包含ECA原理分析&#xff0c;ECA的代码、ECA的使用方法、以及添加以后的yaml文件及运行记录。 二、ECA原理分析 ECA官方论文地址&#xff1a;ECA文章 ECA的pytorch版代码&#xff1a;ECA的…

C++第十一节课 new和delete

一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数&#xff08;new会自动调用构造函数&#xff1b;delete会调用析构函数&#xff09; class A { public:A(int a 0): _a(a){cout <&l…

systemd学习

传统init进程启动流程 kernel内核代码init/main.c&#xff0c;内核启动init进程过程&#xff1a; init进程是由内核启动的第一个&#xff08;也是唯一的一个&#xff09;用户进程&#xff08;进程id为1&#xff09;&#xff0c;它根据配置文件决定启动哪些程序&#xff0c;ini…

mybatisplus的多记录操作 批量删除和批量查询

1.批量查询 通过in查询 Testpublic void testBatchSelectByIds(){List<Integer> ids Arrays.asList(5,7);List<User> users userMapper.selectBatchIds(ids);log.info(users);} 2.批量删除 Testpublic void testBatchDelete(){List<Integer> ids Arrays…

LLM - 理解 多模态大语言模型(MLLM) 的 指令微调(Instruction-Tuning) 与相关技术 (四)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142237871 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

Java知识点小结3:内存回收

文章目录 对象引用强引用软引用&#xff08;SoftReference&#xff09;弱引用&#xff08;WeakReference&#xff09;考一考 虚引用&#xff08;PhantomReference&#xff09;总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…

Vue学习记录之六(组件实战及BEM框架了解)

一、BEM BEM是一种前端开发中常用的命名约定&#xff0c;主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block&#xff08;块&#xff09;&#xff1a;独立的功能性页面组件&#xff0c;可以是一个简单的按钮&#xff0c;一个复杂的导航条&…

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module&#xff0c;Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G&#xff0c;不建议复现

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

功耗中30分钟下载场景对平均电流标准的影响评估

下载场景的测试数据: 测试结论:相同场景下,有应用下载安装跟没应用下载安装,平均电流相差90-140mA左右 查看数据:下载场景的平均增量电流 (227+279) / 2 - 136 = 117 mA 理论的量化数据影响 根据当前的测试数据:静置待机平均电流 136 mA,下载场景平均电流增量 117mA, …

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

电气自动化入门05:三相异步电动机的正反转点动控制电路

视频链接&#xff1a;3.2 电工知识&#xff1a;三相异步电动机的正反转点动控制电路_1_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.断路器及其选型 1.1断路器定义、分类、表示符号 1.2.断路器功能、…

Vision Transform—用于大规模图像分类的Transformers架构

VIT — 用于大规模图像识别的 Transformer 论文题目&#xff1a;AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码&#xff1a;https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer&#xff08;ViT&…

虚拟机vaware中cpu设置跑满大核

首先&#xff0c;大核速度快&#xff0c;并且在资源紧张时大核优先&#xff0c;小核甚至是闲着围观大核跑满。其次&#xff0c;遇到经常切换操作虚拟机和win11的使用场景&#xff0c;切换核心本身也会造成一点卡顿&#xff0c;降低虚拟机里操作流畅度。另外&#xff0c;13代在你…

【linux】4张卡,坏了1张,怎么办?

先禁用这张卡 grub 禁用&#xff0c;防止加载驱动 禁用这张卡的 PCI # 禁用 PCI 设备 0000:b1:00.0 (NVIDIA GPU) ACTION"add", SUBSYSTEM"pci", ATTR{vendor}"0x10de", KERNELS"0000:b1:00.0", RUN"/bin/sh -c echo 0000:b1:00…

vue part 10

vue-resource 在vue1.0时代讲的比较多&#xff0c;是vue.插件库&#xff0c; import vueResource from vue-resourceVue.use(vueResource) 在vc和vm中会多出如下F12代码即&#xff0c;$http:() 他的用法和返回值和axios一模一样&#xff0c;但是不常维护了 插槽 默认插槽 …

11年计算机考研408-数据结构

设执行了k次。 解析&#xff1a; d要第一个出&#xff0c;那么abc先入栈&#xff0c;d入栈然后再出栈&#xff0c;这前面是一个固定的流程&#xff0c;后面就很灵活了&#xff0c;可以ecba&#xff0c;ceba&#xff0c;cbea&#xff0c;cbae。 答案是4个序列。 解析&#xff1a…

解决redis缓存击穿问题之布隆过滤器

布隆过滤器 1. 什么是布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是一个空间效率很高的数据结构&#xff0c;用于判断一个元素是否在一个集合中。布隆过滤器的核心思想是利用位数组和一系列随机映射函数&#xff08;哈希函数&#xff09;来快速判断某个元素是…