首页 > 其他分享 >23寒假集训二1月3号(单调队列+倍增)

23寒假集训二1月3号(单调队列+倍增)

时间:2023-01-10 22:13:22浏览次数:39  
标签:const 23 int sum 寒假 ans using include 集训

vjudge上面的题当天是我负责讲题所以写了一下博客,优先队列永远的敌人,一直没太整清楚

前置知识

倍增

//倍增
//给定一个数列,共有n个正数,现在有m次询问,每次询问给出一个t,求满足最小的k使得从第一个数到第k个数之和小于等于t;
#include<cstdio>
#include<iostream>

using namespace std;
const int maxn =1e5+10; 
int n,m;
int a[maxn];
int main()
{
 	cin >>n>>m;
 	for(int i=1;i<=n;i++)
 	{
  		cin >>a[i];
  		a[i] += a[i-1];
 	}
 	while(m--)
 	{
  		int t;
  		cin >>t;
  		int k=0,p=1;
  		while(p)
  		{
   			if(k+p>n)break;
   			if(a[k+p] <= t)k+=p,p*=2;
   			else p/=2;
  		}
    	cout <<k<<endl;
 	}
 return 0;
 } 

A - 切蛋糕

思路

推方程

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int sum[N], dq[N]; //dq表示模拟的一个双端队列,存的是坐标
int ans = -0x3fff;

int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	for (int i = 1, x; i <= n; i++) {
		scanf("%d", &x);
		sum[i] = sum[i - 1] + x;
	}
	int l = 1, r = 1;
	for (int i = 1; i <= n; i++) { //枚举i
		//更新答案
		while (dq[l] < i - m) {
			l++;
		}
		ans = max(ans, sum[i] - sum[dq[l]]);
		//如果存在递减的情况就删掉
		while (l <= r && sum[dq[r]] >= sum[i]) {
			r--;
		}
		dq[++r] = i;
	}
	printf("%d\n", ans);
	return 0;
}


B - 好消息,坏消息

思路

因为是一个环状的,所以扩大一倍数组 用sum[q[l]] - sum[k - 1] >= 0 表示没有<0的情况 -3 5 1 2 -3 5 12

-3 5 1 2 -3 5 1 2

-3 2 3 5 2 7 8 10

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int a[N], sum[N], q[N];

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
		a[i + n] = a[i];
	}
	int  m = n << 1;
	for (int i = 1; i <= m; i++) {
		sum[i] = sum[i - 1] + a[i];
	}
	int l = 1, r = 1, ans = 0;
	q[1] = 1;
	for (int i = 1; i <= m - 1; i++) {
		while (q[l] < i - n + 1)
			l++; //让头子在区间内
		//存在递增的情况
		while (l <= r && sum[i] <= sum[q[r]])
			r--;
		q[++r] = i;
		int k = i - n + 1;
		if (k > 0 && sum[q[l]] - sum[k - 1] >= 0) {
			ans++;
		}
	}
	printf("%d\n", ans);
	return 0;
}

C - 良好的感觉

思路

枚举i,ans[i]表示以a[i]为最小的子段的最大和

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
long long a[N], sum[N], ans[N], q[N];
long long Anss;

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
		sum[i] = sum[i - 1] + a[i];
	}
	int r = 0;
	q[r] = 0;
    //3 1 
    //q : 3 1
	for (int i = 1; i <= n; i++) {
		//查看是否可以更新之前的决策
		while (a[q[r]] >= a[i]) {
			ans[q[r]] += sum[i - 1] - sum[q[r]];
			r--;
		}
		//加入决策
		ans[i] = sum[i] - sum[q[r]];
		q[++r] = i;
	}
	for (int i = 1; i <= n; i++) {
		Anss = max(Anss, (long long)ans[i] * a[i]);
	}
	printf("%lld\n", Anss);
	return 0;
}

D - 机器翻译

思路

简单模拟

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
deque<int> dq;
int a[N];
bool inq[N];

int main() {
	int m, n;
	scanf("%d%d", &m, &n);
	int ans = 0;
	for (int i = 1, x; i <= n; i++) {
		scanf("%d", &x);
		if (inq[x])
			continue;
		ans++;
		if (dq.size() < m) {
			inq[x] = 1;
			dq.push_back(x);
		} else {
			inq[dq.front()] = 0;
			dq.pop_front();
			dq.push_back(x);
			inq[x] = 1;
		}
	}
	printf("%d\n", ans);
	return 0;
}

标签:const,23,int,sum,寒假,ans,using,include,集训
From: https://www.cnblogs.com/oddpointa/p/17041502.html

相关文章

  • VS Code调试Unity程序之2023最新版
    问题换了台开发机,重新安装了下开发环境。突然发现VisualStudioCode无法用来调试Unity了。明明流程都是按照Unity官方教程2023.1进行的,可在创建Launch.json文件时,死活出......
  • 2023年的第一个十天!不能继续浪费时间了...
    十天满打满算学了四天吧。中间和一个女生出去玩了三天,还挺开心的。(但我希望自己的2023年是好好学习的一年,哎)然后被喊去打扫了三天卫生,打扫卫生的时候我心里也是不愿意的,......
  • 2023/1/10 20221321杨渝学习打卡
    python入门学习学习链接https://www.bilibili.com/video/BV14r4y1k7F9/?spm_id_from=333.999.0.0&vd_source=a989a1afa6cb8b6527dd9bf059d71439if判断while循环布尔......
  • SOLIDWORKS 2023工程图和出详图新功能 创建更智能化 更高精度的工程详图
    工程图是传达您设计意图的重要文档,您设计的产品越复杂,越需要详细注释说明。SOLIDWORKS2023增强的工程图和出详图功能将帮助您创建更智能化、更高精度的工程详图,并且扩展新......
  • Cinema 4D 2023版图文安装教程及下载
    ​Cinema4D是一款专业的3D建模、动画、模拟和渲染解决方案软件。Cinema4D2023为所有Cinema4D用户带来了新的功能,并整合了整个Maxon家族的技术。该版本提供了最主要的功......
  • 寒假周报(二)
    寒假周报Date:2023年1月10日(周二)大致方向本周延续上周学习的知识数位dp和单调队列优化dp对相应的体型进行了练习,写了一些题目,用来来巩固。详细情况本周基本都是写题......
  • Bonitasoft认证绕过和RCE漏洞分析及复现(CVE-2022-25237)
    一、漏洞原理漏洞简述Bonitasoft是一个业务自动化平台,可以更轻松地在业务流程中构建、部署和管理自动化应用程序;Bonita是一个用于业务流程自动化和优化的开源和可扩展......
  • 2023 年汽车行业向好发展,火山引擎 VeDI 助力车企数智转型
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群2023年的汽车市场,预计能有一个向好的转型。据中汽协公布的2022年1-11月累计汽车销量......
  • 2023年汽车行业向好发展,火山引擎VeDI助力车企数智转型
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群2023年的汽车市场,预计能有一个向好的转型。据中汽协公布的2022年1-11月累计汽车销量数据,达到24......
  • 2023.1.9(Educational Codeforces Round 141 & NEERC2017)
    A.YetAnotherTournamentLinkhttps://codeforces.com/contest/1783/problem/CStatement除了你以外有\(n\)个人,编号为\(0\ton-1\),每个人有两个权值\(a_i\)和......