Submission #1355494

#TimeUsernameProblemLanguageResultExecution timeMemory
1355494zitBigger segments (IZhO19_segments)C++20
73 / 100
1599 ms92844 KiB
/*__stO_stO_stO_stO_stO_stO_stO_zit_Orz_Orz_Orz_Orz_Orz_Orz_Orz__*/
		      #include<bits/stdc++.h>
			using namespace std;
			 #define name "zit"
	    using ll=long long;const ll MOD2=998244353; 
	    #define all(x,y) x.begin()+1, x.begin()+y+1
	    #define FOR(i,a,b) for(ll i=(a);i<=(b);++i)
	    using vl=vector<ll>; using pll=pair<ll,ll>;
	    const int maxn=5e5+1, MOD=1e9+7;// __   c:|
	    #define pb push_back// zit#6421  <(o )____|
	    const long long INF = 2e18;ll n;//(  ._> /|
	    #define All(x) x.begin(),x.end()/* `----'*/
#define stop assert(0||!(cerr<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"));
#define ok cerr << "if u see this line , then ur code worked orz\n"
#define debug(x) cerr<<#x<<" = "<<x<<'\n'
#define el cerr<<'\n'

#define irl ll id, ll l, ll r
struct Node {
	ll k, j;
	Node (ll k = 0, ll j = 0) : k (k), j (j) {}
	bool operator< (const Node & a) const {
		if (k < a.k) return 1;
		if (k > a.k) return 0;
		return j < a.j;
	}
};
Node operator + (Node & a, Node & b) {
	return max (a, b);
}
struct Seg {
	ll n; vector<Node> st, lazy;

	void build (irl, vector <pll> & a) {
		if (l == r) {st[id] = {a[l].first, a[l].second};return;}
		ll mid = l + r >> 1;
		build(id<<1,l,mid,a); build(id<<1|1,mid+1,r,a);
		st[id] = st[id<<1] + st[id<<1|1];
	} Seg (ll n, vector <pll> & a) : n(n) {st.resize(4 * n + 1); lazy.resize (4 * n + 1); build (1,1,n,a);}

	void down (irl) {
		Node val = lazy[id];
		lazy[id] = {0, 0};

		for (auto & c : {id << 1, id << 1 | 1}) {
			st[c] = max (st[c], val);
			lazy[c] = max (lazy[c], val);
		}
	}

	void upd_range (irl, ll u, ll v, Node val) {
		if (l > v || r < u) return;
		if (u <= l && r <= v) {
			st[id] = max (st[id], val);
			lazy[id] = max (lazy[id], val);
			return;
		} ll mid = l + r >> 1; down (id, l, r);
		upd_range (id << 1, l, mid, u, v, val); 
		upd_range (id << 1 | 1, mid + 1, r, u, v, val);
		st[id] = st[id << 1] + st[id << 1 | 1];
	} void upd_range (ll u, ll v, Node val) {upd_range (1,1,n,u,v,val);}

	Node get (irl, ll u, ll v) {
		if (l > v || r < u) return {0, 0};
		if (u <= l && r <= v) return st[id];
		ll mid = l + r >> 1; down (id, l, r);
		Node get1 = get (id<<1, l, mid, u, v);
		Node get2 = get (id<<1|1, mid + 1, r, u, v);
		return get1 + get2;
	} Node get (ll u, ll v) {return get(1,1,n,u,v);}
};

void sibidi () {             cin >> n;
	vl a (n + 1), pre (n + 1, 0);

	FOR (i,1,n) cin >> a[i];
// 	reverse (all (a, n));

	FOR (i,1,n) pre[i] = pre[i - 1] + a[i];
	FOR (i,1,n) cerr << pre[i] << " \n"[i==n];
	
	vector <pll> dp (n + 1, {0, 0});
	Seg seg (n, dp);
	
	FOR (i,0,n) {
		debug (i);

		Node val_dp = seg.get (i, i);
		debug (val_dp.k);
		debug (val_dp.j);
		ll x = 2 * pre[i] - pre[val_dp.j];
		debug (x);

		auto it = lower_bound (All (pre), 2 * pre[i] - pre[val_dp.j]);

		if (it == pre.end ()) continue;
		ll nxt = it - pre.begin ();
		debug (nxt);
		el;
		// cm dc nxt nam sau i
		seg.upd_range (nxt, n, Node (val_dp.k + 1, i));
	}

	cout << seg.get (n, n).k;
}                          signed main()                          {
		     if(fopen(name".inp","r"))
  {freopen(name".inp","r",stdin);freopen(name".out","w",stdout);}
  ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);ll _=1;
			      //cin>>_;
		   while(_--)sibidi();return 0;}

Compilation message (stderr)

segments.cpp: In function 'int main()':
segments.cpp:108:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |   {freopen(name".inp","r",stdin);freopen(name".out","w",stdout);}
      |    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
segments.cpp:108:41: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |   {freopen(name".inp","r",stdin);freopen(name".out","w",stdout);}
      |                                  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...