# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1173045 | SpyrosAliv | 송신탑 (IOI22_towers) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll max_weights(int n, int m, vector<int> X, vector<int> Y, vector<int> W) {
ll tot = 0;
bool sub1 = true;
bool sub2 = true;
ll s1 = 0, s2 = 0;
for (int i = 0; i < m; i++) {
if (X[i] % 2) sub1 = false;
tot += W[i];
if (X[i] > 1) sub2 = false;
if (X[i] == 0) s1 += W[i];
else s2 += W[i];
}
if (sub1) return tot;
if (sub2) return max(s1, s2);
/*
vector<vector<int>> grid(n+1, vector<int>(n+1, 0));
for (int i = 0; i < m; i++) {
grid[Y[i]][X[i]] += W[i];
tot += W[i];
}
vector<vector<vector<vector<int>>>> dp(n+1, vector<vector<vector<int>>>(9, vector<vector<int>>(9, vector<int>(9, 0))));
vector<vector<vector<int>>> act(n+1, vector<vector<int>>(9, vector<int>(9, 0)));
for (int i = 1; i < n; i++) {
for (int j = 0; j < n; j++) {
grid[i][j] += grid[i-1][j];
}
}
int ans = 0;
for (int i = 1; i < n-1; i++) {
for (int cov = 0; cov <= n; cov++) {
for (int left = 0; left <= n; left++) {
for (int right = 0; right <= n; right++) {
int bon = 0;
if (max(left, right) > cov) {
bon = grid[max(left, right)][i];
if (cov > 0) bon -= grid[cov - 1][i];
}
dp[i][left][cov][right] = max(dp[i][left][cov][right], act[i - 1][left][cov] + bon);
act[i][cov][right] = max(act[i][cov][right], dp[i][left][cov][right]);
ans = max(ans, dp[i][left][cov][right]);
}
}
}
}
return ans;
for (int col = 1; col < n; col++) {
for (int cov = 0; cov <= n; cov++) {
for (int prev = 0; prev <= n; prev++) {
int extra = 0;
if (cov > prev) {
extra = grid[cov - 1][col - 1];
if (prev > 0) extra -= grid[prev - 1][col - 1];
}
else if (prev > cov) {
extra = grid[prev - 1][col];
if (cov > 0) extra -= grid[cov - 1][col];
}
dp[col][cov] = max(dp[col][cov], dp[col - 1][prev] + extra);
ans = max(ans, dp[col][cov]);
}
}
}
return ans;*/
}
/*
int main() {
cout << max_weights(5, 4, {0, 1, 4, 3}, {2, 1, 4, 3}, {5, 2, 1, 3}) << "\n";
}*/