Submission #1276203

#TimeUsernameProblemLanguageResultExecution timeMemory
1276203Bui_Quoc_CuongFinancial Report (JOI21_financial)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=(int)b;i++)
#define FORD(i,a,b) for(int i=a;i>=(int)b;i--)
#define ll long long
#define fi first
#define se second
#define pb push_back
#define all(a) a.begin(),a.end()
#define BIT(mask,i) ((mask>>(i))&1)
#define MASK(a) (1LL<((a)))
#define uni(v) sort(all(v)); v.resize(unique(all(v)) - v.begin())
#define pii pair <int, int>
#define vi vector <int> 
#define vl vector <ll>
template <class A,class B>
bool maximize(A &a, const B b)
{
    if(a < b){ a = b; return 1;} return 0;
}
template <class A,class B>
bool minimize(A &a, const B b)
{
    if(a > b){ a = b; return 1;} return 0;
}
const int maxn = 3e5 + 5;
int n, d;
int a[maxn], dp[maxn];
namespace sub1
{
	void solve()
	{
		for(int i = 1; i <= n; i++)
		{
			int cur = 0;
			dp[i] = 1;
			for(int j = i - 1; j >= 1; j--)
			{
				if(a[j] > a[i]) cur++;
				else cur = 0;
				if(cur >= d) break;
				if(a[j] < a[i]) maximize(dp[i], dp[j] + 1);
			}
		}

		cout << *max_element(dp + 1, dp + 1 + n);
	}
}
namespace sub2
{	
	struct Node
	{
		int head, tail, len, max_len, max_pre, max_suf;
		Node()
		{
			head = tail = - 1;
			len = max_len = max_pre = max_suf = 0;
		}
		friend Node operator + (Node a, Node b)
		{
			Node ans;
			ans.len = a.len + b.len;
			ans.head = a.head;
			ans.tail = b.tail;
			ans.max_len = max(a.max_len, b.max_len);
			if(a.tail == b.head && a.tail == 1) ans.max_len = max(ans.max_len, a.max_suf + b.max_pre);
			ans.max_pre = a.max_pre;
			if(a.tail == b.head && a.tail == 1 && a.len == a.max_pre) ans.max_pre = a.len + b.max_pre;
			ans.max_suf = b.max_suf;
			if(a.tail == b.head && a.tail == 1 && b.len == b.max_suf) ans.max_suf = a.max_suf + b.len;
			return ans;
		}
	} st[4 * maxn];

	void build(int id, int l, int r)
	{
		if(l == r)
		{
			st[id].len = 1;
			st[id].head = st[id].tail = 1;
			st[id].max_pre = st[id].max_suf = st[id].max_len = 1;
			return;
		}
		int mid = (l + r) >> 1;
		build(id << 1, l, mid);
		build(id << 1 | 1, mid + 1, r);
		st[id] = st[id << 1] + st[id << 1 | 1];
	}

	void del(int pos)
	{
		int id = 1, l = 1, r = n;
		while(l < r)
		{
			int mid = (l + r) >> 1;
			if(pos <= mid) id = id << 1, r = mid;
			else id = id << 1 | 1, l = mid + 1;
		}
		st[id].max_pre = st[id].max_suf = st[id].max_len = st[id].head = st[id].tail = 0;
		while(id > 1)
		{
			id >>= 1;
			st[id] = st[id << 1] + st[id << 1 | 1];
		}
	}

	Node get(int id, int l, int r, int u, int v)
	{
		if(l > v || r < u) return Node();
		if(l >= u && r <= v) return st[id];
		int mid = (l + r) >> 1;
		return get(id << 1, l, mid, u, v) + get(id << 1 | 1, mid + 1, r, u, v);
	}

	int tree[4 * maxn];

	void update(int pos, int val)
	{
		int id = 1, l = 1, r = n;
		while(l < r)
		{
			int mid = (l + r) >> 1;
			if(pos <= mid) id = id << 1, r = mid;
			else id = id << 1 | 1, l = mid + 1;
		}
		tree[id] = val;
		while(id > 1)
		{
			id >>= 1;
			tree[id] = max(tree[id << 1], tree[id << 1 | 1]);
		}
	}

	int get_max_dp(int id, int l, int r, int u, int v)
	{
		if(l > v || r < u) return 0;
		if(l >= u && r <= v) return tree[id];
		int mid = (l + r) >> 1;
		return max(get_max_dp(id << 1, l, mid, u, v), get_max_dp(id << 1 | 1, mid + 1, r, u, v));
	}

	void solve()
	{
		vector <pii> zip_val;
		FOR(i, 1, n) zip_val.pb(make_pair(a[i], i));
		sort(all(zip_val));	

		build(1, 1, n);

		FOR(i, 0, zip_val.size() - 1)
		{
			int j = i;
			while(j <= (int)zip_val.size() - 1 && zip_val[j].first == zip_val[i].first) j++;
			j--;	
			FOR(it, i, j)
			{
				int id = zip_val[it].second;
				del(id);
			}	
			FOR(it, i, j)
			{
				int id = zip_val[it].second;
				int l = 1, r = id, pos = id;
				while(l <= r)
				{
					int mid = (l + r) >> 1;
					if(get(1, 1, n, mid, id).max_len < d) pos = mid, r = mid - 1;
					else l = mid + 1;
				}
				dp[id] = get_max_dp(1, 1, n, pos, id) + 1;
			}
			FOR(it, i, j)
			{
				int id = zip_val[it].second;
				update(id, dp[id]);
			}
			i = j;
		}

		cout << *max_element(dp + 1, dp + 1 + n);
	}
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);    
    #define kieuoanh "kieuoanh"
    if(fopen(kieuoanh".inp","r"))
    {
        freopen(kieuoanh".inp","r",stdin);
        freopen(kieuoanh".out","w",stdout);
    }
    cin >> n >> d;
    for(int i = 1; i <= n; i++) cin >> a[i];	
	vi values;
	for(int i = 1; i <= n; i++) values.pb(a[i]);
	uni(values);	
	for(int i = 1; i <= n; i++) a[i] = upper_bound(all(values), a[i]) - values.begin();

	return sub2::solve();
		
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:200:27: error: void value not ignored as it ought to be
  200 |         return sub2::solve();
      |                ~~~~~~~~~~~^~
Main.cpp:190:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  190 |         freopen(kieuoanh".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:191:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  191 |         freopen(kieuoanh".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~