Atcoder Beginnner Contest 440

Atcoder Beginnner Contest 440

  • Solved:4/7
  • Ranking:1373

A.Octave

题目描述

给定X和Y,输出X乘上Y个2之后的结果

B.Trifecta

题目描述

给定n个数,输出其中第一小、第二小和第三小的数所在的下标

题解

结构体排序输出前三个元素的下标即可

C.Striped Horse

题目描述

给定n个块,每个块被涂成黑色花费整数CiC_iCi,执行以下步骤把一些块涂成黑色:

  • 任选一个正整数x

  • 把所有满足(i+x)%2W<W(i+x) \%2W < W(i+x)%2W<W的位置i涂成黑色

最小化总花费,T组数据

数据范围

  • 1≤T,N,W≤2×1051 \leq T,N,W \leq 2\times 10^51≤T,N,W≤2×105
  • 1≤Ci≤1091 \leq C_i \leq 10^91≤Ci≤109
  • ∑N≤2×105\sum N \leq 2 \times 10^5∑N≤2×105
  • ∑W≤2×105\sum W \leq 2 \times 10^5∑W≤2×105

思路

问题等价于把i%2Wi \% 2Wi%2W落在某个长度为W的循环区间之内的格子全部涂黑

这样就可以令M=2W,统计每个余数类r∈0,M−1r \in 0,M - 1r∈0,M−1上所有格子的代价:
costr=∑1≤i≤N,i  mod  M=rCi costr = \sum_{1 \leq i \leq N, i \; mod \; M = r} C_i costr=1≤i≤N,imodM=r∑Ci

则选x就等价于选出一个起点s∈0,M−1s \in 0,M-1s∈0,M−1,涂黑余数在s,s+M−1s,s+M-1s,s+M−1下的那些类,代价就是该区间cost的和,最终答案是长度为W的循环滑动窗口的最小和

时间复杂度:每组O(N+W)O(N + W)O(N+W),则总时间复杂度为O(N+W)O(N+W)O(N+W)

代码

c++ 复制代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[400010];
ll s[800010];
int main () {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int T;
	cin >> T;
	while(T --) {
		int n, m;
		cin >> n >> m;
		int mod = m << 1;
		for(int i = 0;i <= mod;i ++) a[i] = 0;
		for(int i = 0;i <= mod * 2 + 1;i ++) s[i] = 0;
		for(int i = 1;i <= n;i ++) {
			int x;
			cin >> x;
			int r = i % mod;
			a[r] += x;
		}
		
		for(int i = 1;i <= 2 * mod;i ++) {
			s[i] = s[i - 1] + a[(i - 1) % mod];
		}
		ll ans = LLONG_MAX;
		for(int i = 0;i < mod;i ++) {
			ans = min(ans,s[i + m] - s[i]);
		}
		cout << ans << endl;
	}
	return 0;
}

TLE了一下:用了memset赋初值

D.Forbidden List 2

题目描述

给定N个不同的整数AiA_iAi,给定Q个问题,每个问题j会询问大于等于XjX_jXj中不在A数组内的第YjY_jYj小是多少?

数据范围

  • 1≤N,Q≤3×1051 \leq N,Q \leq 3 \times 10^51≤N,Q≤3×105
  • 1≤Ai,Xj,Yj≤1091 \leq A_i,X_j,Y_j \leq 10^91≤Ai,Xj,Yj≤109

思路

把数组A排序,设BiB_iBi表示不大于AiA_iAi的缺失值个数,且B单调不降,则Bi=Ai−iB_i= A_i - iBi=Ai−i

对于每个询问(x,y)(x,y)(x,y):

  • 令pos表示A中大于等于x的数的下标
  • k = (x - 1) - pos + y,表示把问题转化为全局第k个缺失的正整数
  • res表示找B中第一个满足大于等于k的位置
  • 则答案为k + res

式子是怎么来的?

对于一个x,missing(x)=x-cnt,cnt表示A中小于等于x的个数。

而对于第k个缺失的数mk,missing(mk)=k,而missing(x)=x-cnt,所以mk-cnt=k,所以mk=k+cnt

时间复杂度:O((N+Q)logN)O((N+Q)logN)O((N+Q)logN)

代码

c++ 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
int a[N];
int b[N];
int main () {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int n, q;
	cin >> n >> q;
	for(int i = 1;i <= n;i ++) {
		cin >> a[i];
	}
	sort(a + 1,a + n + 1);
	for(int i = 1;i <= n;i ++) {
		b[i] = a[i] - i;
	}
	while(q --) {
		int x, y;
		cin >> x >> y;
		int pos = lower_bound(a + 1,a + n + 1, x) - a - 1;
		int k = x + y - pos - 1;
		int res = lower_bound(b + 1,b + n + 1, k) - b - 1;
		cout << k + res << endl;
	}
	return 0;
}
相关推荐
牧羊人.3332 分钟前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
小郎君65834 分钟前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7771 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚1 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
专注仿真1 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练
FII工业富联科技服务1 小时前
多智能体如何进入制造现场?从业务协同到数字孪生验证
大数据·人工智能·算法·机器人·制造·数字孪生
≮傷£≯√2 小时前
httpserver_QNetWorkClient
算法
Evand J2 小时前
【PMSM例程11】永磁同步电机(PMSM)基于UKF的转速与转子位置估计。附下载链接
算法·matlab·卡尔曼滤波·永磁同步电机·ukf·pmsm·位置估计
货拉拉技术2 小时前
记忆即智能:重构对话式AI Agent认知基座的四层渐进式记忆与自进化系统
人工智能·算法
杜 硕2 小时前
从零开始的C++生活——第六讲——02
c++·算法·生活