P4145 上帝造题的七分钟 2 / 花神游历各国

news2024/11/18 20:00:46

上帝造题的七分钟 2 / 花神游历各国

题目背景

XLk 觉得《上帝造题的七分钟》不太过瘾,于是有了第二部。

题目描述

"第一分钟,X 说,要有数列,于是便给定了一个正整数数列。

第二分钟,L 说,要能修改,于是便有了对一段数中每个数都开平方(下取整)的操作。

第三分钟,k 说,要能查询,于是便有了求一段数的和的操作。

第四分钟,彩虹喵说,要是 noip 难度,于是便有了数据范围。

第五分钟,诗人说,要有韵律,于是便有了时间限制和内存限制。

第六分钟,和雪说,要省点事,于是便有了保证运算过程中及最终结果均不超过 64 64 64 位有符号整数类型的表示范围的限制。

第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。"

——《上帝造题的七分钟·第二部》

所以这个神圣的任务就交给你了。

输入格式

第一行一个整数 n n n,代表数列中数的个数。

第二行 n n n 个正整数,表示初始状态下数列中的数。

第三行一个整数 m m m,表示有 m m m 次操作。

接下来 m m m 行每行三个整数 k l r

  • k = 0 k=0 k=0 表示给 [ l , r ] [l,r] [l,r] 中的每个数开平方(下取整)。

  • k = 1 k=1 k=1 表示询问 [ l , r ] [l,r] [l,r] 中各个数的和。

数据中有可能 l > r l>r l>r,所以遇到这种情况请交换 l l l r r r

输出格式

对于询问操作,每行输出一个回答。

样例 #1

样例输入 #1

10
1 2 3 4 5 6 7 8 9 10
5
0 1 10
1 1 10
1 1 5
0 5 8
1 4 8

样例输出 #1

19
7
6

提示

对于 30 % 30\% 30% 的数据, 1 ≤ n , m ≤ 1 0 3 1\le n,m\le 10^3 1n,m103,数列中的数不超过 32767 32767 32767

对于 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 1 0 5 1\le n,m\le 10^5 1n,m105 1 ≤ l , r ≤ n 1\le l,r\le n 1l,rn,数列中的数大于 0 0 0,且不超过 1 0 12 10^{12} 1012

大致思路

按正经思路来说我们需要一个支持开方的线段树,但是!我们可以用一个巧妙的办法AC掉这个题

part1

首先,树状数组可以实现区间查询,区间查询 get!

part2

最关键的部分是我们怎样实现区间每个元素开方

对一个数开方并向下取整,我们可以把他看作是减法。(int自带向下取整)
t r e e [ x ] − = ( ( i n t ) a [ i ] − a [ i ] ) tree[x]-=((int)\sqrt {a[i]}-a[i]) tree[x]=((int)a[i] a[i])

对应在树状数组内也就是一条链的修改,与单点修改相同,只需 a d d ( i , ( ( i n t ) a [ i ] − a [ i ] ) ) add(i,((int)\sqrt {a[i]}-a[i])) add(i,((int)a[i] a[i]))即可。

但这样是不够的,单点修改的时间复杂度过高,无法通过

part3

对于0和1来说,开方是没有意义的,再对他们进行无意义修改非常浪费,因此,我们用一个并查集记录下一个不为0或1的数。

part 2,3代码实现如下

void work(int l,int r){
	for(int i=l;i<=r;i){
		int k=(int)sqrt(a[i]);
		t1.add(i,k-a[i]);//part2部分,单点修改
		a[i]=k;//a[i]记录各个元素实际值
		if(a[i]<=1){//若当前元素为0或1
			fa[i]=i+1;//指向下一个数
		}
		else fa[i]=i;//否则当前元素还可能开方,指向自己
		if(find(i)==i){//若执行操作后当前元素是可能会被开方的,当前fa[i]被修改过,跳到下一个元素(下一个连通块)
			i=i+1;
		}
		else i=fa[i];//否则跳到下一个不为0或1的元素
	}
}

part 4 树状数组与并查集

剩下的只需要打个并查集和树状数组模板就ok啦

AC CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long int
const int N=1e6+1145;
int n,m,fa[N],a[N];
int lowbit(int x){
	return x&-x;
}
int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
struct bit_tree{
	int tr[N];
	void add(int x,int ad){
		while(x<=n){
			tr[x]+=ad;
			x+=lowbit(x);
		}
	}
	int query(int x){
		int ans=0;
		while(x){
			ans+=tr[x];
			x-=lowbit(x);
		}
		return ans;
	}
}t1;
void work(int l,int r){
	for(int i=l;i<=r;i){
		int k=(int)sqrt(a[i]);
		t1.add(i,k-a[i]);//part2部分,单点修改
		a[i]=k;//a[i]记录各个元素实际值
		if(a[i]<=1){//若当前元素为0或1
			fa[i]=i+1;//指向下一个数
		}
		else fa[i]=i;//否则当前元素还可能开方,指向自己
		if(find(i)==i){//若执行操作后当前元素是可能会被开方的,当前fa[i]被修改过,跳到下一个元素(下一个连通块)
			i=i+1;
		}
		else i=fa[i];//否则跳到下一个不为0或1的元素
	}
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		fa[i]=i;
		cin>>a[i];
		t1.add(i,a[i]);
	}
	cin>>m;
	while(m--){
		int p,l,r;
		cin>>p>>l>>r;
		if(l>r)swap(l,r);//注意l可能大于r
		if(p==0){
			work(l,r);
		}
		else if(p==1){
			cout<<t1.query(r)-t1.query(l-1)<<endl;
		}
	}
	return 0;
}

完结撒花

附封面(大哥!!!!!)

请添加图片描述

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

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

相关文章

Ubuntu22.04搭建mysql主从复制

记录哈&#xff0c;这个需要两台服务器&#xff0c;每台服务器上面都要安装mysql&#xff0c;若是没有安装&#xff0c;请分别在两台服务器上面运行下面的命令 sudo apt install mysql-server 引用 Ubuntu下的mysql8.0忘记密码怎么办? 环境 Ubuntu 22.04 主机:192.168.164.1…

mac前端代码编辑 Sublime Text 4 Dev 中文v4.0(4151)

Sublime Text 4 for Mac是一款功能强大的代码编辑器&#xff0c;适合所有需要高效编写代码和进行代码管理的程序员使用。 快速响应&#xff1a;Sublime Text 4在加载文件和执行命令时非常快速&#xff0c;能够让用户在高效的开发过程中体验到无缝的交互。 多种语言支持&#…

定了!全国2023下半年软考(高级、中级、初级)报名时间汇总

截止到2023年8月2日&#xff0c;有以下地区公布了软考报名时间&#xff1a; 安徽软考2023下半年报名时间&#xff1a;8月15日9:00至8月21日16:00 黑龙江软考2023下半年报名时间&#xff1a;8月16日至8月22日 甘肃软考2023下半年报名时间&#xff1a;8月28日9:00至9月6日18:00…

安全文件传输的重要性及其对企业的影响

在当今的信息时代&#xff0c;企业之间的文件传输已经成为日常工作的重要组成部分。无论是在商务合作、人力资源还是财务审计等方面&#xff0c;文件传输都发挥着关键的作用。然而&#xff0c;随着网络技术的发展&#xff0c;网络安全问题也日益突出&#xff0c;泄漏、篡改、丢…

django使用mysql数据库

Django开 发操作数据库比使用pymysql操作更简单&#xff0c;内部提供了ORM框架。 下面是pymysql 和orm操作数据库的示意图&#xff0c;pymysql就是mysql的驱动&#xff0c;代码直接操作pymysql ,需要自己写增删改查的语句 django 就是也可以使用pymysql、mysqlclient作为驱动&a…

EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?

目录 1 EXCEL里如何显示序号&#xff1f; 2 如何重新排序&#xff1f; 3 怎么取得排序后的序号&#xff1f; 3.1 rank() 的序号可能不连续 3.2 方法2&#xff1a;SUMPRODUCT((C7>C$7:C$12)/COUNTIF(C$7:C$12,C$7:C$12))1 EXCEL里如何显示序号&#xff1f;如何重新排序…

A Survey of Embodied AI: From Simulators to Research Tasks 论文阅读

论文信息&#xff1a; 题目&#xff1a;A Survey of Embodied AI: From Simulators to Research Tasks 作者&#xff1a;Jiafei Duan, Samson Yu 来源&#xff1a;arXiv 时间&#xff1a;2022 Abstract 通过评估当前的九个具体人工智能模拟器与我们提出的七个功能&#xff0…

redis的事务、redis持久化方案、Java操作redis数据库

五、redis的事务 开启事务&#xff1a; 要等左边的提交事务&#xff0c;右边才能拿到修改后的值 本来name不能增加&#xff0c;会报错&#xff0c;但是事务中没提交不知道错 此时提交数据&#xff1a; redis事务将成功的正常提交&#xff0c;失败的才回滚&#xff0c;所以不具备…

C++源码Cmake生成各架构的库

网上一般的教程都是手写C源码进CMakeList 例如&#xff1a; add_executable (main a.cpp b.cpp a/c.cpp ... ) 这种写法太蠢了&#xff0c;不适合项目多层级目录使用 遍历所有文件夹 下面的代码是Cmake代码&#xff0c;一开始看到的时候我也是震惊的&#xff0c;但事实就是它…

2023年性价比电脑硬件主机推荐|电脑党必备硬件选购攻略

在自主搭建电脑变得流行且显卡价格飙升的这个时代&#xff0c;我想给大家推荐一款特别的产品——NUC&#xff08;Next Unit of Computing&#xff09;。 NUC是Intel所推出的一种「ITX台式机」&#xff0c;截止目前已经迭代了很多型号&#xff0c;比如之前我买过的猛兽峡谷&…

Flink读取mysql数据库(java)

代码如下: package com.weilanaoli.ruge.vlink.flink;import com.ververica.cdc.connectors.mysql.source.MySqlSource; import com.ververica.cdc.connectors.mysql.table.StartupOptions; import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema; import org…

夏日暴雨,6大安全应对攻略,让我们一起做好防范

夏季暴雨来袭&#xff0c;我们必须高度警惕&#xff01;短时间的强降雨可能导致积水、山区滑坡、城市内涝等问题&#xff0c;给社会和经济发展带来严重影响。今天&#xff0c;让我们一起探讨一些有效的防范措施&#xff0c;确保个人安全与减少灾害损失。关注天气预警&#xff0…

IC秋招| 秋招怎么做准备,这份攻略请收下!

近期大家关注的就是秋招了&#xff0c;如今一些企业已经开启了提前批招聘&#xff0c;不少同学已经投递了简历&#xff0c;但内心还是非常焦虑&#xff0c;那么今年的秋招到底该如何准备呢&#xff1f; 简历投递思路建议 刚开始对大厂没有把握的话&#xff0c;可以先约初创或…

SWAT模型【建模方法、实例应用、高级进阶技能】

查看原文>>>SWAT模型【建模方法、实例应用、高级进阶技能】 【内容简述】&#xff1a; 【其它相关推荐】&#xff1a; 一维二维水动力模拟、水质建模、复杂河网构建技术在环境影响评价、防洪评价与排污口论证等实际项目中的应用 基于R语言的水文、水环境模型优化技…

黑客滥用 Google AMP 进行规避性网络钓鱼攻击

近日&#xff0c;有安全研究人员警告称&#xff0c;有越来越多的网络钓鱼活动利用谷歌加速移动页面(AMP)绕过电子邮件安全措施&#xff0c;进入企业员工的收件箱。 谷歌AMP是由谷歌和30个合作伙伴共同开发的一个开源HTML框架&#xff0c;旨在加快网页内容在移动设备上的加载速…

剑指 Offer 54. ! 二叉搜索树的第k大节点 (考察二叉树的中序遍历)

剑指 Offer 54. 二叉搜索树的第k大节点 给定一棵二叉搜索树&#xff0c;请找出其中第 k 大的节点的值。 我的思路是&#xff1a;用一个全局arrayList不断收集“逆向”中序遍历该搜索二叉树所需要的答案 class Solution {int res, k;public int kthLargest(TreeNode root, int …

太牛了,h2oGPT直接操作本地PDF、Excel、Word、图像、等文件

h2o项目简介 查询和总结您的文档&#xff0c;或者只是使用 h2oGPT&#xff08;一个 Apache V2 开源项目&#xff09;与本地私有 GPT LLM 聊天。项目地址https://github.com/h2oai/h2ogpt测试体验地址https://gpt.h2o.ai/主要功能 任何文档的私人离线数据库&#xff08;PDF、Ex…

Linux安装显卡驱动、annaconda和CUDA(超详细)

Windows版本的annaconda安装请见&#xff1a;Windows版本的annaconda安装 Windows版本的CUDA安装请见&#xff1a;Windows版本的CUDA安装 目录 一、安装显卡驱动 1.查询系统中是否安装了显卡驱动 2.查询显卡型号并选择安装的驱动版本 3.安装驱动 二、安装annaconda 三、…

如何为公司选择合适的工时管理系统?

近年来&#xff0c;越来越多的企业将工作外包、提供灵活的工作时间和聘用远程员工&#xff0c;因此对时间跟踪软件的需求也在不断增长。企业需要了解员工如何度过工作时间&#xff0c;否则可能会让企业蒙受损失。 为确保物有所值&#xff0c;在选择工时管理系统时可参考以下步…

EXCEL, 用if({1,0,0} ...) 实现把给定的区域,输出为任意你想要的矩阵,数组区域!

目录 1 原材料&#xff1a;这样的一个区域 工具 if({1,0,0}) 数组公式 1.1 原始数据 1.2 原理 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.1 if(0/1,t-value,f-value)---变形--->if({},range1,range2) 1.2.2 原理1&#xff1a; if 数组原理&#…