首页 > 其他分享 >AtCoder Beginner Contest 221 G Jumping sequence

AtCoder Beginner Contest 221 G Jumping sequence

时间:2023-06-17 11:55:05浏览次数:51  
标签:AtCoder typedef Beginner sequence int Contest long define

洛谷传送门

AtCoder 传送门

这个数据范围让我们不得不往背包想。

但是两维相互限制。考虑坐标系旋转 \(45°\),转化为两维不相互限制。

那我们现在相当于要安排正负号,使得 \(\sum\limits_{i = 1}^n \pm d_i\) 等于一个给定的值 \(K\)。

考虑两边加上 \(\sum\limits_{i = 1}^n d_i\) 并除以 \(2\),转化为纯粹的 01 背包问题。

bitset 优化即可。时间复杂度 \(O(\frac{n \sum\limits_{i = 1}^n d_i}{w})\)。

code
// Problem: G - Jumping sequence
// Contest: AtCoder - AtCoder Beginner Contest 221
// URL: https://atcoder.jp/contests/abc221/tasks/abc221_g
// Memory Limit: 1024 MB
// Time Limit: 5000 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 double db;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 2020;
const int maxm = 3600100;

int n, A, B, a[maxn], b[maxn];
bitset<maxm> f[maxn];

void solve() {
	scanf("%d%d%d", &n, &A, &B);
	int s = 0;
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
		s += a[i];
	}
	int x = A - B, y = A + B;
	A = x;
	B = y;
	if (((A + s) & 1) || ((B + s) & 1)) {
		puts("No");
		return;
	}
	A = (A + s) / 2;
	B = (B + s) / 2;
	if (A < 0 || B < 0) {
		puts("No");
		return;
	}
	f[0][0] = 1;
	for (int i = 1; i <= n; ++i) {
		f[i] = (f[i - 1] << a[i]) | f[i - 1];
	}
	if (!f[n].test(A) || !f[n].test(B)) {
		puts("No");
		return;
	}
	puts("Yes");
	for (int i = n; i; --i) {
		if (!f[i - 1].test(A)) {
			A -= a[i];
			b[i] |= 2;
		}
		if (!f[i - 1].test(B)) {
			B -= a[i];
			b[i] |= 1;
		}
	}
	for (int i = 1; i <= n; ++i) {
		putchar(b[i] == 0 ? 'L' : (b[i] == 1 ? 'U' : (b[i] == 2 ? 'D' : 'R')));
	}
}

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

标签:AtCoder,typedef,Beginner,sequence,int,Contest,long,define
From: https://www.cnblogs.com/zltzlt-blog/p/17487299.html

相关文章

  • AtCoder Beginner Contest 294 E
    AtCoderBeginnerContest294E-2xNGridProblemStatement题意:给你\(2\)行长度为\(L\)的矩阵。告诉你格子里面的数字,以\(vi\)\(li\)的形式:\(vi\)有\(li\)个问上下两个一样的有多少个?解释:以样例为例输入84312322331142133输出4第$1,$2,\(5\),8个上......
  • AtCoder Beginner Contest 291 DEF
    AtCoderBeginnerContest291D-FlipCardsProblemStatement题意:\(N\)张卡片,编号\(1\)到\(N\),每张卡片有正反两面,写有数字,初始状态都是正面朝上。考虑每张卡片的翻转情况,选择翻或者不翻,求是的相邻两张卡片的数字不同,求方案数,答案模\(998244353\)Solution题解:求方案数,想......
  • AtCoder Beginner Contest 302 ABCDEF
    AtCoderBeginnerContest302A-AttackProblemStatement题意:敌人有\(A\)的耐力值,每次攻击敌人可以减少\(B\)的耐力值,问多少次敌人耐力值\(<=0\)?Solution题解:\(\dfrac{a}{b}\)上取整。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){......
  • AtCoder Beginner Contest 305 ABCDE
    AtCoderBeginnerContest305A-WaterStationProblemStatement题意:水站每\(5km\)设一个,给你一个\(N\)\(km\)的位置,问你离它最近的水站位置。Solution题解:模5在乘5,比较给出的点的左边和右边的点,取min#include<bits/stdc++.h>usingnamespacestd;intmain(){ int......
  • AtCoder Beginner Contest 253 Ex We Love Forest
    洛谷传送门AtCoder传送门没做出来。考虑求出方案数后除以\(m^i\)求出概率。设\(U=\{1,2,...,n\}\)。因为题目限制了加几条边,不妨设\(f_{i,S}\)为,加了\(i\)条边,\(S\)形成森林且\(U\setminusS\)没有边的方案数。转移枚举子集\(T\),钦定\(T\)为树,设\(T\)......
  • AtCoder Beginner Contest 298 Ex Sum of Min of Length
    洛谷传送门AtCoder传送门挺无脑的。是不是因为unr所以评分虚高啊/qd考虑把\(L_i\toR_i\)的路径拎出来,那么路径中点(或中边)左边的点挂的子树到\(L_i\)更优,右边的点挂的子树到\(R_i\)更优。差分一下,可以转化成\(O(q)\)次询问,每次询问形如\((u,v)\)表示求\(v\)......
  • AtCoder Beginner Contest 251 G Intersection of Polygons
    洛谷传送门AtCoder传送门经典结论,一个点\(P(x,y)\)在一个凸多边形内部\(S=\{(x_i,y_i)\}\)的充要条件是\(\foralli\in[1,n],(x_{i+1}-x_i,y_{i+1}-y_i)\times(x-x_i,y-y_i)\ge0\),其中\(S\)的点按照逆时针排列。然后我们运用叉积的一个性质......
  • AtCoder Beginner Contest 220 G Isosceles Trapezium
    洛谷传送门AtCoder传送门简单题。首先肯定是要枚举梯形其中一条底边的两个端点的。那么另一条底边除了斜率与这条边相等,两个端点的距离要分别与这条底边两个端点的距离相等。发现这个十分不好做,考虑一个梯形是等腰梯形的一个充要条件。不难想到,连接两底中点,这条线段垂直于两......
  • AtCoder Beginner Contest 249 G Xor Cards
    洛谷传送门AtCoder传送门好题。套路地,考虑枚举最优解的\(a\)异或和二进制下与\(k\)的\(\text{LCP}\),设在第\(i\)位不同。这样的好处是\(i\)之后的位可以随便选。之后按位贪心确定最优解\(b\)的异或和。考虑之前的答案是\(res\),当前在确定第\(j\)位,如何判断\(r......
  • AtCoder Beginner Contest 305 题解 A - F
    A-WaterStation题目大意找到离给定的数最近的一个\(5\)的倍数输出即可。解题思路我们取这个数对\(5\)的上下界,也就是整数除以\(5\)再乘以\(5\),以及这个数再加上一个\(5\),比较这两数和给定数的距离即可。ACCode#include<iostream>#include<algorithm>#includ......