社区讨论
求 HACK
CF1461F Mathematical Expression参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @logzbdvo
- 此快照首次捕获于
- 2023/11/02 17:23 2 年前
- 此快照最后确认于
- 2023/11/02 17:25 2 年前
模拟赛搬了这题,目前我的代码能通过学校 OJ 数据但无法通过原题数据,求能否给个 HACK 或指出错误,谢谢。
我的做法是判断区间所有大于 的数乘积是否超过区间长度的 倍,若超过则全取乘号(特判左右边界),否则爆搜。
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 条回复,欢迎继续交流。
正在加载回复...