Submission #1198030

#TimeUsernameProblemLanguageResultExecution timeMemory
1198030Zero_OPBulldozer (JOI17_bulldozer)C++20
25 / 100
2092 ms584 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)
#define compact(v) v.erase(unique(all(v)), end(v))
#define sz(v) (int)v.size()
#define pb push_back
#define eb emplace_back

#define mp make_pair
#define mt make_tuple
#define ff first
#define ss second

#define dbg(x) "[" #x " = " << (x) << "]"

template<typename T>
      bool minimize(T& a, const T& b){
            if(a > b) return a = b, true;
            return false;
      }

template<typename T>
      bool maximize(T& a, const T& b){
            if(a < b) return a = b, true;
            return false;
      }

using ll = long long;
using db = double;
using ull = unsigned long long;
using ld = long double;

using pi = pair<int, int>;
using pl = pair<ll, ll>;

using vi = vector<int>;
using vl = vector<ll>;
using vc = vector<char>;
using vb = vector<bool>;
using vpi = vector<pi>;
using vpl = vector<pl>;

using vvi = vector<vl>;
using vvl = vector<vl>;

struct point{
      int x, y, c;
};

template<typename T>
ll max_subarray_sum(vector<pair<T, int>>& v){
      sort(all(v));
//      for(int i = 0; i < sz(v); ++i) cout << fixed << setprecision(4) << v[i].ff << " \n"[i == sz(v)-1];
//      for(int i = 0; i < sz(v); ++i) cout << v[i].ss << " \n"[i == sz(v)-1];
      ll best = 0, pref = 0, min_pref = 0;
      for(int i = 0; i < sz(v); ++i){
            pref += v[i].ss;
            while(i+1 < sz(v) && v[i].ff == v[i+1].ff){
                  ++i;
                  pref += v[i].ss;
            }

            maximize(best, pref - min_pref);
            minimize(min_pref, pref);
      }
//      cout << dbg(best) << '\n';
      return best;
}

int main(){
      ios_base::sync_with_stdio(0); cin.tie(0);

#ifdef LOCAL
      freopen("task.inp", "r", stdin);
      freopen("task.out", "w", stdout);;
#endif //LOCAL

      int N;
      cin >> N;
      vector<point> points(N);

      for(int i = 0; i < N; ++i){
            cin >> points[i].x >> points[i].y >> points[i].c;
      }

      ll ans = 0;
      vpi arx, ary;
      for(int i = 0; i < N; ++i){
            maximize(ans, (ll)points[i].c);
            arx.eb(points[i].x, points[i].c);
            ary.eb(points[i].y, points[i].c);
      }

      maximize(ans, max_subarray_sum(arx));
      maximize(ans, max_subarray_sum(ary));

      for(int i = 0; i < N; ++i){
            for(int j = i+1; j < N; ++j){
                  ll a = points[i].y - points[j].y;
                  ll b = points[i].x - points[j].x;
                  if(a == 0 || b == 0) continue;
                  //ax + by

                  vector<pair<ll, int>> ar, br;
                  for(int k = 0; k < N; ++k){
                        ar.eb(a * points[k].x + b * points[k].y, points[k].c);
                        br.eb(-b * points[k].x + a * points[k].y, points[k].c);
                  }

                  maximize(ans, max_subarray_sum(ar));
                  maximize(ans, max_subarray_sum(br));
//                  cout << '\n';
            }
      }

      cout << ans << '\n';

      return 0;
}
#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...