CodeTON Round 7(D、E)

news2024/11/29 20:53:04

D - Ones and Twos 

        题意:给你一个长度为 n 的 数组 a ,其中每个元素都是 1 或 2。请处理以下两种类型的询问

"1 s":检查是否存在 a的子数组  ,其总和等于 s。

"2 i v":将 ai改为v。

如果数组 b 是数组 a 的子数组,那么 b 可以从 a 中通过删除开头的几个(可能是零个或全部)元素和结尾的几个(可能是零个或全部)元素得到。具体来说,一个数组就是它本身的一个子数组。

        思路:由于是单点修改,可以发现整个数组的和是很容易维护的。假设数组和为eq?sum,对于一个查询而言,我们所需要做的就是看从两边能否拿出eq?sum-s大小的数。

        由于只存在1或者2,现考虑拿出偶数的情况:有如下策略,首先两边如果有2,那么就拿2。如果没有2,那就到另一边拿,直到两边都是1为止。然后再将两个1同时拿走,再循环上述操作。因此可以发现的是eq?%5B0%2Csum%5D之间的任意偶数都是能取到的。接下来考虑拿出奇数的情况,奇数就必须要拿到一个1,再拿完1以后按照偶数的操作继续进行下去。因此最小的奇数应该是看左右两边到第一个1的和的最小值。此后更大的奇数也同样能被取到。

        如何去找两边最近的1,可以直接用set来维护每个1的位置,然后访问起点和终点即可。

        

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
const LL maxn = 4e05+7;
const LL N = 5e05+10;
const LL mod = 1e09+7;
const int inf = 0x3f3f;
const LL llinf = 5e18;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >mi;//小根堆
priority_queue<LL> ma;//大根堆
LL gcd(LL a, LL b){
	return b > 0 ? gcd(b , a % b) : a;
}

LL lcm(LL a , LL b){
	return a / gcd(a , b) * b;
}
int n , m;
int a[N];
void init(int n){
	for(int i = 0 ; i <= n ; i ++){
		a[i] = 0;
	}
}
void solve() 
{
	cin >> n >> m;
	int sum = 0;
	set<int>st;
	for(int i = 1 ; i <= n ; i ++){
		cin >> a[i];
		if(a[i] == 1){
			st.insert(i);
		}
		sum += a[i];
	}
	for(int i = 0 ; i < m ; i ++){
		int op;
		cin >> op;
		if(op == 1){
			int x;
			cin >> x;
			int ne = sum - x;
		//	cout << ne << endl;
			if(ne < 0){
				cout << "NO\n";
			}
			else if(ne % 2 == 1){
				if(!st.empty()){
					auto it = st.begin();
					auto tt = st.rbegin();
					int x = *it;
					int y = *tt;
					int minn = min((x - 1) * 2 , (n - y) * 2) + 1;
					if(ne < minn){
						cout << "NO\n";
					}
					else{
						cout <<"YES\n";
					}
				}
				else{
					cout <<"NO\n";
				}
			}
			else{
				cout << "YES\n";
			}
		}
		else{
			int p , x;
			cin >> p >> x;
			sum -= a[p];
			if(a[p] == 1){
				st.erase(p);
			}
			a[p] = x;
			sum += a[p];
			if(a[p] == 1){
				st.insert(p);
			}
		}
	}
}            

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout.precision(10);
    int t=1;
	cin>>t;
    while(t--)
    {
    	solve();
    }
    return 0;
}

E题应该是把路径转化成一个区间,然后看区间内包含了多少个区间...之后再补4

E - Permutation Sorting 

        题意:给你一个排列a ,大小为 n 。 a 大小为 n 。如果满足 ai=i ,我们称索引 i 为好索引。每秒钟后,我们会将所有不好的索引向右旋转一个位置。

        形式上让 s1,s2,…,sk为a中不好的索引,并按递增顺序排列。即eq?s_%7Bj%7D%20%3C%20s_%7Bj%20&plus;%201%7D ,如果索引 i 不好,那么存在 j ,这样 eq?s_%7Bj%7D = i。从1~k,令eq?a_%7Bs_%7Bi%20mod%20k%20&plus;%201%7D%7D%20%3D%20a_%7Bs_%7Bi%7D%7D

        对于从 1 到 n 的每个 i ,找出索引 i 第一次变为好的时候。

        思路:题目有点不说人话,贴一遍样例

6

2 1 4 6 5 3

        在第二个测试案例中, 5 已经处于正确的位置,因此索引 5 在 0 秒时变为有效。 1 秒后,将对 s=[1,2,3,4,6] 进行循环移位,得到数组 a=[3,2,1,4,5,6] 。请注意,索引 2 、 4 和 6 在 1 秒变为有效。 2 秒后,将对 s=[1,3] 进行循环移位,得到数组 a=[1,2,3,4,5,6] 。注意,索引 1 和 3 在 2 秒时变为有效。

        可以看到,其实在一开始,数组中每个位置需要到达的地方都是确定的了,例如该样例的2需要从第一位跑到第二位,由于是循环数组,我们可以开一个2*n的数组来避免循环,则1需要跑到第7位。考虑将所有数需要走的位置转化为区间。

        如果不考虑索引变好,那么使得每个数变成好索引的轮次为(终点 - 起点)。即数字2需要一轮,数字1需要6轮。接下来考虑索引会变好,即相当于从数组中拿去了该数。例如数字4,只需要一轮即可变为好索引,那么接下来整个数组大小变成5,相当于数字1只需要从第二位跑到第六位即可。也就是说:如果原本某个数所需要走的区间内存在了别的数的区间,那么他所需要的轮次也会减少。因此对于一个数eq?x而言,他所需要的轮次为:(区间终点 - 区间起点 - 区间内的小区间个数)。

        如果我们只记录每个数本身的区间是否会有问题呢,我们观察样例中的数字3,他所走的区间为[6,9],而且其他数构成的区间没有在[6,9]里面的,所以答案会求出3,但是实际上是2,因为其实在3的路径上,2已经是一个好索引了,需要答案减1。那么如何去表示2这个区间,我们不光需要记录他本身的区间[1,2],还需要记录一下[7,8],这样才能影响到后面循环上来的数。因此对于eq?a_%7Bi%7D%20%5Cgeq%20i的数而言,不光需要记录一下eq?%5Bi%20%2C%20a%5Bi%5D%5D 还需要记录eq?%5Bi%20&plus;%20n%20%2C%20a%5Bi%5D%20&plus;%20n%5D

        接下来考虑如何统计区间,可以先对所有区间进行一个按照左端点排序,然后统计一下所有区间右端点小于等于某个数的个数。例如某个区间[x,y]统计他的时候就将树状数组大于等于y的所有值都加一。然后我们遍历区间左端点1~n,每查询完一个区间,就将其删除,这样便能确保当前统计区间的左端点都是大于等于当前查询的左端点 。每一轮查询的答案就是右端点-左端点-区间右端点小于右端点的个数。

        

// Problem: E. Permutation Sorting
// Contest: Codeforces - CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!)
// URL: https://codeforces.com/contest/1896/problem/E
// Memory Limit: 256 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
const LL maxn = 4e05+7;
const LL N = 1e06+10;
const LL mod = 1e09+7;
const int inf = 0x3f3f;
const LL llinf = 5e18;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >mi;//小根堆
priority_queue<LL> ma;//大根堆
LL gcd(LL a, LL b){
	return b > 0 ? gcd(b , a % b) : a;
}

LL lcm(LL a , LL b){
	return a / gcd(a , b) * b;
}
int n , m;
int a[N];
void init(int n){
	for(int i = 0 ; i <= n ; i ++){
		a[i] = 0;
	}
}
struct BIT{//Binary indexed Tree(树状数组)
	int n;
	vector<int> tr;
	BIT(int n) : n(n) , tr(n + 1 , 0){
	}
	int lowbit(int x){
		return x & -x;
	}
	void modify(int x , int modify_number){
		for(int i = x ; i <= n ; i += lowbit(i)){
			tr[i] += modify_number;
		}
	}
	void modify(int l , int r , int modify_number){
		modify(l , modify_number);
		modify(r + 1 , -modify_number);
	}
	int query(int x){
		int res = 0;
		for(int i = x ; i ;  i -= lowbit(i))
			res += tr[i];
		return res;
	}
	int query(int x , int y){
		return query(y) - query(x);
	}
};
void solve() 
{
	cin >> n;
	set< pair<int,int> >p;
	BIT bit(2 * n + 5);
	for(int i = 1 ; i <= n ; i ++)
		cin >> a[i];
	for(int i = 1 ; i <= n ; i ++){
		if(a[i] >= i){
			p.insert({i , a[i]});
			p.insert({i + n , a[i] + n});
			bit.modify(a[i] , 1);
			bit.modify(a[i] + n , 1);
		}
		else if(a[i] < i){
			p.insert({i , n + a[i]});
			bit.modify(n + a[i] , 1);
		}
	}	
	vector<int>ans(n + 2);
	for(auto it : p){
		if(it.x > n){
			break;	
		}
		int id = (it.y - 1) % n + 1;
	//	cout << it.x << it.y<<endl;
		if(it.y - it.x > 1){
			ans[id] = it.y - it.x - bit.query(it.y - 1);
		}
		else if(it.y - it.x == 1){
			ans[id] = 1;
		}
		else{
			ans[id] = 0;
		}
		bit.modify(it.y , -1);
	}
	for(int i = 1 ; i <= n ; i ++){
		cout << ans[i] <<" ";
	}
	cout << endl;
}            
int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cout.precision(10);
    int t=1;
	cin>>t;
    while(t--)
    {
    	solve();
    }
    return 0;
}

 

 

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

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

相关文章

MySQL性能优化,SQL调优,SQL调优的手段

文章目录 对MySQL性能的优化的理解硬件和操作系统层面的优化架构设计层面的优化MySQL程序配置优化SQL优化 SQL调优有哪几种方式1.EXPLAIN2.SQL语句中IN包含的值不应过多3.SELECT语句务必指明字段名称4.当只需要一条数据的时候&#xff0c;使用limit 15.如果排序字段没有用到索引…

(附源码)SSM环卫人员管理平台 计算机毕设36412

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究概况 1.3研究内容 1.4 ssm框架介绍 1.5论文结构与章节安排 2 环卫人员管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性…

面对困境时的力量——《难不难》与歌手荆涛的坚持

歌手荆涛演唱的《难不难》不仅是一首歌曲&#xff0c;更是一种精神的呈现。它告诉我们&#xff0c;面对问题时&#xff0c;只要我们坚持并勇往直前&#xff0c;一切困难都会变得简单。无论前方有多少险阻&#xff0c;总有过去的那一天&#xff0c;只要我们不放弃&#xff0c;就…

SAP smartforms二维码输出

此方法需要SAP_BASIS版本在731以上 TCODE-SE73 选择’系统条形码’点击 ‘更改’ 按步骤创建一个系统条形码 Module Size 调节二维码的尺寸 进入smartforms 创建样式 填入条形码名称 创建一张表单测试二维码&#xff0c;填入创建好的样式 测试结果&#xff1a;

快递批量查询高手软件,让你轻松掌握多家快递物流信息,提升工作效率

随着电子商务的繁荣和智能化物流的普及&#xff0c;快递行业在全球范围内迅速发展。在这个快节奏的时代&#xff0c;为了提高工作效率并更好地管理物流信息&#xff0c;一款强大的工具——快递批量查询高手软件应运而生。这款软件可以让你轻松掌握多家快递公司的物流信息&#…

CorelDRAW X7最新下载安装详细图文步骤教程

CorelDRAW X7是加拿大Corel公司推出的向量图形制作工具&#xff0c;经历二十多年的发展与蜕变&#xff0c;CorelDRAW系列已发布了17个版本&#xff0c;而CorelDRAW X7是此系列中的新版本。其完善的内容环境和强大的平面设计功能为设计师提供充分的施展舞台&#xff0c;是向量绘…

防火墙命令行基础配置实验(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求3. 当前配置3.1 PC配置3.2 FW配置&#xff08;防火墙&#xff09;[^7][^8]3.2.1 FW1配置3.2.2 FW2配置 3.3 R配置3.3.1 R1配置3.3.2 R2配置 3.4 SW配置3.4.1 SW1配置3.4.2 SW2配置3.4.3 SW3配置…

【漏洞复现】Array VPN任意文件读取漏洞

漏洞描述 华耀(中国)科技有限公司(简称:Array)于2003年创建于北京,是优秀的网络功能平台解决方案提供商,也是应用交付解决方案、移动应用接入(SSL VPN)解决方案的全球领导者。华耀现有员工200余人,其中研发团队占到100余人,总部位于北京。并在北京、上海、广州、杭…

二十五、DSL查询文档(全文检索查询、精确查询、地理查询、复合查询)

目录 一、全文检索查询 1、match查询 语法: 2、multi_match查询 语法: 3、match和mult_match的区别 二、精确查询 1、term查询&#xff1a; 语法&#xff1a; 2、range查询&#xff1a;&#xff08;范围查询&#xff09; 语法&#xff1a; 三、地理查询 1、geo_bou…

如何看待 2023 OPPO 开发者大会?潘塔纳尔进展如何?AndesGPT 有哪些亮点?

在2023年11月16日举行的OPPO开发者大会&#xff08;ODC23&#xff09;上&#xff0c;OPPO带来了全新ColorOS 14、全新互联网服务生态以及健康服务进展&#xff0c;这些新动态中有许多值得关注的地方。 1、全新ColorOS 14&#xff1a; 效率提升&#xff1a;ColorOS 14通过一系列…

Linux常用命令——bg命令

在线Linux命令查询工具 bg 用于将作业放到后台运行 补充说明 bg命令用于将作业放到后台运行&#xff0c;使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号&amp;的效果是相同的&#xff0c;都是将其放到系统后台执行。 在Linux系统中执行某些操作时候&…

文件属性和路径

文件属性 我们先补充一个知识&#xff1a; 任何新建的文件刚开始都是在磁盘上的 假设我们在文件夹中新建一个1.txt文本文档&#xff0c;他的大小是0KB&#xff0c;但是不能说明这个文件不占用磁盘空间 文件由 文件属性文件内容 组成&#xff0c;这里只能说明文件内容是空 文件…

rvc使用教程入门

推荐配置: GPU显卡:RTX 3060 8G CPU:lntel十二代酷睿i5或锐龙7000系以上 内存:32G RAM以上 操作系统:Windows_10系统 or Windows_11系统 注:目前AMD和英特尔的显卡延迟会比较高,建议英伟达RTX20系以上显卡使用 使用之前建议关闭GPU加速计划 操作方式:开始菜单输入图形设…

Redis-Redis 高并发分布式锁

集群分布式场景高并发 1.negix配置代理和路由 高并发场景超卖问题 1.使用原生redis控制超卖时(若是商品&#xff0c;则可以将商品id作为锁对象)&#xff0c;会遇到的问题 问题一&#xff1a;若直接使用&#xff1a;将获取锁的对象和设置的超时的时间分开&#xff0c;则不能控…

虚拟机可ping树莓派树莓派无法ping虚拟机 的解决办法

问题描述 在学习交叉编译的过程中&#xff0c;发现了树莓派无法ping通虚拟机的问题。所以我尝试了各种ping&#xff0c;发现&#xff1a; 虚拟机可以ping通树莓派和主机树莓派可以ping通主机主机可以ping通树莓派和虚拟机唯独树莓派没法ping通虚拟机 尝试各种方法后找到一种…

Docker Swarm总结+Jenkins安装配置与集成(4/4)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

Python中zip()函数用法解析

打包 zip() 函数是 Python 中一个非常有用的函数&#xff0c;它用于将多个可迭代对象组合成一个元组序列&#xff0c;依次将来自每个可迭代对象的元素打包在一起。 基本的语法是 zip(iterable1, iterable2, ...)&#xff0c;其中 iterable1, iterable2, ... 是要合并的可迭代…

python游戏开发pygame初步

文章目录 安装和示例移动物体优化 安装和示例 顾名思义&#xff0c;PyGame就是用来做游戏的Python库&#xff0c;提供了许多游戏开发功能&#xff0c;如图像处理、音频播放、事件处理、碰撞检测等等。从这个角度来说&#xff0c;pygame不仅是一个游戏库&#xff0c;同时也是一…

【代码】基于量子粒子群算法(QPSO)优化LSTM的风电、负荷等时间序列预测算法matlab

程序名称&#xff1a;基于量子粒子群算法&#xff08;QPSO&#xff09;优化LSTM的风电、负荷等时间序列预测算法 实现平台&#xff1a;matlab 代码简介&#xff1a;代码是基于QPSO-LSTM的负荷、光伏、风电等时间序列预测&#xff0c;MATLAB编写。包含LSTM&#xff08;长短时记…