社区讨论

求 HACK

CF1461F Mathematical Expression参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@logzbdvo
此快照首次捕获于
2023/11/02 17:23
2 年前
此快照最后确认于
2023/11/02 17:25
2 年前
查看原帖
模拟赛搬了这题,目前我的代码能通过学校 OJ 数据但无法通过原题数据,求能否给个 HACK 或指出错误,谢谢。
我的做法是判断区间所有大于 11 的数乘积是否超过区间长度的 1010 倍,若超过则全取乘号(特判左右边界),否则爆搜。
CPP
#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
namespace IO {
	template<typename T = int>
	inline T rd() {
		char ch = getchar();
		T x = 0;
		bool C1 = 0;
		while (ch < '0' || ch > '9') C1 |= ch == '-', ch = getchar();
		while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
		return C1 ? ~(x - 1) : x;
	}
	template<typename T>
	inline void wr(T x) {
		if (x < 0) x = ~(x - 1), putchar('-');
		if (x > 9) wr(x / 10);
		putchar(x % 10 + '0');
	}
}
using namespace IO;
mt19937 mand(time(0));
const ll rwt = 1;
const double rwd = 1.0;
void cmx(int &x, int y);
void cmn(int &x, int y);
int imax(int x, int y);
int imin(int x, int y);
int iabs(int x);
int Mand(int x, int y);
/*int qpow(int x, int k);
void smd(int &x, int y);
void dmd(int &x, int y);
void pmd(int &x, int y);
int amd(int x, int y);
int mmd(int x, int y);*/
const int N = 1e5 + 5;
int s1[N], s2[N], DY[N], t, n, n2, len1, maxx, qj1, qj2;
char str1[N];
bool ans[N], lsxans[N], xans[N], vis[3];
void Solve();
void Solve1(int l, int r);
void DFS1(int dep, int st1, int st2);
signed main() {
	t = 1;
	while (t--) {
		Solve();
	}
	return 0;
}
void Solve() {
	n = rd();
	for (int i = 1; i <= n; i++) {
		s1[i] = rd();
	}
	scanf("%s", str1 + 1);
	len1 = strlen(str1 + 1);
	for (int i = 1; i <= len1; i++) {
		if (str1[i] == '+') {
			vis[0] = 1;
		} else if (str1[i] == '*') {
			vis[1] = 1;
		} else {
			vis[2] = 1;
		}
	}
	if (!vis[0] && !vis[1]) {
		for (int i = 1; i < n; i++) {
			wr(s1[i]), putchar('-');
		}
		wr(s1[n]), putchar('\n');
		return;
	} else if (!vis[0]) {
		if (!vis[2]) {
			for (int i = 1; i < n; i++) {
				wr(s1[i]), putchar('*');
			}
			wr(s1[n]), putchar('\n');
			return;
		} else {
			wr(s1[1]);
			for (int i = 2; i <= n; i++) {
				if (s1[i] == 0) {
					putchar('-');
				} else {
					putchar('*');
				}
				wr(s1[i]);
			}
			putchar('\n');
			return;
		}
	} else if (!vis[1]) {
		for (int i = 1; i < n; i++) {
			wr(s1[i]), putchar('+');
		}
		wr(s1[n]), putchar('\n');
		return;
	}
	memset(ans, 0, sizeof(ans));
	int l = 1, r;
	while (l <= n) {
		if (s1[l] == 0) {
			l++;
			continue;
		}
		r = l;
		while (r < n && s1[r + 1] > 0) {
			r++;
		}
		Solve1(l, r);
		l = r + 1;
	}
	for (int i = 1; i < n; i++) {
		wr(s1[i]);
		if (ans[i]) {
			putchar('*');
		} else {
			putchar('+');
		}
	}
	wr(s1[n]), putchar('\n');
	return;
}
void Solve1(int l, int r) {
	if (s1[l] == 1) {
		while (l <= r && s1[l] == 1) {
			ans[l] = 0;
			l++;
		}
	}
	ans[r] = 0;
	if (s1[r] == 1) {
		while (l <= r && s1[r] == 1) {
			ans[r - 1] = 0;
			r--;
		}
	}
	int T1 = 1, T2;
	for (int i = l; i <= r; i++) {
		T1 *= s1[i];
		if (T1 > (r - l + 1) * 10) {
			break;
		}
	}
	if (T1 > (r - l + 1) * 10) {
		for (int i = l; i < r; i++) {
			ans[i] = 1;
		}
		ans[r] = 0;
		return;
	}
	n2 = 0;
	if (l > r) {
		return;
	}
	for (int i = l; i <= r; i++) {
		if (s1[i] == 1) {
			T1 = i, T2 = 1;
			while (T1 < r && s1[T1 + 1] == 1) {
				T1++;
				T2++;
			}
			s2[++n2] = -T2;
			DY[n2] = T1;
			i = T1;
			continue;
		}
		T1 = i;
		T2 = s1[i];
		while (T1 < r && s1[T1 + 1] > 1) {
			ans[T1] = 1;
			T1++;
			T2 *= s1[T1];
		}
		s2[++n2] = T2;
		DY[n2] = T1;
		i = T1;
	}
	maxx = 0;
	qj1 = l, qj2 = r;
	//for (int i = 1; i <= n2; i++) {
	//	printf("	qzz0	%d\n", s2[i]);
	//}
	DFS1(1, 0, s2[1]);
	DY[0] = l - 1;
	for (int i = 1; i < n2; i++) {
		//printf("	qzz1	%d\n", xans[i]);
		for (int j = DY[i - 1] + 1; j <= DY[i]; j++) {
			ans[j] = xans[i];
		}
	}
	ans[r] = 0;
	return;
}
void DFS1(int dep, int st1, int st2) {
	if (dep == n2) {
		if (st1 + st2 > maxx) {
			maxx = st1 + st2;
			for (int i = 1; i < n2; i++) {
				xans[i] = lsxans[i];
			}
		}
		return;
	}
	lsxans[dep] = 0;
	if (s2[dep + 1] < 0) {
		DFS1(dep + 1, st1 + st2 - s2[dep + 1], 0);
	} else {
		DFS1(dep + 1, st1 + st2, s2[dep + 1]);
	}
	lsxans[dep] = 1;
	if (s2[dep + 1] < 0) {
		DFS1(dep + 1, st1, st2);
	} else {
		DFS1(dep + 1, st1, imax(st2, 1) * s2[dep + 1]);
	}
	return;
}
void cmx(int &x, int y) {
	x = (y > x ? y : x);
	return;
}
void cmn(int &x, int y) {
	x = (y < x ? y : x);
	return;
}
int imax(int x, int y) {
	return (x < y ? y : x);
}
int imin(int x, int y) {
	return (x < y ? x : y);
}
int iabs(int x) {
	return (x < 0 ? -x : x);
}
int Mand(int x, int y) {
	return (mand() % (y - x + 1) + (y - x + 1)) % (y - x + 1) + x;
}
/*int qpow(int x, int k) {
	int Ans = 1;
	for (int i = k; i; i >>= 1, pmd(x, x)) {
		if (i & 1) {
			pmd(Ans, x);
		}
	}
	return Ans;
}
void smd(int &x, int y) {
	x = (x + y >= mod ? x + y - mod : x + y);
	return;
}
void dmd(int &x, int y) {
	x = (x - y < 0 ? x - y + mod : x - y);
	return;
}
void pmd(int &x, int y) {
	x = rwt * x * y % mod;
	return;
}
int amd(int x, int y) {
	return (x + y >= mod ? x + y - mod : x + y);
}
int mmd(int x, int y) {
	return (x - y < 0 ? x - y + mod : x - y);
}*/

回复

0 条回复,欢迎继续交流。

正在加载回复...