信息工程大学第五届超越杯程序设计竞赛 题解

信息工程大学第五届超越杯程序设计竞赛 \huge{信息工程大学第五届超越杯程序设计竞赛} 信息工程大学第五届超越杯程序设计竞赛

写在前面

本篇题解按照题目难易顺序进行排序

大致难易顺序为:A<M<F<D<C<E<G<K<H<B<I<J

A. 遗失的旋律

这道题其实不是一道签到题,但是数据范围太水了比较友好(可能是为了适应校赛难度),暴力就可以过,所以就成了一道签到题。

题意

给定一个长度为 n n n 01 01 01 s s s,代表两种操作:

  1. 0 0 0代表:x++;
  2. 1 1 1代表:x *= 2;

然后给定m次询问,对应两种情况:

  1. o p   y op~ y op y:翻转 s [ y ] s[y] s[y]
  2. o p   x   l   r op~ x~ l~ r op x l r x x x为初始值,执行 s [ l , r ] s[l,r] s[l,r]区间的操作,并返回结果。

思路

暴力…

标程

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

const int N = 1e6+5;
int mod = 998244353;

void solve() {
	int n,m; cin >> n >> m;
	string s; cin >> s;
    int res = 0, le = 0, re = 0;
    
    while(m -- ) {
        int op; cin >> op;
        if(op == 1) {
            int y; cin >> y; y --;
            if(s[y] == '1') s[y] = '0';
            else s[y] = '1';
        } else {
            int x, l, r; cin >> x >> l >> r;
            l --,r --;
            for(int i = l ; i <= r; i++) {
                if(s[i] == '0') x += 1;
                else x = x * 2;
                x = x % mod;
            }
            cout << x << endl;
        }
    }
}

signed main (void) {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T = 1;
// 	cin >> T;
	while(T--) solve();
	return 0;
 }

M. Monika’s game

题意

给定一个整数 x x x,然后可以操作若干次,每次可以将 x x x拆分为不为零的两个数,然后总分会加上拆分的较大数,求最多能加多少分

思路

每次都将 x x x拆分为 1 1 1 x − 1 x-1 x1,结果为: 1 + 2 + 3... + n − 1 = n × n − 1 2 1+2+3...+n-1=n\times\frac{n-1}{2} 1+2+3...+n1=n×2n1

标程

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

void solve()
{
	int n; cin >> n;
	n --;
	cout << (n * n + n) / 2 << '\n';
}

signed main (void) {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T = 1; 
    cin >> T;
	while(T--) solve();
	return 0;
 } 

F. 不规则的轮回

题意

给定 n n n 个数对,对于每个数对$ (x,y) $会持续执行以下操作直到 x = y x=y x=y

  1. x > y x > y x>y 时, x = x − y x = x - y x=xy
  2. x < y x < y x<y 时, y = y − x y = y - x y=yx

同时有 q 次询问,每次给定一个数对 x q , y q x_q,y_q xq,yq​, 问上述给定的 n 个数对的执行过程中出现了 x q , y q xq,yq xq,yq 的次数。

思路

模拟,然后用一个二维数组记录,然后 O ( 1 ) O(1) O(1)查询。

标程

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
using namespace std;
const int mod=1000000;
const int N = 1e4+5;
int a[N],b[N],c[N][N];
void solve() {
	int n,m,l,r; cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i]>>b[i]; 
	for(int i=1;i<=n;i++){
		int aa=a[i],bb=b[i];
		c[aa][bb]++;
        while(aa!=bb){
			if(aa>bb){
                aa -= bb;
			}else if(aa<bb){
                bb-=aa;
            }
            c[aa][bb]++;
		}
	}
	cin>>m;
	while(m--){
		cin>>l>>r;
		cout<<c[l][r]<<endl;
	}
	return ;
}
signed main (void)
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int T = 1;
	//cin >> T;
	while(T--) solve();
	return 0;
 } 

D. 实验室有多少人

题意

给出 n n n次记录,每次记录有两个数组 a , b a,b a,b,代表当前有一个人从 a a a时刻来, b b b时刻离开;求实验室最多有多少人。

1 ≤ n ≤ 1 × 1 0 6 1\le n\le 1\times10^6 1n1×106 1 ≤ x , y ≤ 1 × 1 0 9 1\le x,y\le 1\times10^9 1x,y1×109

思路

跟据数据范围,这道题如果采用差分标记区间的方法,必然会导致超时。

跟据 n n n的范围,我们考虑在 O ( n l o g n )   o r   O ( n ) O(nlogn)~or~ O(n) O(nlogn) or O(n)的时间复杂度解决。

n n n组数分别有 n n n个数字代表某个人在当前时刻来, n n n个数字代表这个人在当前时刻离开。

因此我们需要将这 2 n 2n 2n个数字存起来,排序,然后遍历并记录最多人数。

关键在于排序:按照时间升序排列,相同时间来的人排在前面。

标程

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

const int N = 1e6+5;
int arr[N];
#define PII pair<int, int>

bool cmp(PII n1, PII n2) {
    if(n1.first == n2.first) return n1.second < n2.second;
        return n1.first < n2.first;
}

void solve() {
	int n; cin >> n;
    vector<PII> a;
    for(int i = 1; i <= n; i ++ ) {
        int x, y; cin >> x >> y;
        a.push_back({x, 1});
        a.push_back({y, 2});
    }
    sort(a.begin(), a.end(), cmp);
    
    int mx = 0, x = 0;
    for(PII n1 : a) {
        if(n1.second == 1) x ++;
        else x --;
        mx = max(mx, x);
    }
    
    cout << mx << endl;
}

signed main (void) {
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int T = 1;
//	cin >> T;
	while(T--)solve();
	return 0;
 } 

C. 财政大臣

题意

给出一棵有 n n n个节点的树( 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n),父节点的变化将会影响所有子节点,然后给出父节点的变化,求最后所有节点的值。每个节点都给的有初始值,然后根节点为 1 1 1

思路

跟据题意可知,每个节点的结果都是:父节点带来的变化+自身的变化+自身的初始值

因此我们将所有变化用数组存起来,然后遍历整棵树,计算变化值,最后输出时加上初始值。

标程

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

const int N = 1e5+5;
vector<int> a[N];
int b[N], c[N];	//b数组记录初始值,c数组记录变化值

void bianli(int x) {
    if(a[x].empty()) return;
    for(auto i : a[x]) {
        c[i] += c[x];
        bianli(i);
    }
}

void solve() {
	int n, m; cin >> n >> m;
    for(int i = 1; i < n; i ++ ) {
        int x, y; cin >> x >> y;
        a[x].push_back(y);
    }
    for(int i = 1; i <= n; i ++ ) cin >> b[i];
    
    while(m -- ) {
        int op, x, y; cin >> op >> x >> y;
        if(op == 1) c[x] += y; 
        else c[x] -= y; 
    }
    bianli(1);
    
    for(int i = 1; i <= n; i ++ ) 
        cout << b[i] + c[i] << " \n"[i == n]; 
}

signed main (void) {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T = 1;
// 	cin >> T;
	while(T--) solve();
	return 0;
}

E. 在雾中寻宁静

题意

给出一棵有 n n n个节点的树( 1 , 2 , 3 , . . . , n 1,2,3,...,n 1,2,3,...,n),然后给节点染色,同时该节点的子节点都会染成该颜色。最后输出每个节点的颜色。每个节点的初始颜色为 0 0 0,然后根节点为 1 1 1

思路

与F题类似,本题需注意前面染的颜色可能会被后面的颜色覆盖。因此本题只需在记录染色操作时记录下先后顺序,记录顺序也非常简单,用二元组。

标程

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

const int N = 2e5+5;
vector<int> a[N];
pair<int, int> c[N];

void bianli(int x) {
    if(a[x].empty()) return;
    for(auto i : a[x]) {
        if(c[i].second < c[x].second) //判断是否再此之后染色
            c[i] = c[x];
        bianli(i);
    }
}

void solve() {
	int n; cin >> n;
    for(int i = 1; i < n; i ++ ) {
        int x; cin >> x;
        a[x].push_back(i + 1);
    }
    int m; cin >> m;
    for(int i = 1; i <= m; i ++ ) {
        int x, y; cin >> x >> y;
        c[x].first = y;
        c[x].second = i;	//记录顺序
    }
    bianli(1);
    
    for(int i = 1; i <= n; i ++ ) 
        cout << c[i].first << " \n"[i == n]; 
}

signed main (void) {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T = 1;
// 	cin >> T;
	while(T--) solve();
	return 0;
}

G.完美数字

题意

给定 n , k n,k n,k,然后给出 n n n个整数,要求计算 n n n个整数中,乘积尾数有 k k k个以上的 0 0 0 的序列区间个数。

思路

首先,我们需要知道一串数中序列乘积有几个0,这是怎么计算的?

我们发现,所有乘积尾数中包含0的数中,其因子必然有2和5

因此,我们需要统计序列中每个数字是由多少个 2 2 2和多少个 5 5 5相乘得到。

由于下面要求区间是否符合条件,我们可以将 2 2 2 5 5 5的个数用前缀和维护。

那么,区间中所有数相乘后尾数 0 0 0的个数即为: m i n ( s u m 2 , s u m 5 ) min(sum_2, sum_5) min(sum2,sum5)

最后,若当前区间符合条件,那么当前区间继续延申当然也符合条件。

标程

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

const int N = 2e5 + 5;
int a[N], a2[N], a5[N],b2[N],b5[N];

void check(int x,int i) {
    int t = x;
    while(t % 2 == 0) t /= 2, a2[i] ++;
    t = x;
    while(t % 5 == 0) t /= 5, a5[i]++;
}

void solve()
{
	int n, k; cin >> n >> k;
    for(int i = 1; i <= n; i ++ ) {
        cin >> a[i];
        check(a[i],i);
    }
    
    for(int i = 1; i <= n; i ++ ) {
        b2[i] = b2[i-1] + a2[i];
        b5[i] = b5[i-1] + a5[i];
    }
    
    int res = 0;
    for(int l=0;l<=n;l++) {
    	for(int r = l + 1; r <= n; r ++) {
    		int t2 = b2[r] - b2[l];
	    	int t5 = b5[r] - b5[l];
	    	int sum = min(t2, t5);
	    	if(sum >= k) {
	    		res += n - r + 1;
	    		break;
			}
		}
	}
    cout << res << endl;
}

signed main (void) {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T = 1;
// 	cin >> T;
	while(T--) solve();
	return 0;
}  

K.天使的拼图

题意

给出一个图形,然后给出若干组矩形的边长,问是否能由该图形刚好填充这个矩形。

思路

跟据题目提供的图形,我们可以拼出图二 3 × 4 3\times4 3×4大小的矩形。

试一试可知只能拼成如图三图四这种图形。
在这里插入图片描述

标程

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

void solve(){
    int n,m;cin>>n>>m;
    if(n<m)swap(n,m);
    if((n%3==0&&m%4==0)||(n%4==0&&m%3==0)||((n%12==0)&&m>=7)||((m%12==0)&&n>=7))puts("Yes");
    else puts("No");
}

signed main (void) {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int T = 1;
// 	cin >> T;
	while(T--) solve();
	return 0;
}  

H.春天与花儿

题意

给出一个长度为 n n n的序列,我们可以对序列进行操作:

  • 选择一个数,将其加一。

给出一个数字 k k k,问至少操作几次可以让序列的乘积变为其倍数。

思路

标程(暴力)


标程(DFS)

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

int i,j,k,m,n,t,res,a[66];

bool chk(){
	if(a[0])return 1;
	int sb=1;
	for(i=1;i<m;i++){
		for(j=1;j<=min(m-1,a[i]);j++)sb*=i;
		sb%=m;
	}
	if(!sb)return 1;
	return 0;
}

void dfs(int dep){
	if(dep>res)return;
	if(chk()){
		res=min(res,dep); return;
	}
	int i,j,k;
	for(i=1;i<m;i++)if(a[i]){
		j=(i+1)%m;
		a[i]--; a[j]++;
		dfs(dep+1);
		a[i]++; a[j]--;
	}
}

int main(){
	ios::sync_with_stdio(0); cin.tie(0);
	cin>>n>>m; res=m-1;
	for(i=1;i<=n;i++){
		cin>>k; a[k%m]++;
	}
	dfs(0);
	cout<<res;
}

B. 时间的礼物

题意

思路

标程


I.

题意

思路

标程


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCL点云处理之 基于垂直度检测与距离聚类 的路面点云提取方案 (二百三十九)

PCL点云处理之 基于垂直度检测与距离聚类 的路面点云提取方案 (二百三十九) 一、算法流程二、具体步骤1.垂直度检测与渲染1.代码2.效果2.水平分布点云提取1.代码2.效果3.路面连通点云提取1.代码2.效果三、完整代码四、参考文献一、算法流程

开发指南020-banner

<dependency><groupId>org.qlm</groupId><artifactId>qlm-common</artifactId><version>1.0-SNAPSHOT</version> </dependency> 以上组件封装了平台的banner&#xff0c;不做任何配置的话&#xff0c;将输出平台的banner 想修…

如何过得更幸福?我推荐你读这5本书

快乐不等于幸福。快乐是一种短暂的体验&#xff0c;随着多巴胺的消退而迅速减退。快乐是有捷径的&#xff0c;那就是戏弄相关的神经回路。 幸福是有意义、有目的和积极的生活的持久体验。 今天&#xff0c;为大家推荐一份“幸福书单”。 01 《幸福的勇气》 岸见一郎、古贺史…

【Linux实践室】Linux用户管理实战指南:用户权限切换操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;图形化界面登录2.2 &#x1f514;使用login…

OSCP靶场--Twiggy

OSCP靶场–Twiggy 考点(CVE-2020-11651[RCE]) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.216.62 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-30 06:43 EDT Nmap scan report for 192.168.216.62 Host i…

2024蓝旭春季第二次前端培训课

目录 CSS伪类与伪元素 伪类 伪元素 关系选择器 分类举例 后代选择器 子元素选择器 相邻兄弟选择器 通用兄弟选择器 作用使用场景 后代选择器&#xff08;空格&#xff09; 子元素选择器 (>) 相邻兄弟选择器 () 通用兄弟选择器 (~) 随机提问 CSS布局 基础布局…

群晖配置FTP服务结合内网穿透实现公网访问本地NAS中储存文件

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

服务器监控软件夜莺采集监控(三)

文章目录 一、采集器插件1. exec插件2. rabbitmq插件3. elasticsearch插件 二、监控仪表盘1. 系统信息2. 数据服务3. NginxMQ4. Docker5. 业务日志 一、采集器插件 1. exec插件 input.exec/exec.toml [[instances]] commands ["/home/monitor/categraf/scripts/*.sh&q…

GEE23:基于植被物候实现农作物分类

地物分类 1. 写在前面2. 北京作物分类 1. 写在前面 今天分享一个有意思的文章&#xff0c;用于进行农作物分类。文章提出了一个灵活的物候辅助监督水稻(PSPR)制图框架。主要是通过提取植被物候&#xff0c;并自动对物候数据进行采样&#xff0c;获得足够多的样本点&#xff0c;…

未来智慧停车:技术架构解析与创新应用

随着城市化进程的不断加速&#xff0c;停车难题已成为城市居民生活中的一大痛点。传统的停车方式已经无法满足日益增长的停车需求&#xff0c;而智慧停车系统则成为了解决这一难题的重要途径。本文将深入探讨智慧停车系统的技术架构&#xff0c;并探索其在城市管理和用户体验上…

Diffusion添加噪声noise的方式有哪些?怎么向图像中添加噪声?

添加噪声的方式大致分为两种&#xff0c;一种是每张图像在任意timestep都加入一样的均匀噪声&#xff0c;另一种是按照timestep添加不同程度的噪声 一、在任意timestep都加入一样的noise batch_size 32x_start torch.rand(batch_size,3,256,256) noise torch.randn_like(x_…

思维题,LeetCode331. 验证二叉树的前序序列化

一、题目 1、题目描述 序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&#xff0c;我们可以使用一个标记值记录&#xff0c;例如 #。 例如&#xff0c;上面的二叉树可以被序列化为字符串 &quo…

2024.3.31每日一题

LeetCode 验证二叉树的前序序列化 题目链接&#xff1a;331. 验证二叉树的前序序列化 - 力扣&#xff08;LeetCode&#xff09; 题目描述 序列化二叉树的一种方法是使用 前序遍历 。当我们遇到一个非空节点时&#xff0c;我们可以记录下这个节点的值。如果它是一个空节点&a…

夜莺浏览日志、filebeat采集日志(四)

文章目录 一、elasticsearch二、filebeat三、日志分析 一、elasticsearch docker启动 docker run -d -p 9200:9200 -p 9300:9300 --restartalways -e ES_JAVA_OPTS"-Xms512m -Xmx512m" \ -e discovery.typesingle-node -e xpack.security.enabledtrue -e ELASTIC_P…

数据结构初阶:排序

排序的概念及其运用 排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性 &#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&…

基于springboot+vue实现的养老服务管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

mysql 条件/系统/加密/其它函数

学习了日期时间函数&#xff0c;接着学习条件、系统、加密和其它函数。 3&#xff0c;条件判断函数 条件判断函数也称为控制流程函数&#xff0c;根据满足的条件的不同&#xff0c;执行相应的流程。MySQL中进行条件判断的函数有IF、IFNULL和 CASE。 函数 说明 IF(expr,v1,v2…

【文献分享】 机器学习 + 分子动力学 + 第一性原理计算 + 热力学性质(熔化温度 热导率 热膨胀系数)

分享一篇关于机器学习 分子动力学 第一性原理 熔化温度&#xff08;熔化温度 & 热导率 & 热膨胀系数&#xff09;的文章。 感谢论文的原作者&#xff01; 关键词&#xff1a; 1. Al−Li alloy 2. Neural network potential 3. Molecular dynamics 4. Thermal pr…

Jenkins执行策略(图文讲解)

Jenkins执行策略-图文讲解 一&#xff1a;手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…

Collection与数据结构 链表与LinkedList (一):链表概述与单向无头非循环链表实现

1.ArrayList的缺点 上篇文章我们已经对顺序表进行了实现,并且对ArrayList进行了使用,我们知道ArrayList底层是使用数组实现的. 由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后搬移&#xff0c;时…