首页 > 其他分享 >Codeforces 585D Lizard Era: Beginning

Codeforces 585D Lizard Era: Beginning

时间:2023-07-03 17:14:23浏览次数:41  
标签:585D return val int Codeforces mid Lizard mp Beginning

很容易想到可以对于每个任务选不去的那一个人进行搜索,时间复杂度 \(O(3^n)\),明显过不了。
发现 \(n\le 25,\lceil \frac{n}{2}\rceil\le 13\),且各个任务间不会互相影响,便可以用折半搜索分成 \(2\) 部分来搜最后来合并。

考虑如何合并两部分,令前一部分得到的值分别为 \(a, b, c\),后一部分得到的值分别为 \(a', b', c'\),若合法则有 \(a + a' = b + b' = c + c'\)。
做差得到新的等式 \(a - b = b' - a', a - c = c' - a'\),则可以后半部分以 \((b' - a', c' - a')\) 来查找前半部分中的 \((a - b, a - c)\),记录一下 \(2\) 个部分的 \(a,a'\),求和即可。
对于方案输出,搜索时记录一下不选的数得出剩下选的数即可。

时间复杂度 \(O(3^{\lfloor \frac{n}{2}\rfloor}\log_2 3^{\lceil \frac{n}{2}\rceil})\)。

// lhzawa(https://www.cnblogs.com/lhzawa/)
// Problem: D. Lizard Era: Beginning
// Contest: Codeforces - Codeforces Round 325 (Div. 1)
// URL: https://codeforces.com/problemset/problem/585/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
const int N = 30;
int n, mid;
int val[N][3];
map<pair<int, int>, pair<int, int> > mp;
int ans[N];
void dfs1(int w, int a, int b, int c, int s) {
	if (w > mid) {
		if (! mp.count({a - b, a - c})) {
			mp[{a - b, a - c}] = {a, s};
		}
		else if (a > mp[{a - b, a - c}].first) {
			mp[{a - b, a - c}] = {a, s};
		}
		return ;
	}
	dfs1(w + 1, a + val[w][0], b + val[w][1], c, s * 3 + 2);
	dfs1(w + 1, a + val[w][0], b, c + val[w][2], s * 3 + 1);
	dfs1(w + 1, a, b + val[w][1], c + val[w][2], s * 3 + 0);
	return ;
}
int p1, p2, pmax = INT_MIN;
void dfs2(int w, int a, int b, int c, int s) {
	if (w > n) {
		if (mp.count({b - a, c - a})) {
			if (mp[{b - a, c - a}].first + a > pmax) {
				pmax = mp[{b - a, c - a}].first + a, p1 = mp[{b - a, c - a}].second, p2 = s;
			}
		}
		return ;
	}
	dfs2(w + 1, a + val[w][0], b + val[w][1], c, s * 3 + 2);
	dfs2(w + 1, a + val[w][0], b, c + val[w][2], s * 3 + 1);
	dfs2(w + 1, a, b + val[w][1], c + val[w][2], s * 3 + 0);
	return ;
}
int main() {
	scanf("%d", &n);
	mid = (1 + n) >> 1;
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%d", &val[i][j]);
		}
	}
	dfs1(1, 0, 0, 0, 0);
	dfs2(mid + 1, 0, 0, 0, 0);
	if (pmax != INT_MIN) {
		for (int i = mid; i; i--) {
			ans[i] = p1 % 3, p1 /= 3;
		}
		for (int i = n; i > mid; i--) {
			ans[i] = p2 % 3, p2 /= 3;
		}
		for (int i = 1; i <= n; i++) {
			if (ans[i] != 0) {
				printf("L");
			}
			if (ans[i] != 1) {
				printf("M");
			}
			if (ans[i] != 2) {
				printf("W");
			}
			printf("\n");
		}
	}
	else {
		printf("Impossible");
	}
	return 0;
}

标签:585D,return,val,int,Codeforces,mid,Lizard,mp,Beginning
From: https://www.cnblogs.com/lhzawa/p/17523368.html

相关文章

  • Beginning QA --- Basics and Related Concepts
    基本概念什么是QA?质量保证是以过程为中心的保证一个组织能够提供高质量产品的方法。什么是测试?为什么需要测试?测试是发现和标记缺陷的过程。所谓的缺陷是指实际结果和期望结果之间的任何差别。有的地方,测试也被认为是执行以找出错误为目的的程序的过程。测试是为了让产品达到以下......
  • HDU 2732 Leapin' Lizards(最大流)
    题意:给你一个网格,网格上的一些位置上有一只蜥蜴,所有蜥蜴的最大跳跃距离是d,如果一只蜥蜴能跳出网格边缘,那么它就安全了.且每个网格有一个最大跳出次数x,即最多有x只蜥蜴从这个网格跳出,这个网格就再也不能有蜥蜴进来了.问你最少有多少只蜥蜴跳不出网格.思路:和POJ3498差不多.........
  • Yuzuki Lizard 全志V851S开发板 –移植 QT5.12.9教程
    移植QT5教程(此教程基于docker版V851S开发环境)dockerpullregistry.cn-hangzhou.aliyuncs.com/gloomyghost/yuzukilizard编译依赖apt-getinstallrepogitgcc-arm-linux-gnueabihfu-boot-toolsdevice-tree-compilermtools\partedlibudev-devlibusb-1.0-0-devpython......
  • AtCoder Beginner Contest 283 - a new beginning
    许久没有写过博客了,让2023成为一个新的起点,重新开始写博客。尽量写的高质量一点,从E开始。E-Don'tIsolateElements考虑dp,考虑如何设计状态。不难看出,每一行变两......
  • 简介(Beginning Visual C++ 2013)
    欢迎阅读IvorHorton的《VisualC++2013入门》。通过本书,您可以使用Microsoft最新的应用程序开发系统VisualStudioProfessional2013成为一名有效的C++程序员。我的目标......
  • 《Beginning Rust From Novice to Professional》---读书随记(借用与生命周期)
    BeginningRustFromNovicetoProfessionalAuthor:CarloMilanesi如果需要电子书的小伙伴,可以留下邮箱,看到了会发送的Chapter22BorrowingandLifetimesOwnersh......
  • 《Beginning Rust From Novice to Professional》---读书随记(移动语义和复制语义)
    BeginningRustFromNovicetoProfessionalAuthor:CarloMilanesi如果需要电子书的小伙伴,可以留下邮箱,看到了会发送的Chapter21Drops,Moves,andCopiesDeterm......
  • 《Beginning Rust From Novice to Professional》---读书随记(生命周期扩展)
    BeginningRustFromNovicetoProfessionalAuthor:CarloMilanesi如果需要电子书的小伙伴,可以留下邮箱,看到了会发送的Chapter23MoreAboutLifetimesLifetimeE......
  • 《BEGINNING RUST PROGRAMMING》---读书随记(1)
    BEGINNINGRUSTPROGRAMMINGAuthor:RicMessier如果需要电子书的小伙伴,可以留下邮箱,看到了会发送的Chpater1.GameofLife:TheBasics编写一个简单的游戏,首先是......
  • 《BEGINNING RUST PROGRAMMING》---读书随记(2)
    BEGINNINGRUSTPROGRAMMINGAuthor:RicMessier如果需要电子书的小伙伴,可以留下邮箱,看到了会发送的Chapter2ExtendedLifeUNDERSTANDINGOWNERSHIP首先需要解释R......