Submission #1354268

#TimeUsernameProblemLanguageResultExecution timeMemory
1354268thuhienneTransport (COCI19_transport)C++20
0 / 100
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

#define re exit(0);

const int maxn = 100009;
const int LOG = 16;

int n,arr[maxn];
int u[maxn],v[maxn],w[maxn];

ll sum[maxn],sparse[maxn][LOG + 1];
ll res;

bool check(int l,int r) {
	int i = __lg(r - l + 1);
	ll tmp = min(sparse[l][i],sparse[r - (1 << i) + 1][i]);
	
	return tmp - sum[l - 1] >= 0;
	
}

void dnc(int l,int r) {
	if (l == r) {
		res += (sum[l] - sum[l - 1]) >= 0;
		return;
	}
	
	int mid = (l + r) >> 1;
	dnc(l,mid);
	dnc(mid + 1,r);
	
	vector <ll> storing;
	for (int i = mid;i >= l;i--) if (check(i,mid)) {
		storing.push_back(sum[mid] - sum[i - 1]);
	}

	sort(storing.begin(),storing.end());
	
	ll need = 0,currsum = 0;
	for (int i = mid + 1;i <= r;i++) {
		currsum += sum[i] - sum[i - 1];
		
		if (currsum < 0) {
			need += abs(currsum);
			currsum = 0;
		}
		
		res += storing.end() - lower_bound(storing.begin(),storing.end(),need);
		
	}
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(nullptr);
//  freopen(".inp","r",stdin);
//  freopen(".out","w",stdout);

	cin >> n;
	
	if (n == 1) {
		cout << 0;
		return 0;
	}
	
	for (int i = 1;i <= n;i++) {
		cin >> arr[i];
	}
	for (int i = 1;i < n;i++) {
		cin >> u[i] >> v[i] >> w[i];
	}
	
	//u -> v
	for (int i = 1;i <= n;i++) {
		sum[i] = arr[i];
	}
	for (int i = 1;i < n;i++) {
		sum[min(u[i],v[i])] -= w[i];
	}
	for (int i = 1;i <= n;i++) {
		sum[i] += sum[i - 1];
		sparse[i][0] = sum[i];
	}
	for (int j = 1;j <= LOG;j++) {
		for (int i = 1;i + (1 << j) - 1 <= n;i++) {
			sparse[i][j] = min(sparse[i][j - 1],sparse[i + (1 << (j - 1))][j - 1]);
		}
	}
	
	dnc(1,n - 1);
	
	//v -> u
	for (int i = 1;i <= n;i++) {
		sum[i] = arr[i];
	}
	for (int i = 1;i < n;i++) {
		sum[max(u[i],v[i])] -= w[i];
	}
	
	reverse(sum + 1,sum + 1 + n);
	
	for (int i = 1;i <= n;i++) {
		
		sum[i] += sum[i - 1];
		sparse[i][0] = sum[i];
		
	}
	for (int j = 1;j <= LOG;j++) {
		for (int i = 1;i + (1 << j) - 1 <= n;i++) {
			sparse[i][j] = min(sparse[i][j - 1],sparse[i + (1 << (j - 1))][j - 1]);
		}
	}

	dnc(1,n - 1);

	cout << res;

}

#Verdict Execution timeMemoryGrader output
Fetching results...