社区讨论

60pts求调

P4342[IOI 1998] Polygon参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhjsxmam
此快照首次捕获于
2025/11/04 07:59
4 个月前
此快照最后确认于
2025/11/04 07:59
4 个月前
查看原帖
WA on #2 #5 code
CPP
#include <bits/stdc++.h>
#define int long long

using namespace std;
const int N = 110;
const int INF = 1e18;

int a[N], mx[N][N], vis[N][N], mn[N][N];
int n;
char s[N];
vector<int> res;

void dfs(int l, int r){
	if(vis[l][r]) return ;
	if(l == r){
		return mx[l][r] = mn[l][r] = a[l], void();	
	}
	vis[l][r] = 1;
	mx[l][r] = -INF;
	mn[l][r] = INF;
	for(int i = l; i < r; ++i){
		dfs(l, i), dfs(i + 1, r);
		if(s[i + 1] == 't'){
			mx[l][r] = max(mx[l][r], mx[l][i] + mx[i + 1][r]);
			mn[l][r] = min(mn[l][r], mn[l][i] + mn[i + 1][r]);
		}else{
			mx[l][r] = max(mx[l][r], max(mx[l][i] * mx[i + 1][r], mn[l][i] * mn[i + 1][r]));
			mx[l][r] = max(mx[l][r], max(mx[l][i] * mn[i + 1][r], mn[l][i] * mx[i + 1][r]));
			mn[l][r] = min(mn[l][r], min(mx[l][i] * mx[i + 1][r], mn[l][i] * mn[i + 1][r]));
			mn[l][r] = min(mn[l][r], min(mx[l][r] * mn[i + 1][r], mn[l][i] * mx[i + 1][r]));
		}
	}
}

signed main(){
	cin >> n;
	for(int i = 1; i <= n; ++i){
		cin >> s[i] >> a[i];
		s[n + i] = s[i], a[n + i] = a[i];	
	}
	dfs(1, n << 1);
	int ans = -INF;
	for(int i = 1; i <= n; ++i){
		if(mx[i][i + n - 1] > ans){
			ans = mx[i][i + n -1];
			res.resize(0);
		}
		if(mx[i][i + n -1] == ans)
			res.push_back(i);
	}
	cout << ans << '\n';
	for(auto x : res)
		cout << x << ' ';
	return 0;	
}

回复

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

正在加载回复...