首页 > 其他分享 >AtCoder Beginner Contest 303 G Bags Game

AtCoder Beginner Contest 303 G Bags Game

时间:2023-05-28 19:22:23浏览次数:44  
标签:AtCoder typedef Beginner Contest long maxn Bags define

洛谷传送门

AtCoder 传送门

经典题,考虑区间 dp,\(f_{l,r}\) 表示只考虑 \([l, r]\) 区间,先手得分减后手得分最大值。

对于第一种操作直接 \(f_{l,r} \gets \max(a_l - f_{l+1,r}, a_r - f_{l,r-1})\),第二种操作,考虑枚举 \([l,r]\) 长为 \(r - l + 1 - B\) 的子段,即可转移。第三种操作同理。

那么我们得到了一个 \(O(n^3)\) 的做法。考虑优化。发现瓶颈在于枚举子段。发现因为子段长度固定,所以可以直接查固定区间长度的形似 \(f_{p,p+k-1}\) 的最大值。考虑使用 ST 表,按区间长度从小到大计算每个 \(f_{l,r}\),当一个长度的区间都计算完了,就把它们扔给 ST 表预处理。

时空复杂度均为 \(O(n^2 \log n)\)。

code
// Problem: G - Bags Game
// Contest: AtCoder - NS Solutions Corporation Programming Contest 2023(AtCoder Beginner Contest 303)
// URL: https://atcoder.jp/contests/abc303/tasks/abc303_g
// Memory Limit: 1024 MB
// Time Limit: 2500 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<ll, ll> pii;

const int maxn = 3030;

ll n, A, B, C, D, a[maxn], f[maxn][maxn], b[maxn], c[maxn], lg[maxn];

struct ST {
	ll f[maxn][12];
	
	void build() {
		for (int i = 1; i <= n; ++i) {
			f[i][0] = c[i];
		}
		for (int j = 1; (1 << j) <= n; ++j) {
			for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
				f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
			}
		}
	}
	
	inline ll query(int l, int r) {
		int k = lg[r - l + 1];
		return max(f[l][k], f[r - (1 << k) + 1][k]);
	}
} t[maxn];

void solve() {
	scanf("%lld%lld%lld%lld%lld", &n, &A, &B, &C, &D);
	for (int i = 2; i <= n; ++i) {
		lg[i] = lg[i >> 1] + 1;
	}
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
		f[i][i] = a[i];
		b[i] = b[i - 1] + a[i];
		c[i] = b[i - 1] - b[i] - f[i][i];
	}
	t[1].build();
	for (int p = 2; p <= n; ++p) {
		mems(c, 0);
		for (int i = 1, j = p; j <= n; ++i, ++j) {
			f[i][j] = max(a[i] - f[i + 1][j], a[j] - f[i][j - 1]);
			if (p <= B) {
				f[i][j] = max(f[i][j], b[j] - b[i - 1] - A);
			} else {
				f[i][j] = max(f[i][j], b[j] - b[i - 1] - A + t[p - B].query(i, i + B));
			}
			if (p <= D) {
				f[i][j] = max(f[i][j], b[j] - b[i - 1] - C);
			} else {
				f[i][j] = max(f[i][j], b[j] - b[i - 1] - C + t[p - D].query(i, i + D));
			}
			c[i] = b[i - 1] - b[j] - f[i][j];
		}
		t[p].build();
	}
	printf("%lld\n", f[1][n]);
}

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

标签:AtCoder,typedef,Beginner,Contest,long,maxn,Bags,define
From: https://www.cnblogs.com/zltzlt-blog/p/17438702.html

相关文章

  • AtCoder Beginner Contest 298(D,F)
    AtCoderBeginnerContest298(D,F)D(思维,模拟,快速幂)D大意是最初有一个数字\(1\),然后进行\(q\)个操作有三种操作\(1\),输入\(1,x\),在原来的数字后面添加一个尾数,例如原本的数是\(12\),输入了\(15\),数字变成了\(125\)\(2\),输入\(2\),把原来的数字第一位数删除,例如原本的数是......
  • AtCoder Beginner Contest 299(E,F)
    AtCoderBeginnerContest299(E,F)E(最短路)E题目大意为有\(n\)个点和\(m\)条边,我们我个这些点匹配颜色(有两种颜色),但是要满足下面的条件必须由一个点的颜色是\(1\)然后给出\(k\)点限制对于\(p_i\)这一个点,离他最近的一个颜色为\(1\)的点的最近距离为\(d_i\)既然知道某个点......
  • Atcoder Grand Contest 062 D - Walk Around Neighborhood
    csy/bxwjz/bx首先将\(a\)排序,如果\(\sum\limits_{i=1}^{n-1}a_i<a_n\)显然就是\(-1\),否则必然有解。先发现一个trivial的事情,就是答案一定位于\([\dfrac{a_n}{2},a_n]\)中,这是因为我们判掉无解的条件之后,我们必然可以用前面的步数走到以\((a_n,0),(0,a_n),(-a_n,0),(......
  • AtCoder Regular Contest 139 E Wazir
    洛谷传送门AtCoder传送门好题。这种题一般可以考虑,观察最优解的性质,对于性质计数。发现如果\(n,m\)均为偶数,可以放满。就是类似这样:#.#.#..#.#.##.#.#..#.#.#因此答案就是\(2\)。如果\(n,m\)有一个为偶数,不妨假设\(n\)为偶数。那么最优解形似:#.#...#..##..#......
  • 【atcoder begin 302】【e题 Isolation 】JAVA的快速输入输出
    importjava.io.*;importjava.util.HashSet;importjava.util.Set;/***@authorfishcanfly*/publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{//BufferedReaderbr=newBufferedReader(newInputStreamReader(......
  • AtCoder Beginner Contest 300(E,F)
    AtCoderBeginnerContest300(E,F)E(概率dp)E这个题意大致就是一开始有一个初始数\(x\)为\(1\),然后我们有一个骰子,最后得到的点数概率一样,为\(\frac{1}{6}\),如果这一次得到的点数为\(i\),那么\(x\)会变成\(i\timesx\),问最后得到数\(n\)的概率为多少先感性的分析一波,对于......
  • AtCoder Regular Contest 146 D >=<
    洛谷传送门AtCoder传送门考虑直接增量构造。把条件拆成形如\(a_u\gex\)时\(a_v\gets\max(a_v,y)\),连边,跑类似一个spfa的东西,就行了。这样一定能构造出一组和最小的解。code//Problem:D->=<//Contest:AtCoder-AtCoderRegularContest146//URL:http......
  • AtCoder Beginner Contest 193 F Zebraness
    洛谷传送门AtCoder传送门复习一下最小割。考虑翻转横纵坐标和为奇数的颜色,那么就变成了,相邻两个格子,相同颜色产生\(1\)的贡献。一眼P4313文理分科。每个格子被分到\(S\)表示染黑,分到\(T\)表示染白。对于每两个相邻格子,建两个虚点,分别表示它们都染黑或者都染白的情况......
  • AtCoder Beginner Contest 302 H. Ball Collector 题解
    AtCoderBeginnerContest302H.BallCollector题意跳过。可以视作将\(a_i,b_i\)之间连了一条边,然后\(a_i,b_i\)之间只能选一个等价于对于一条边只能选择其一个端点。那么对于只包含树的联通块而言,如果都选择儿子节点,那么会有一个根节点无法被选择上;而对于包含至少一个......
  • AtCoder Beginner Contest 302(E,F,G)
    AtCoderBeginnerContest302(E,F,G)E(图,set)E这个题意大致为一开始给出\(n\)个点,没有一条边,后面陆续会有\(q\)次操作,以下两种方式\(1\),输入两个点,代表连接这两个点\(2\),输入一个点,意在把所有和这个点相连的边都删除每一次操作后我的都需要知道操作后还有多少个孤立无援的点(没......