首页 > 其他分享 >AtCoder Regular Contest 134 D Concatenate Subsequences

AtCoder Regular Contest 134 D Concatenate Subsequences

时间:2023-05-04 13:33:53浏览次数:54  
标签:Concatenate AtCoder typedef Contest int long tv

洛谷传送门

AtCoder 传送门

我一年前甚至不会做/qd

发现 \(a_{x_1}\) 为 \(k = \min\limits_{i=1}^n a_i\) 时最优。然后开始分类讨论:

  • 如果 \(\min\limits_{a_i = k} a_{i+n} \le k\),答案为 \((k, \min\limits_{a_i = k} a_{i+n})\)。这是因为如果再选一个 \(k\) 肯定不优。
  • 否则我们肯定尽可能先把 \(k\) 选完。接下来讨论最后一个 \(k\) 的位置直到 \(n\) 还能不能再选。设 \(p\) 为第一个 \(a_p = k\) 的位置。
    • 每次选的数要保证 \(\le a_{p+n}\) 且是当前区间内的最小值,不然不优。
    • 当当前区间内最小值 \(= a_{p+n}\) 时有些特殊。如果 \(a_{p+n}\) 大于它后面被选的第一个 \(\ne a_{p+n}\) 的数,或者它后面不存在 \(\ne a_{p+n}\) 的数,那么选了这个区间最小值也不优。

实现时使用 ST 表查询区间最小值,复杂度 \(O(n \log n)\)。

code
// Problem: D - Concatenate Subsequences
// Contest: AtCoder - AtCoder Regular Contest 134
// URL: https://atcoder.jp/contests/arc134/tasks/arc134_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<int, int> pii;

const int maxn = 200100;
const int logn = 20;
const int inf = 0x3f3f3f3f;

int n, a[maxn], lg[maxn];
pii f[maxn][logn];

inline pii qmin(int l, int r) {
	int k = lg[r - l + 1];
	return min(f[l][k], f[r - (1 << k) + 1][k]);
}

void solve() {
	scanf("%d", &n);
	for (int i = 2; i <= n * 2; ++i) {
		lg[i] = lg[i >> 1] + 1;
	}
	for (int i = 1; i <= n * 2; ++i) {
		scanf("%d", &a[i]);
		if (i <= n) {
			f[i][0] = make_pair(a[i], i);
		}
	}
	for (int j = 1; (1 << j) <= n; ++j) {
		for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
			f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
		}
	}
	int mn = *min_element(a + 1, a + n + 1), pos = -1, t = inf;
	for (int i = 1; i <= n; ++i) {
		if (a[i] == mn) {
			t = min(t, a[i + n]);
		}
	}
	if (t <= mn) {
		printf("%d %d\n", mn, t);
		return;
	}
	vector<int> vc, tv;
	for (int i = 1; i <= n; ++i) {
		if (a[i] == mn) {
			vc.pb(i);
			pos = i;
			tv.pb(a[i + n]);
		}
	}
	int x = -1;
	for (int i = 0; i < (int)tv.size(); ++i) {
		if (tv[i] != tv[0]) {
			x = tv[i];
			break;
		}
	}
	while (pos < n) {
		pii p = qmin(pos + 1, n);
		if (p.fst > tv[0] || (p.fst == tv[0] && tv[0] > x)) {
			break;
		}
		vc.pb(p.scd);
		pos = p.scd;
	}
	for (int x : vc) {
		printf("%d ", a[x]);
	}
	for (int x : vc) {
		printf("%d ", a[x + n]);
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:Concatenate,AtCoder,typedef,Contest,int,long,tv
From: https://www.cnblogs.com/zltzlt-blog/p/17370951.html

相关文章

  • AtCoder Beginner Contest 300
    A-N-choicequestion#include<bits/stdc++.h>usingnamespacestd;intread(){intx=0,f=1,ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-......
  • AtCoder Regular Contest 128 D Neq Neq
    洛谷传送门AtCoder传送门考虑把所有\(a_i=a_{i+1}\)的位置断开,分别计算然后把方案数乘起来。接下来的讨论假设\(a_i\nea_{i+1}\)。考虑一个dp,设\(f_i\)为\([1,i]\)最后剩下的集合的方案数。转移显然是\(f_i\getsf_i+f_j\),但是需要满足\((a_j,a_{j+1},...,......
  • AtCoder Beginner Contest 242(D,E)
    AtCoderBeginnerContest242(D,E)D(二叉树搜索)D题目大意就是首先给你一个字符串,代表\(S^0\),然后我们可以操作得到\(S^1,S^2\)等等我们可以知道\(S^i\)是拿\(S^(i-1)\)经过一系列替换而来的,因为这个字符串只有三种字符串,\(A,B,C\),这个替换方式就是把\(A\)替换成\(BC\),把\(B\)......
  • AtCoder Regular Contest 125 F Tree Degree Subset Sum
    洛谷传送门AtCoder传送门首先将度数\(-1\)。设\(f_i\)为体积为\(i\)至多能用几个物品凑出来,\(g_i\)为至少。我们现在要证明一个东西:\(x\in[g_i,f_i]\),\((i,x)\)合法。首先若\((s,x)\)合法,那么必须满足\(s-x\in[-z,z-2]\),其中\(z=\sum\limits_{i=1}......
  • AT_abc106_d [ABC106D] AtCoder Express 2 题解
    题目传送门解题思路区间\(dp\)。划分阶段:以左右城市之间的列车数量为阶段。状态表达:设\(f_{i,j}\)为城市\(i\)与城市\(j\)之间的列车数量。状态转移:由图可知,城市\(l\)与城市\(r\)之间的列车数量,就是城市\(l\)与城市\(r-1\)之间的列车数量与城市\(l+1\)与......
  • AtCoder Regular Contest 119 F AtCoder Express 3
    洛谷传送门AtCoder传送门很厉害的题!考虑所有车站已确定,如何求\(0\)到\(n+1\)的最短路。设\(g_{i,0}\)为只考虑\(0\simi\)的点,到\(i\)和它左边第一个\(\text{A}\)的最短路,\(g_{i,1}\)同理。有转移:若\(s_{i-1}=\text{A},s_i=\text{A},g_{i,0}\getsg_{......
  • AtCoder Regular Contest 119 D Grid Repainting 3
    洛谷传送门AtCoder传送门对每个红格的行和列连边,建出二分图。对于二分图中的每个连通块分别考虑。大胆猜测对于每个连通块,我们都能够进行适当的操作,使得只有一行/一列没被操作(显然不能使所有行和列都被操作)。对应的方案就是随便取一棵生成树,把不被染白的那一行/列拎出来当根,然......
  • AtCoder Regular Contest 117 F Gateau
    洛谷传送门AtCoder传送门差分约束算法:给出\(m\)个不等式形如\(x_{a_i}\lex_{b_i}+y_i\),求是否有解。考虑把不等式看成图上的三角不等式\(dis_v\ledis_u+d\),连边\((b_i,a_i,y_i)\),以\(x_i\)最大的位置跑最短路,如果图中有负环就无解。此时求出来的\(dis_i\)......
  • 2023 Hubei Provincial Collegiate Programming Contest题解 C F H I J K M
    补题链接:https://codeforces.com/gym/104337原文链接:https://www.eriktse.com/algorithm/1136.htmlM.DifferentBilling签到题,写几个柿子然后枚举B或C即可。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;signedmain(){ ios::sync_with_stdio(......
  • Atcoder Grand Contest 059 E - Grid 3-coloring(转化+思维)
    首先先是一步很猛的操作——将三染色视作构造一个矩阵使得相邻元素相差\(1\)且每个元素\(\bmod3\)的值就等于其颜色。证明是显然的,我们按从上到下从左到右的顺序填数,可以归纳证明,对于一个相邻格子颜色互不相同的矩阵的填数方案,处于斜对角的两个格子上写的数要么差\(2\),要么......