Submission #1078762

#TimeUsernameProblemLanguageResultExecution timeMemory
1078762qwerasdfzxclBulldozer (JOI17_bulldozer)C++17
100 / 100
664 ms17344 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

struct Node{
	ll prf, suf, sum, ans;
	Node(){}
	Node(ll x){
		if (x >= 0) prf = suf = sum = ans = x;
		else prf = suf = ans = 0, sum = x;
	}
	Node(ll _p, ll _s, ll _ss, ll _a): prf(_p), suf(_s), sum(_ss), ans(_a) {}

	Node operator + (const Node &N) const{
		return Node(max(prf, sum + N.prf), max(N.suf, suf + N.sum), sum + N.sum, max({ans, N.ans, suf + N.prf}));
	}
};

struct Seg{
	Node tree[4096];
	int sz, _n;

	void debug(){
		printf("A: ");
		for (int i=1;i<=_n;i++) printf("%lld ", tree[sz+i].sum);
		printf("\n");
		printf("ans = %lld\n", tree[1].ans);
		printf("\n");
	}

	void init(int n, array<int, 4> a[]){
		sz = 2048, _n = n;
		fill(tree, tree+sz*2, Node(0, 0, 0, 0));
		for (int i=1;i<=n;i++) tree[sz+i] = Node(a[i][2]);
		for (int i=sz-1;i;i--) tree[i] = tree[i<<1] + tree[i<<1|1];
	}

	void swap(int p, int q){
		p += sz, q += sz;
		std::swap(tree[p], tree[q]);
		for (p>>=1,q>>=1;p>0||q>0;p>>=1,q>>=1){
			tree[p] = tree[p<<1] + tree[p<<1|1];
			if (p!=q) tree[q] = tree[q<<1] + tree[q<<1|1];
		}
	}
}tree;

array<int, 4> a[2020];

int ccw(const array<int, 2> &P, const array<int, 2> &Q){
	ll ret = (ll)(a[P[1]][0] - a[P[0]][0]) * (a[Q[1]][1] - a[Q[0]][1]) - (ll)(a[P[1]][1] - a[P[0]][1]) * (a[Q[1]][0] - a[Q[0]][0]);
	if (ret > 0) return 1;
	if (ret < 0) return -1;
	return 0;
}

bool cmp(const array<int, 2> &P, const array<int, 2> &Q){
	int ret1 = ccw(P, Q);
	if (ret1) return ret1 > 0;
	return P < Q;
}

int main(){
	int n;
	scanf("%d", &n);

	for (int i=1;i<=n;i++){
		scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
	}

	sort(a+1, a+n+1);
	for (int i=1;i<=n;i++) a[i][3] = i; // ord

	vector<array<int, 2>> Ev;

	for (int i=1;i<=n;i++){
		for (int j=i+1;j<=n;j++){
			int ii = i, jj = j; // ii -> jj
			if ((a[i][0] < a[j][0]) || (a[i][0]==a[j][0] && a[i][1] < a[j][1])) swap(ii, jj);
			Ev.push_back({ii, jj});
		}
	}

	sort(Ev.begin(), Ev.end(), cmp);
	tree.init(n, a);
	ll ans = tree.tree[1].ans;

	for (int l=0,r;l<(int)Ev.size();l=r){
		for (r=l;r<(int)Ev.size() && !ccw(Ev[l], Ev[r]);r++);
		for (int i=l;i<r;i++){
			int &p = a[Ev[i][0]][3], &q = a[Ev[i][1]][3];
			assert(abs(p-q) == 1);
			
			tree.swap(p, q);
			swap(p, q);
		}

		ans = max(ans, tree.tree[1].ans);
	}

	printf("%lld\n", ans);
}

Compilation message (stderr)

bulldozer.cpp: In function 'int main()':
bulldozer.cpp:66:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
bulldozer.cpp:69:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |   scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...