제출 #1310983

#제출 시각아이디문제언어결과실행 시간메모리
1310983namhh별자리 3 (JOI20_constellation3)C++20
0 / 100
2 ms2104 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e3+5;
int n,m,a[N],pre[N][N],val[N],sum[N],check[N];
struct vang{
	int x,y,c;
};
vang cut[N];
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		for(int j = n; j >= n-a[i]+1; j--) pre[j][i] = 1;
	}
	cin >> m;
	for(int i = 1; i <= m; i++){
		cin >> cut[i].x >> cut[i].y >> cut[i].c;
		swap(cut[i].x,cut[i].y);
		cut[i].x = n-cut[i].x+1;
		val[i] = cut[i].c;
		pre[cut[i].x][cut[i].y] = 0;
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++) pre[i][j] += pre[i][j-1]+pre[i-1][j]-pre[i-1][j-1];
	}
	for(int i = 1; i <= m; i++){
		for(int j = 1; j <= m; j++){
			if(i != j){
				int x1 = min(cut[i].x,cut[j].x);
				int y1 = min(cut[i].y,cut[j].y);
				int x2 = max(cut[i].x,cut[j].x);
				int y2 = max(cut[i].y,cut[j].y);
				if(pre[x2][y2]-pre[x2][y1-1]-pre[x1-1][y2]+pre[x1-1][y1-1] == 0) sum[i] += val[j];
			}
		}
	}
	int ans = 0;
	while(true){
		int id = -1;
		int mx = -1e18;
		for(int i = 1; i <= m; i++){
			if(!check[i] && sum[i] != 0){
				if(mx < sum[i]){
					mx = sum[i];
					id = i;
				}
			}
		}
		if(id == -1) break;
		ans += val[id];
		check[id] = 1;
		for(int i = 1; i <= m; i++){
			if(!check[i] && i != id){
				int x1 = min(cut[i].x,cut[id].x);
				int y1 = min(cut[i].y,cut[id].y);
				int x2 = max(cut[i].x,cut[id].x);
				int y2 = max(cut[i].y,cut[id].y);
				if(pre[x2][y2]-pre[x2][y1-1]-pre[x1-1][y2]+pre[x1-1][y1-1] == 0) sum[i] -= val[id];
			}
		}
	}
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...