首页 > 其他分享 >寒假集训Day10

寒假集训Day10

时间:2024-01-30 16:25:00浏览次数:21  
标签:num 前缀 int sum 寒假 Day10 9001 矩形 集训

前缀和

https://www.luogu.com.cn/problem/P2280

一维前缀和

维护一个前缀和数组,使得每一个元素num[i]等于从a[1]到a[i]所有元素之和,一位前缀和非常好写。
这个时候如果我们要求某一区间[l,r]中所有元素的和,只需要用num[r]-num[l-1]即可

二维前缀和

我们用num[i][j]表示从(1,1)到(i,j),a数组的所有元素的和,这个如何操作呢,我们可以想象成求面积

我们需要求的是一个蓝色正方形的面积,蓝色正方形的面积就等于绿色加紫色,去掉重复部分的一个红色,最后加上没有加的这个元素
也就是num[i][j]=num[i-1][j]+num[i][j-1]-num[i-1][j-1]+a[i][j];
那么如果我的边长是定值m,如何求一个正方形的面积呢

比如我们要求一个绿色矩形的面积,我们还是采用割补的想法,绿色矩形的面积等于蓝色矩形减掉黄色矩形减掉紫色矩形,最后加回去一个重复的红色矩形部分
也就是ans = sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]
那么再看回这道题,这道题其实就是先构造一个二维前缀和数组,然后枚举点(x2,y2),找出最大值即可

#include <bits/stdc++.h>
using namespace std;
int a[9001][9001];
int n;
int m;
int b[9001][9001];
int main () {
	scanf("%d %d" ,&n,&m);
	for(int i = 1;i <= n; i++) {
		int x,y,z;
		scanf("%d %d %d" ,&x,&y,&z);
		a[x + 1][y + 1] += z;
	}
	for(int i = 1;i <= 5005; i++) {
		for(int j = 1;j <= 5005; j++) {
			b[i][j] = b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1] + a[i][j];
		}
	}
	int num = 0;
	for(int i = m; i <= 5005; i++) {
		for(int j = m;j <= 5005; j++) {
			num = max(num,b[i][j] - b[i - m][j] - b[i][j - m] + b[i - m][j - m]);
		}
	}
	printf("%d" ,num);
	return 0;
}

双指针

https://www.luogu.com.cn/problem/CF1793C
其实双指针与其说是算法,不如说是一种解决问题的想法和技巧
例如这道题,首先最重要的一点是他给出了一个1n的排列,因此1n一定是包含在这个序列里的
其次,就是,在区间大小不断减小的过程中,其最大值一定单调不升,最小值一定单调不降,所以每次我们只需要分别检查两个端点,不符合条件的话就缩短空间即可

#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000001] = { };
int l,r;
int mi,ma;
int t;
int main () {
	scanf("%d" ,&t);
	while(t--) {
		scanf("%d" ,&n);
		l = 1;
		r = n;
		for(int i = 1;i <= n; i++) {
			scanf("%d" ,&a[i]);
		}
		mi = 1;
		ma = n;
		while(l <= r) {
			if(a[l] == ma) {
				l++;
				ma--;
				continue;
			}
			else if(a[l] == mi) {
				l++;
				mi++;
				continue;
			}
			else if(a[r] == ma) {
				r--;
				ma--;
				continue;
			}
			else if(a[r] == mi) {
				r--;
				mi++;
				continue;
			} else break;
		}
		if(l > r) printf("-1\n");
		else printf("%d %d\n" ,l,r);
		//memset(a,0,sizeof(a));
	}
}

标签:num,前缀,int,sum,寒假,Day10,9001,矩形,集训
From: https://www.cnblogs.com/Crazyman-W/p/17986774

相关文章

  • 寒假生活指导22
    今天尝试使用hutool对自己的oss进行下载。<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version></dependency>packages......
  • 寒假学习15
    今天接着学习声音转换训练: 点击脚本可以查看转换进度: http://localhost:6006/在转换声音数据的时候显示错误 问了问gpt:还是无法解决。......
  • 大三寒假学习进度笔记20
    今日对LangChain进行了一些了解。LangChain是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型(LLM)和聊天模型提供支持的应用程序的过程。LangChain可以轻松管理与语言模型的交互,将多个组件链接在一......
  • 1.29寒假每日总结20
    将你的Python代码打包成一个exe文件,方便其他人在没有安装Python环境的情况下运行,可以使用PyInstaller或cx_Freeze等工具将其打包成可执行文件。以下是使用PyInstaller的步骤:首先,确保你已经安装了PyInstaller。你可以使用以下命令在终端或命令提示符中进行安装:CopyCodepipi......
  • 2024.1.29寒假每日总结20
    算法题:514.自由之路-力扣(LeetCode)将你的Python代码打包成一个exe文件,方便其他人在没有安装Python环境的情况下运行,可以使用PyInstaller或cx_Freeze等工具将其打包成可执行文件。以下是使用PyInstaller的步骤:首先,确保你已经安装了PyInstaller。你可以使用以下命令在终端或命......
  • 六至水土,出水土记,一千言,写在寒假集训的最后几页
    前言写这篇回忆入魔咕咕了其他随笔忘了吃饭了所以也不是上课摸鱼吧写一些平平淡淡的事可能有些个人色彩了假如就是一个平行世界的水土和xndxfz吧不想看就不看都挺好多年前一至水土重庆卖的房子比较多价格也在涨我爸的一个高中同学是房屋中介公司和水土某楼盘有合作......
  • 2024寒假集训日记
    1.27闲话做题纪要CF1433ETwoRoundDances详见CF1433ETwoRoundDances题解。CF739AAlyonaandmex详见CF739AAlyonaandmex题解。1.28闲话做题纪要luoguP1993小K的农场详见【学习笔记】差分约束。luoguP3275[SCOI2011]糖果详见【学习笔......
  • 寒假生活指导21
    #!/usr/bin/envpython#-*-coding:utf-8-*-#------------------------------''''''USER_AGENT_LIST=['Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;HotLingo2.0)','Mozilla/5.......
  • 2024年1-2月寒假读书会【大国大城--专题一:区域与城市】
    2024年1-2月寒假读书会【大国大城--专题一:区域与城市】       ......
  • 第一次 10天校内集训总结
    这十天,作为第一次在校集训,无疑即是高效的,也是收获满满的;首先,我十分感谢Lyn学长十天以来的辛勤付出然鹅在这十天以来也发现了不少问题;1.与题解的抗争可能是由于学长的速度有些快,而且本人在秋季培训中也没有太过认真的打下一个所谓牢靠的基石(根本原因);因而除了在开始复习语言基......