首页 > 其他分享 >Day1

Day1

时间:2024-02-17 21:02:30浏览次数:37  
标签:orz minn int max Day1 maxn ans

未获得准确的时间。导致了迟到 /(ㄒoㄒ)/~~

结果错过了前面的小半节课,也是让人难受 ≧ ﹏ ≦ 。

进入正题

T1 最优贸易简化版

解题方法:

  • 分块
  • 倍增
  • 线段树
  • 并查集

本次使用分块解决,其他方法见题目中的附件。

$n$ 个城市分布在一条直线上,从 $L$ 到 $R$ 获得最大利润时 $ans = max(a_i-a_j)(L <= j < i<= R)$.

分块先把 $n$ 个城市分成 $\sqrt{n}$ 块。

赚钱有两种情况,一种是买入卖出在同一块,另一种是在两个不同的块。

所以预处理的时候就要处理出每一块中的最小价格,最大价格,以及最大利润。

每次询问的时间复杂度为 $O(\sqrt{n})$ 。

代码如下:

#include<cstdio>
#include<cmath>
#define orz(i,a,b) for (int i = a;i <= b; i++)
#define sto(i,a,b) for (int i = a;i >= b; i--)
using namespace std;
const int N = 5e5 + 5;
int n, m, a[N], s, L, R;
struct node {
	int maxn/*最大值*/, minn/*最小值*/, max_v/*块内最大收益*/;
}b[N];
void chushi(int n, int s) {//初始化 
	sto (i, n/s, 0)
		b[i].minn = 1e9 + 9;
	orz (i, 1, n) {
		if (a[i] - b[i / s].minn > b[i / s].max_v)
			b[i / s].max_v = a[i] - b[i / s].minn;
		if (a[i] < b[i / s].minn)
			b[i / s].minn = a[i];
		if (a[i] > b[i / s].maxn)
			b[i / s].maxn = a[i];
	}
}
int main() {
	scanf ("%d%d", &n, &m);
	orz (i, 1, n)
		scanf ("%d", a + i);
	s = sqrt(n);
	chushi(n, s);
	while (m--) {
		scanf ("%d%d", &L, &R);
		int ql = L / s, qr = R / s, ans = 0;
		if (ql == qr) {//买卖在同一块中 
			int minn = 1e9;
			orz (i, L, R) {
				if (a[i] - minn > ans)
					ans = a[i] - minn;
				if (a[i] < minn)
					minn = a[i];
			}
		}
		else {
			int minn = 1e9;
			orz (i, L, (ql + 1) * s - 1) {
				if (a[i] - minn > ans)
					ans = a[i] - minn;
				if (a[i] < minn)
					minn = a[i];
			}
			orz (i, ql + 1, qr - 1) {
				if (b[i].max_v > ans)
					ans = b[i].max_v;
				if (b[i].maxn - minn > ans)
					ans = b[i].maxn - minn;
				if (b[i].minn < minn)
					minn = b[i].minn;
			}
			orz (i, qr * s, R) {
				if (a[i] - minn > ans)
					ans = a[i] - minn;
				if (a[i] < minn)
					minn = a[i];
			}
		}
		printf ("%d\n", ans);
	}
	return 0;
} 

标签:orz,minn,int,max,Day1,maxn,ans
From: https://www.cnblogs.com/Assassins-Creed/p/18018388

相关文章

  • P7167 [eJOI2020 Day1] Fountain-st表
    这个题目,可以看出每一个盘里的水往下流出的路径会是一样的,而且没有修改操作,所以我们可以预处理出每个盘里往下的路径,已经要下去所需要的水。那么首先需要寻找每个盘往下的第一个盘是那个。对于盘i来说,第一个盘j应满足$j>i&&D_j>D_i$,所以就可以想到用单调栈处理每个盘下第一......
  • 补题 DAY1
    P2146 [NOI2015]软件包管理器给你一棵树,两个操作:installx查询路径\(0\tox\)上的点权和,并将路径点权赋值为\(1\)unistallx查询\(x\)的子树点权和,并将子树点权赋值为\(0\)板子。恶心。点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnam......
  • Java学习日记 Day16 正月初五,学习回归正轨!
    年前把SSM和Linux学完了,过年期间简单的做了个ssm的项目,再理解理解SSM。今天继续学了radis,也是比较重要的一个技术。radis:简单来说就是把数据存到缓存里的技术,常常和关系数据库结合使用,我们可以把数据库拿出来的数据存到缓存里,这样减少了io的次数,大大提高了效率。radis的学习大......
  • day17_进程管理
    linux资源管理篇昨日内容回顾1.先看状态,再去启动systemctlstatusfirewalldsystemctlrestartfirewalldsystemctllist-unit-files|grepfirewalld1.先理解服务的意思,服务,就是你安装的软件名字2.服务就是一个软件程序,会提供可用的命令,去操控这个软件3.firewall......
  • day19_软件包管理
    Linux软件包管理什么是软件,代码软件包顾名思义就是将应用程序、配置文件和数据打包的产物=======nginx_v.10.rpmyuminstallnginx-y=============先下载nginx.rpm软件包,然后yum自动帮你去安装了这个包/usr/bin/nginx/etc/nginx/nginc.conf配置文件,写了用于控制......
  • day18_系统资源管理
    今日内容英文单词的认识,需要大家自己逐步锻炼了,以后适当的加在考试题中作为练习关于作业,昨日知识,以后大家就把不会的作业题,发在各自小组,我来课下解决关于后台符&,如何用,才是真的实现,安全,可靠的后台运行。可以理解为,无论是用户正常注销登录如logout,如exit。-还是异常的......
  • 【贪心】P7403 [BalticOI 2002 Day1] Tennis Club
    目前题解区还没有证明,我交个证明。形式化题意给定每个点的度数\(d_i\),请构造一个简单无向图(无重边无自环)。First.无解首先,根据握手定理,每个无向图的度数之和为边数的两倍,所以如果度数之和为奇数,那么肯定无解。但是发现,这种情况之外还有别的无解情况(本题有\(3\)个无解数......
  • day16_防火墙服务
    基础服务管理防火墙是什么查找防火墙服务名的技巧[root@yuchao-linux01~]#systemctllist-units|grepfirefirewalld.serviceloadedactiverunningfirewalld-d......
  • day15_scp与ntp服务
    今日笔记,服务管理回顾systemctl你的机器,会有默认的软件(服务),network管理网络的软件,sshd提供远程连接的软件对这些服务,进行管理启动停止重启重新加载开机自启(持久化)禁止开机自启查询是否持久化(是否开机自启)centos7,用这个命令,同时对服务进行启停管理,以及开机自启......
  • day14_系统服务管理
    day13作业1.如何查看系统所有环境变量,且过滤出与root相关的变量。系统全局的,本身内置的变量+用户的变量===系统全局的变量set2.如何查看⽤户个⼈的环境变量,且过滤出与root相关的变量。3.解释下PS1变量,以及如何修改使⽤PS1。请注意,linux是区分大小写的,PS1set设置变量......