Codeforces Round 877 (Div. 2) A-E

news2024/10/5 14:20:03

题目链接:Dashboard - Codeforces Round 877 (Div. 2) - Codeforces

A - Blackboard List

解题思路:因为取的是绝对值,所以有负数肯定取负数,没负数就取最大值。

#include <bits/stdc++.h>
using namespace std;
const int mx = 1e2 + 10;

int a[mx];

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		int n;
		scanf("%d", &n);
		for (int i=1;i<=n;i++) {
			scanf("%d", a+i);
		}
		sort(a + 1, a + 1 + n);
		if (a[1] < 0) {
			printf("%d\n", a[1]);
		} else {
			printf("%d\n", a[n]);
		}
	}
    return 0;
}

B - Minimize Permutation Subarrays

解题思路:我们只需要考虑3个数,1、2、n。他们的位置关系应该是1...n...2或者2...n...1,那么就可以让数组的值永远是2。交换的话其实只需要考虑1和n位置的边界和本身就行了。

#include <bits/stdc++.h>
using namespace std;
const int mx = 2e5 + 10;

int a[mx];

int find_pos(int n, int p) {
	for (int i=1;i<=n;i++) {
		if (a[i] == p)
			return i;
	}
	return -1;
};

int main() {
	auto check = [](int n, int x, int y) {
		if (x < 1 || x > n || y < 1 || y > n)
			return (int)1e9;
		swap(a[x], a[y]);
		int find_1 = find_pos(n, 1);
		//cout << x << " " << y << " " << find_1 << endl;
		int ma = 1, p = find_1;
		int l = p - 1, r = p + 1;
		int ans = 1;
		while (l != 0 || r != n + 1) {
			if (r - l - 1 == ma) {
				ans++;
			} 
			if (a[l] < a[r]) {
				ma = max(ma, a[l]);
				l--;
			} else {
				ma = max(ma, a[r]);
				r++;
			}
		}
		swap(a[x], a[y]);
		return ans;
	};
	
	int t;
	scanf("%d", &t);
	while (t--) {
		int n;
		scanf("%d", &n);
		for (int i=1;i<=n;i++) {
			scanf("%d", a+i);
		}
		a[0] = a[n+1] = 1e9;
		int find_1 = find_pos(n, 1);
		int find_n = find_pos(n, n);
		int ans = 1e9;
		int x, y;
		auto change_ans = [&](int p1, int p2){
			int temp = check(n, p1, p2);
			//cout << temp << " ### " << endl;
			if (temp < ans) {
				ans = temp;
				x = p1, y = p2;
			}
		};
		change_ans(find_1, find_n-1);
		change_ans(find_1, find_n+1);
		change_ans(find_1-1, find_n);
		change_ans(find_1+1, find_n);
		change_ans(find_1, find_n);
	
		printf("%d %d\n", x, y);
	}
    return 0;
}

C - No Prime Differences

解题思路:其实问题是存在素数的问题,如果n和m都是合数,那么直接按照顺序1,2,3,4,,,n这样左右两边差都是1,上下两边差就是m了。但是如果m是质数的话就无法满足条件,所以我们需要调换顺序,首先分1,2,3,,,,m;m+1,m+2,,,,,2*m;....;(n-1)*m+1,(n-1)*m+2,,,,n*m。然后以1,3,5,7,n,2,4,6,8....这样就保证了左右差是1,上下差是x*m,就解决了。

#include <bits/stdc++.h>
using namespace std;
const int mx = 1e3 + 10;

int a[mx][mx];



int main() {
	auto check = [](int x){
		for (int i=2;i*i<=x;i++) {
			if (x % i == 0) 
				return false;
		}
		return true;
	};
	
	int t;
	scanf("%d", &t);
	while (t--) {
		int m, n;
		scanf("%d%d", &n, &m);
		int flag = 1;
		if (n < m) 
			swap(n,m), flag = 0;
		for (int i=1;i<=n;i+=2) {
			for (int j=1;j<=m;j++) {
				a[i/2+1][j] = (i-1)*m + j;
			}
		}
		for (int i=2;i<=n;i+=2) {
			for (int j=1;j<=m;j++) {
				a[i/2+(n-1)/2+1][j] = (i-1)*m + j;
			}
		}
		if (flag) {
			for (int i=1;i<=n;i++) {
				for (int j=1;j<=m;j++) {
					printf("%d ", a[i][j]);
				}
				puts("");
			}
		} else {
			for (int i=1;i<=m;i++) {
				for (int j=1;j<=n;j++) {
					printf("%d ", a[j][i]);
				}
				puts("");
			}
		}
	}
    return 0;
}

D - Bracket Walk

解题思路:首先当n为奇数的时候答案肯定无解。因为使用回头的方式只会增加偶数个(或者)。那么永远满足不了(和)数量相等的条件。用线段树维护一下前缀和,(就是1,)就是-1。那么我们知道一个字符串满足括号匹配的条件就是(和)数量相等,并且没有一个前缀和小于0的。我们记录((出现的位置和))出现的位置,那么当原始)数量大于(时,肯定是在第一个((处做增量,并且保证出现第一个((之前的前缀和都不小于0,然后再往后走。那么要加多少个(呢,其实就是求最小的前缀和就是需要加多少(满足所有前缀和都不小于0,然后这个时候可能)的数量大于(的数量,所以我们需要找到))最后出现的位置,然后再这里做增加。假设((出现的位置是(i-1,i),那么在(i+1,n)中肯定没有)),所以要使得(i+1,n)满足条件必须是(和)交替出现的情况。也就是n-i是偶数并且((最后出现的位置小于))最后出现的位置。

#include <bits/stdc++.h>
using namespace std;
#define k_m (k / 2 + 1)
#define inf 0x3f3f3f3f
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1

const int mx = 2e5 + 10;
const int mod = 1e9 + 7;

using ll = long long;

char s[mx];
int mtree[mx<<3];
int pre[mx];
set <int> s1, s2;
int lazy[mx<<3];

void build(int l, int r, int rt)
{
    if (l == r) {
        mtree[rt] = pre[l];
        return ;
    }
    int mid = (l + r) >> 1;
    build(lson);
    build(rson);
    mtree[rt] = min(mtree[rt<<1], mtree[rt<<1|1]); 
}

void update_lazy(int rt)
{
    if (lazy[rt]) {
        mtree[rt<<1] += lazy[rt];
        lazy[rt<<1] += lazy[rt];
        mtree[rt<<1|1] += lazy[rt];
        lazy[rt<<1|1] += lazy[rt];
        lazy[rt] = 0;
    }
}

void update(int l, int r, int rt, int L, int R, int v)
{
    if (L <= l && r <= R) {
        mtree[rt] += v;
        lazy[rt] += v;
        return ;
    }
    int mid = (l + r) >> 1;
    update_lazy(rt);
    if (L <= mid)
        update(lson, L, R, v);
    if (R > mid)
        update(rson, L, R, v);
    mtree[rt] = min(mtree[rt<<1], mtree[rt<<1|1]); 
}

int query(int l, int r, int rt, int L, int R)
{
    if (r < l) {
        return 0;
    }
    if (L <= l && r <= R) {
        return mtree[rt];
    }
    int mid = (l + r) >> 1;
    update_lazy(rt);
    if (L <= mid && R > mid)
        return min(query(lson, L, R), query(rson, L, R));
    if (L <= mid)
        return query(lson, L, R);
    return query(rson, L, R);
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    scanf("%s", s+1);
    for (int i=1;i<=n;i++) {
        pre[i] = pre[i-1];
        if (s[i] == '(')
            pre[i]++;
        else
            pre[i]--;
        if (s[i] == s[i-1]) {
            if (s[i] == '(') {
                s1.insert(i);
            }  else
                s2.insert(i);
        }
    }
    build(1, n, 1);
    while (m--) {
        int v;
        scanf("%d", &v);
        if (s[v] == '(') {
            update(1, n, 1, v, n, -2);
            if (s[v] == s[v-1]) {
                s1.erase(v);
            } else if (v != 1)
                s2.insert(v);
            if (s[v+1] == s[v]) {
                s1.erase(v+1);
            } else if (v != n)
                s2.insert(v+1);
            s[v] = ')';
        } else {
            update(1, n, 1, v, n, 2);
            if (s[v] == s[v-1]) {
                s2.erase(v);
            } else if (v != 1)
                s1.insert(v);
            if (s[v+1] == s[v]) {
                s2.erase(v+1);
            } else if (v != n)
                s1.insert(v+1);
            s[v] = '(';
        }
        //if (n == 16 && m + 65539 == 131054) {   puts(s+1); }
        if (n & 1) {
            puts("NO");
            continue;
        }
        int mu = mtree[1];
        int lf = s1.size()? *s1.begin(): n;
        if (query(1, n, 1, 1, lf) < 0) {
            puts("NO");
        } else {
            int rl = s2.size()? *s2.rbegin(): 0;
            int ll = s1.size()? *s1.rbegin(): 0;
            puts((rl >= ll && (n - rl) % 2 == 0)? "YES": "NO");
        }
    }

    return 0;
}

E - Count Supersequences

解题思路:可以证明其实答案跟n序列的值无关。然后答案反过来算就是k^m减去不包含n序列的b序列个数。我们可以去枚举包含最长长度为[0,n)的n序列的b序列。也就是\sum_{i=0}^{n-1}C_{m}^{i}k^{m-i},用快速幂求一下就行了。时间复杂度O(n*logn)

#include <bits/stdc++.h>
using namespace std;
const int mx = 1e6 + 10;
const int mod = 1e9 + 7;
using ll = long long;

ll qpow(ll x, ll y)
{
	ll ans = 1;
	while (y) {
		if (y & 1) ans = ans * x % mod;
		y >>= 1;
		x = x * x % mod;
	}
	return ans;
}

ll inv[mx];

ll C(int n, int m)
{
	return inv[n] * qpow(inv[n-m], mod-2) % mod * qpow(inv[m], mod-2) % mod; 
}


int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		int n, m, k, v;
		scanf("%d%d%d", &n, &m, &k);
		for (int i=1;i<=n;i++) {
			scanf("%d", &v);
		}
		ll ans = qpow(k, m);
		ll cmi = 1;
		for (int i=0; i<n; i++) {
			ans -= cmi * qpow(k-1, m - i) % mod;
			ans = (ans + mod) % mod;
			cmi = cmi * (m - i) % mod * qpow(i+1, mod - 2) % mod;
		}
		printf("%lld\n", ans);
	}
    return 0;
}

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

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

相关文章

基于PyQt5的桌面图像调试仿真平台开发(7)伽马矫正

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

小程序的剪贴板 实现复制文本功能

小程序的剪贴板 实现复制文本功能 wx.setClipboardData wx.setClipboardData() 设置系统剪贴板的内容。调用成功后&#xff0c;会弹出 toast 提示"内容已复制"&#xff0c;持续 1.5s Promise 风格 调用&#xff1a;支持微信 Windows 版&#xff1a;支持微信 Mac 版&…

Mac电脑如何与 Windows 用户共享文件?

在 Mac 上设置文件共享 选取苹果菜单 >“系统偏好设置”&#xff0c;然后点按“共享”。 选择“文件共享”复选框&#xff0c;然后点按“选项”。 选择“使用 SMB 来共享文件和文件夹”复选框。 在“Windows 文件共享”列表中&#xff0c;选择要与 Windows 用户共享文件的…

python语法

1、单行注释&#xff1a;# &#xff0c;多行注释&#xff1a; 2、python采用代码缩进和冒号来区别代码之间的层次 3、每个变量在使用前必须赋值&#xff0c;才会创建内存空间。python是基于值的内存管理&#xff0c;相同值指向同一空间。具有内存自动管理功能。不需要声明类…

亚马逊云科技生成式AI产品入围2023SAIL奖TOP30榜单项目

以“智联世界&#xff0c;生成未来”为主题的2023世界人工智能大会&#xff08;WAIC 2023&#xff09;将于7月6日至8日在上海举行。本次大会将聚焦通用人工智能发展&#xff0c;紧抓生成式人工智能引发的行业热潮&#xff0c;探索未来产业新业态&#xff0c;超前谋划赋能数字经…

安装使用最新Photoshop beta(OpenAI模型)及基本Photoshop beta使用技巧

安装使用最新Photoshop beta 1. 注册Adobe美国地区账号2.下载安装Adobe Creative Cloud工具3.下载Photoshop beta4. 基本Photoshop beta使用技巧 1. 注册Adobe美国地区账号 adobe美国官网&#xff1a;https://www.adobe.com/ 首先我们进入官网注册账号 下面我们输入注册邮箱…

【网络编程】自定义协议+Json序列化与反序列化

文章目录 一、序列化与反序列化概念二、自定义协议设计网络计算机2.1 服务端2.1.1 服务端业务处理流程2.1.2 TCP的发送与接收缓冲区2.1.3 保证读取完整报文2.1.4 自定义协议——序列化与反序列化2.1.4.1 请求2.4.1.2 响应 2.1.5 计算流程2.1.6 在有效载荷前添加长度报头2.1.7 发…

解决vmWare ESXI 7.3报错,客户机操作系统已禁用 CPU。请关闭或重置虚拟机(ESXI使用遇到问题解决记录文持续使用持续更新)

一&#xff1a;分析客户机操作系统已禁用 CPU" 这个错误通常是由以下原因之一引起的&#xff1a; 1. 虚拟机配置不正确&#xff1a;可能是您在虚拟机配置中选择了不受支持的 CPU 类型或功能。某些操作系统可能需要特定的 CPU 功能才能正常运行。如果您的虚拟机配置与操作…

下载【T0】指令微调数据集

T0 benchmark&#xff08;或者叫P3&#xff09;是一个大规模的人工标注instruction tuning数据集&#xff0c;在ICLR 2021 T0一文中提出&#xff0c;其收集了来自huggingface hub上的多任务数据&#xff0c;并为每一个task都装备了来自prompt source的人工撰写指令。 P3数据集…

9、DataX安装部署

1、 DataX简介 1.1 DataX概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址&#xff1a;https://github.com/alibaba/…

基于高校图书馆的用户画像、可视化、模型预测、推荐算法项目实现

需要本项目的可以私信博主获取源码及项目&#xff01;&#xff01;&#xff01; 本研究基于高校图书馆的借阅信息、馆藏图书信息、读者入馆信息、用户信息等多维度的数据表&#xff0c;首先将不同年份的数据拼接在一起&#xff0c;按照时间维度进行整合&#xff0c;并保证数据…

快慢指针专题

总体思想&#xff1a;详解为什么用一步两步快慢指针&#xff1f;三步四步可以吗 - 预言2018 - 博客园 (cnblogs.com) 1. 为什么快慢指针一定会相遇&#xff1a; 2. 为什么 quick 指针每次走两步&#xff0c;而不是3、4步骤&#xff0c;是因为 如上图所示&#xff0c;若走2步&a…

TDsql增量merge导入load_data

TDsql增量merge导入load_data 项目组最近用了腾讯的TencentDB分布式数据库作为传统关系型数据库来保存少量应用数据。因此需要开发相对应的ETL功能代码&#xff0c;根据新数据库特性&#xff0c;使用自带的工具load_data作为导入的工具 准备表 使用load_data导入的表&#xf…

Python运维自动化Paramiko模块

paramiko学习笔记 为什么要用到paramiko模块安装paramiko模块paramiko介绍SSHClient---连接服务器exec_command---执行命令SFTPClient---传输文件下载和上传文件其它方法 为什么要用到paramiko模块 工作中常用到Linux服务器需要更新开发的代码&#xff0c;之前一直是使用xshell…

Python_多任务:进程、线程、协程

目录 进程 实现多进程 进程池 实现进程池 线程 实现多线程 多线程的资源竞争问题 互斥锁解决资源竞争问题 死锁 协程 gevent 进程 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程&#xff0c;是操作系统进行资源分配和调度的一个独立单位&am…

“多”维演进:智能编码的深度进化

我们在追求怎样的编码未来&#xff1f; 无处不在的视频渗透、井喷式的流量增长、多元的场景技术需求、用户对视频体验的“不将就”……音视频行业的快速发展却伴随着“编码标准升级速度缓慢”、“硬件红利见底”、“编码复杂度带来的成本问题”等众多挑战。 视频编码还“卷”得…

SQL Server 2008 r2 修改sa密码 通过sql server 身份验证登陆

SQL Server的两种身份验证模式是Windows验证模式和SQL Server验证模式。 sql server 2008 r2 修改sa密码 通过sql server 身份验证登陆 【解决方法如下】 通过windows 身份验证登陆后,首先选中服务器(右键)->属性 ->安全性->服务器身份验证修改为"SQL SERVER和W…

浅谈电瓶车在线充电管理系统的设计与应用

安科瑞 华楠 摘要&#xff1a;基于ARM 硬件平台&#xff0c;研究了电瓶车充电技术&#xff0c;提出了一种智能型电瓶车在线安全充电系统&#xff0c;该系统可根据实际充电情况实现智能断电&#xff0c;同时提供给用户一种远程充电、断电的平台&#xff0c;目的是防止电瓶车过度…

港联证券|个人的分红要交税吗?

近年来&#xff0c;随着经济的快速发展&#xff0c;越来越多的人开始关注个人财务管理&#xff0c;其中一个重要的问题就是个人的分红是否需要缴纳税款。这个问题并不简单&#xff0c;需要从多个角度进行综合分析。 首先&#xff0c;我们需要明确一点&#xff0c;个人的分红属于…

浅谈数据中心机房动环监控系统可视化设计与研究

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;为了维护好数据中心机房动力环境&#xff0c;及时发现隐患和排除故障&#xff0c;降低管理成本控制能耗&#xff0c;提高运维效率&#xff0c;保障数据中心安全、高效、环保、稳定的运行&#xff0c;针对目前机房管理…